OmniAICreator/Qiita-1.07M huggingface dataset:
Media Queries 備忘録


##横幅380px以下

```css
@media screen and (max-width: 380px) {
  #test {
    display: none;
  }
}
```

##横幅380px以上、かつ高さ750px以下
**andでつなぐことで、AND条件設定**

```css
@media screen and (min-width: 380px) and (max-height: 750px) {
  #test {
    display: none;
  }
}
```
##印刷画面、または横幅300px以上
**カンマでつなぐことで、OR条件設定**

```css
@media print, screen and (min-width: 300px) {
  #test {
    display: none;
  }
}
```

##横画面、かつ横幅750px以上850px以下、かつ高さ350px以上380px以下
**横画面の場合、横にした状態が基準で横幅と高さが認識される**

```css
@media screen and (orientation: landscape) and (min-width: 750px) and (max-width: 850px) and (min-height: 350px) and (max-height: 380px) {
  #test {
    display: none;
  }
}
```
numpy.padについて

```python:numpy.py
import numpy as np 
img=np.asarray([[1,2,3],[4,5,6],[7,8,9]])
print(np.pad(img,((0,0),(1,1)),'constant',constant_values=0))
print(np.pad(img,((1,1),(0,0)),'constant',constant_values=0))
print(np.pad(img,1,'constant',constant_values=0))
```

実行結果

```
[[0 1 2 3 0]
 [0 4 5 6 0]
 [0 7 8 9 0]]
[[0 0 0]
 [1 2 3]
 [4 5 6]
 [7 8 9]
 [0 0 0]]
[[0 0 0 0 0]
 [0 1 2 3 0]
 [0 4 5 6 0]
 [0 7 8 9 0]
 [0 0 0 0 0]]
```
VirtualBoxにUbuntuをインストール

4/26授業用メモ
#Ubuntuのインストール
Win10上にVirtualBoxをインストールし、そこにUbuntuをインストールしました。
2年次に少し触れていた程度なのでいい勉強になりました
次にUbuntuのISOイメージをダウンロード
#VirtualBox仮想HD作成
VirtualBoxを起動し初期設定をする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249275/22add02a-324e-86ee-6627-e33682e15f2e.png)
新規作成から仮想マシンの作成、名前を入力し、バージョンはUbuntu(64-bit)を指定
C#基本文法

4/25授業用メモ
#C#の基本 Program.csとは
C#のソースコードファイルでここを書き換えることで動かしていく
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249275/0c9bae25-7249-73bf-4e17-efbd75f9ba1b.png)
まずは実際に動かしてみた
メインのstatic void Main(string[] args)のカッコ内に記述していく
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249275/e5aec6ca-9512-8a86-1296-151493370434.png)
上の開始ボタン(F5でも実行可能)
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249275/06352894-4632-6e3f-0f3d-21063dc1658a.png)
Helloと表示されたら成功です

#Consoleとは(教科書参照)
Consoleは「クラス」の一つです。これは、コマンドプロンプトのウィンドウとの
やりとりに関する機能をまとめたクラスです
Window10アップロード後画面が真っ黒になった際の処理

https://www.pasoble.jp/windows/10/signin-gamen-kuroi.html

グラフィックドライバーをリセット？
キーボートの操作でグラフィックドライバーをリセットする方法「Win+Ctrl＋Shift＋B」で、画面が真っ暗になった時に試してみ。これで画面が表示できれば苦労しないで済みますね。

で直ったっ

初めて知りましたっ＼(^o^)／
SES つかって ruby でメール送信する

```ruby
require 'mail'

Mail.defaults do
  delivery_method :smtp,
                  address: 'email-smtp.us-east-1.amazonaws.com',
                  port: 587,
                  user_name: '****',
                  password: '****'
end
Mail.new do
  from 'no-reply@example.com'
  to 'mochizuki@example.com'
  subject 'test mail'
end.deliver!
```
AzureContainerRegistryにprivateイメージをpushしよう

# はじめに

AKSを始める前にAzureContainerRegistryに登録するところから始めてみます。
docker loginするときのUsernameとPasswordの取り方だけ変わっていますが、他はどのサービスも同じですね。

# レジストリを作成する

uzresk0626というレジストリ名で登録してみます。
レジストリ名は.azurecr.ioのサブドメインで作られるようなのでドメイン内で重複してはいけないようです。

SKUはAzureで良く出てくる単語ですがエディションみたいなものです。
SKUに関しては[Azure Container Registry SKU](https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-skus)を参照

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57686/32596f9a-0137-f8f8-f78d-f7cd186f8d3e.png)

# アクセスキーを取ります

管理者ユーザの部分を「有効にする」をクリックするとパスワードが表示されます

「ログインサーバ」「ユーザ名」「password」はdocker login時に利用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57686/57d264d1-99e3-493c-7295-60359b9674d2.png)

# docker loginして、pushしてみる

先ほど取得した情報を使ってdocker loginしてみます。

```
[root@ip-10-0-1-100 ec2-user]# docker login uzresk0626.azurecr.io
Username: uzresk0626
Password:
Login Succeeded
```

push先は（ログインサーバ）/（レジストリ名）:（タグ名）ですので早速pushしてみましょう。

```
[root@ip-10-0-1-100 ec2-user]# docker push uzresk0626.azurecr.io/uzresk0626:3.4.4
The push refers to a repository [uzresk0626.azurecr.io/uzresk0626]
09db78b55cbe: Pushed
```

# リポジトリを確認する

確かに登録されていますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57686/3470916b-05c2-0cc2-7e90-7000b9093118.png)
React基本情報＋メリット

#概要
Reactとは何か。また、使用することにどんな利点があるのかまとめました。

#Reactとは？
Reactに関しての基本情報を箇条書きで書きます。

- ReactはFacebookによって2013年にリリースされたオープンソースのJavaScriptライブラリである。（AngularなどのJSフレームワークに対して、Reacはあくまでもライブラリであり、他のフレームワークとの併用も容易である。）
- MVCのVの実装に特化したライブラリである。
- Facebook, Instagram, Airbnb, Netflixなど名だたる会社がサービスの向上の為に取り入れている。

【参考】
[10 Famous Apps Using ReactJS Nowadays](https://brainhub.eu/blog/10-famous-apps-using-reactjs-nowadays/)
#使用する利点
ではなぜReactはここまでの人気を集めているのでしょうか？Reactを利用することのメリットをいくつか挙げます。

###1.学習・利用が容易である
まず、豊富な無料の学習リソースがでネット上に揃っており学習が非常に容易です（例：[ Doucumentstion](https://reactjs.org/docs/hello-world.html),[Turtorial](https://reactjs.org/tutorial/tutorial.html))。また、ReactはViewの実装に特化したライブラリなので覚える用語やルールが少なく簡単に利用することができます。

###2.コンポーネント指向
コンポーネント思考のView実装により以下のことを実現しています。

- 親コンポーネントで一気に状態管理を行うので細かい状態管理が不要。
- コンポーネントは再利用可能であり、アプリ開発、また開発後の保守を容易にする。
- データの流れが１方向的であり、流れの理解が容易。

###3.Virtual DOMによるレンダリング効率の向上
Jquery等を利用してアプリを作成する際には１つの動きを変更するだけで、アプリ機能、またUI全体に影響する恐れがあり、アプリ全体の構造を把握し注意深くコードする必要がありました。
しかし、Reactでは従来のようにDOMを直接操作するのではなくメモリ上にDOMと同じ構造の仮想DOM（Virtual DOM)を作成します。これによって、Viewの状態変化を検知すると状態変化前後のVirtual DOMを比較し、その差分をパッチとしてオリジナルのDOMに当てることで効率的なレンダリングを実現しています。

【参考】
[The Top 5 Benefits of React that Make Life Better](https://www.telerik.com/blogs/5-benefits-of-reactjs-to-brighten-a-cloudy-day)
[なぜ仮想DOMという概念が俺達の魂を震えさせるのか](https://qiita.com/mizchi/items/4d25bc26def1719d52e6)
pyMaxflow使い方

## install
```
pip install pyMaxflow 
```
## グラフの作り方
```python:sample.py
# グラフの定義
g=maxflow.Graph[int]() # or g=maxflow.Graph[float]()
# ノードを格子状に追加
nodeids = g.add_grid_nodes((5, 5))

structure = np.array([[np.inf, 0, 0],
                      [np.inf, 0, 0],
                      [np.inf, 0, 0]
                      ])
# edgeをstructure指定した構造に
g.add_grid_edges(nodeids, structure=structure, symmetric=False)
# weight edgeの重みを定義
weights = np.array([[100, 110, 120, 130, 140]]).T + np.array([0, 2, 4, 6, 8])
# edgeを伸ばす方向を決める
structure = np.zeros((3, 3))
structure[1, 2] = 1
# structureで指定した方向にweightの重みでedgeを伸ばす
g.add_grid_edges(nodeids, structure=structure, weights=weights, symmetric=False)

structure = np.zeros((3, 3))
structure[0, 1] = 1
g.add_grid_edges(nodeids, structure=structure, weights=weights + 100, symmetric=False)

structure = np.zeros((3, 3))
structure[2, 1] = 1
g.add_grid_edges(nodeids, structure=structure, weights=weights + 200, symmetric=False)

left = nodeids[:, 0]
# sからleftで指定したノードに
g.add_grid_tedges(left, np.inf, 0)
right = nodeids[:, -1]

g.add_grid_tedges(right, 0, np.inf)
```
可視化

```python:view.py
def plot_graph(nxgraph):
    X, Y = np.mgrid[:5, :5]
    aux = np.array([Y.ravel(), X[::-1].ravel()]).T
    positions = {i: aux[i] for i in range(25)}
    positions['s'] = (-1, 2)
    positions['t'] = (5, 2)

    # nxgraph.remove_nodes_from(['s', 't'])
    edge_labels = {}
    for u, v, d in nxgraph.edges(data=True):
        edge_labels[(u, v)] = d['weight']
    plt.clf()
    nx.draw(nxgraph, pos=positions)
    nx.draw_networkx_edge_labels(nxgraph, pos=positions, edge_labels=edge_labels, label_pos=0.3, font_size=7)
    plt.axis('equal')
    plt.show()


nxg = g.get_nx_graph()
plot_graph(nxg)
```

![F.png](https://qiita-image-store.s3.amazonaws.com/0/266765/a6a87e1a-4693-163d-51fa-682ada049a76.png)

詳しくは動作させながらだと分かりやすいです。
社内犯罪ニュースｗ

※記載内容はメモとして作成しているため、修正が必要な部分があるかもしれません。

####**社内でよくみかける犯罪をメモします**

①自席PCのデスクトップ画面の監視情報漏れ

さて、有名なフリーソフト監視ツールに

今何してますか？ｗ　というソフトがあります。
検索すればすぐに出てきます。
どういうソフトか？

あなたのPCがまるまる監視会社に写され、また操作できるツールです。

なんとこの監視ツールを悪用する人がいるんですね～
みなさん働くときは注意しましょう。

さて、どんな犯罪があるのか？
・入場すると緊急連絡先などとして携帯電話の番号を記入したりします。
　なんとその情報を盗み見て漏えいするんですね～

　その情報をどうするか。。。。。。
　携帯電話の番号は貴重です。NSAじゃないですけど、社内の電波を拾って
　通話や通信の状態を知ることは簡単なのです。
　とあるデータセンターでは妨害電波が貼られているところもあるくらい、
　携帯電話の電波違法受信は多いんですね～☆
　データセンターに電話するとノイズの多い場所とか経験したことあるでし
　ょう。あれは電波漏えいを防ぐ妨害電波が設置されているのです。

・携帯電話会社によってはサポートツールで遠隔操作ができるシステムを
　準備しているところがあります。
　電話すれば設定を代行してくれたりするんですね～。
　これらに使用されたりすることもあるそうです！！
　組織超えの内部犯罪ですね！！

・監視ツールで直接文書改ざんを実施している人も確認されています。
　ファイルやフォルダ改ざんを実施する悪意ある従業員もいますので、
　混乱しないように気を付けてください。

②個人自宅通信監視

これはあまり知られていませんが、自宅通信の監視を公式に実施すること
が可能です。
「通信の秘密」は義務教育で習います。
しかしこれが侵害される場合があるのです。
特例なのかどうかはわかりませんが、金融機関系では必ずマークされます。
インサイダーなどを防ぐためでしょう。

さて、この監視システムが何に悪用されるか。
・どこかの会社では毎日履歴情報を見ていことを確認しました。
　ときには、弱みを握り、内容を漏えいすることも実施されています。
　これは犯罪ですけど放置されています。脅迫罪ですね。
　しかし、社内の人事はチェックしているとの噂です。
　解雇対象になる人材の犯罪なのです。
　被害にあった人は相談しましょう。

③パケットキャプチャ―ツールを使用したモニタリング

さて、この監視システムは何に悪用されるか。
・個人携帯電話の盗聴を試みる犯罪者がいます。
　店舗で準備されているwifiなどに自動接続していると、勝手にモニタリング
　しようとしてきます。
　簡単な犯罪なので、犯罪を実施する人が多いみたいですね～
　システム会社の会社員が面白半分に実施しています。

　この犯罪は社内の人だけではなく、プロの窃盗集団も実施しています。
　よくニュースになっていますね～

システム監視のネットワークを使ったり、そもそもシステム担当者がメール改ざんを実施するなどの犯罪もあります。

まー全部犯罪なんですが、プロの窃盗団と同じレベルの犯罪を従業員が実施しているんですね。どっちも交じっているみたいです。社内犯罪多いですよ！！
プロの窃盗団はちなみにアジア暴力団が多いです。
中国では漏えい情報が億単位で売れるそうです。
効率化とは？真の「効率化」を実現する方法とは

最近考えることがあったので備忘録としてまとめておきます。
そして、まとめることでなにか整理できたらな、的な投稿です。

結論から言うと。

```本記事.結論
何のための効率化かを忘れたり、期待とずれた効率化が目的化すると危険
ルールに縛られてアップデートがきかない状態は中長期的に見れば衰退である
結局、「何故」効率化するのかを常に意識し
ゴールを目指し、その時最も効率的な手法を追い求め続け実現することに価値がある
```

## **「効率さ」がもたらすものとは？**

企業に入ると少なからず`効率`というワードができくると思います。
もちろん学生時代からもあったと思いますが期待される度合いは一気に跳ね上がる気がする

- 売上を効率的に上げるとか
- CPUリソースの使い方が効率が悪いとか
- そもそもこの処理無駄だよね？みたいな
- その仕事の進め方効率悪いよねとか

では`効率`ってなんだろう？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/41516/9fa10d51-ff60-cf3f-0652-355158d9ccec.png)

そう、そのまんま。
なにかを成すのに無駄がないこと。


## **効率化で陥りがちな落とし穴**

効率をもとめたはずなのに「非効率！」って思ったことありませんか？

- 私は効率的だと思っていたのにレビューで非効率さが指摘された
- マニュアルに従い効率的に仕事しているつもりなのに融通効かないと言われる
- その手順は何故そうなっているのかわからない
- 手順どおりに事が運ばない事が多い

ある意味では無駄がない状態であり効率という状態とも言えるけど、なんか違う。
効率的と決めたことを遂行しているのになぜか違う意見がでてくる。
こういった状態を生み出す背景にはだいたい<font color="Salmon">**期待値とのズレ**</font>があります。
もっと突き詰めると、

1. <font color="Salmon">**ゴールが「どこで」「どういう状態なのか？」をどう認識しているか**</font>
1. <font color="Salmon">**ゴールへ向かう「最良の手段」の最適化**</font>
1. <font color="Salmon">**効率化手段の「実行確実性」と「スピード感」と「品質」の乖離**</font>

この辺が期待値とずれている事が多いと思います。
ゴールがずれていると、そもそも期待する状態になりません。
最良の手段は時代とともに変わります。
その効率化手段が古く最良ではない場合かつ、より最良な手段を知る人からすると期待ハズレ感を感じます
そして、手段の確実性や、スピード、品質が欠如もやはり期待値とずれます
主に、納期的なリスクや、期待した品質でないということで非効率となります。

まあ、ゴールがいつのまにかすり替わってしまうとか、誤解しちゃうことよくあると思うんです。
<font color="Salmon">人間って夢中になっちゃうとか集中しちゃうとそう思っちゃうんですよねｗ</font>
他にも要因がありそう。

## **真に求める効率からずれる要因**

落とし穴について書きましたが、何故期待値とのズレが生まれるのか？についての考察です。

- **期待値（ゴール）がわからない、もしくはそもそも間違えている**
    - ゴールも変化する事を理解する必要がある！
    - 企業や事業戦略によって変わることを理解できいないと時間経過とともにずれることも
- **期待値（ゴール）と実値をモニタリングできておらず現実が見えてない**
    - 指標おいて見えないと今我々はどこにいてどういう状態か把握難しい
    - 加えて、競合との関係もウォッチしてバランスとらないと負けちゃう可能性もある
- **最良の手法について理解できていない、もしくは決められない**
    - 最良の手法も時代とともに変化する事を理解する
    - 最良の手法も一つとは限らない、複数ある中でどれを選ぶか？の決め方にも透明性が必要
- **ゴールや手法には問題ないが確実に遂行ができない何らかの理由がある（リソース、人）**
    - 人出がないのでこなせないので最低限だけになるとか
    - 実施する人のマインドや姿勢面の課題（オペレータ志向とか）

## **人の成長を阻害する可能性にもなる**

一つやっかいな事があります。それは、
<font color="Salmon">がんばっても期待値とずれた結果となり、モチベーションに影響することです</font>

誤った効率を追い求める側人は、一生懸命がんばりちゃんと守るべきものを守りやりきる
やりきり結果を出すが、認められない状況となる
なんで、ちゃんとやっているのに認められない？であれば効率化そのものに意味がないのでは？
こうなると「効率化」自体に懐疑的になる可能性もあり、そもそものモチベーションが下がります

## **どうすればよいのか？**

あたりまえのことだけど、シンプルに以下を実践する

- 効率化の目的とスコープ、達成したい状態を明確化し目標にする -> ゴール、目標
- 目標を達成する最良の手段の検討と決め方を決める -> 戦略化
- 戦略を実行するための体制確保と確実に遂行する方法を決め実践
- 目標や戦略を定期的にアップデートできる仕組みをちゃんと回し続ける
- 目標に対して現状どういう状態か指標を見つつ把握、改善できる状態にする
- 想いがある人が推進する事（好きとかやりたいって気持ちがある人が一番！）

なんていうか、最終的に基本的なことに帰結したまとめなんですが、
結構大切そうなことは、**灯台が照らす先**と、**船頭の能力**と、**より良くするぞという気持ち**かな

我々の仕事って真っ暗な海を進むのと同じで、見えない事が多いので
その暗闇の中で、目指す先を照らす灯台の光と、
そこへ向かう途中は海もあれているかもしれないし、岩に乗り上げる可能性もある、
そんな不確定な海を確実に灯台の光の場所へ行き着く船頭さんの技術と能力
そして、照らす先も状況によって変わるし、荒海を乗り越える技術も日々進化するので
今、一番良い状態を目指し続けるぞって気持ちがあること。

これが、真の効率化を実現するために必要なことだと思います。
まあ、これは実績ではなく、これから↑をもとに改善進めてみようと思っている宣言です。

↑のどれかがかけた効率化は違和感や不協和音を生むかもなと思ったので、参考になれば。
ビルド環境によるApp Groupsを変更する設定方法

ビルド環境によって設定値を変えないといけ場合、```build Settings ``` で定義しておくのを一般的なやり方だと思います。
記事ではApp Group設定について書いていますが、それだけではなく、他の場面でも使えるのでメモします。

## 1. build Settingsへ定義
各ビルド環境ことに定義しておく

![スクリーンショット 2018-06-26 15.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/32323/8761331a-5942-6662-5183-d4a4cf7d32c0.png)


## 2. xxxx.entitlements に定義を1.で定義した変数に変更

![スクリーンショット 2018-06-26 15.33.56.png](https://qiita-image-store.s3.amazonaws.com/0/32323/d5be1a39-1af1-2c67-ff68-873c22c36d91.png)


## 3. Capabilitiesで定義した変数が表示されればOK
![スクリーンショット 2018-06-26 15.42.40.png](https://qiita-image-store.s3.amazonaws.com/0/32323/cd4c29f8-3420-1a07-3df5-d5e1ab48ae47.png)
セキュリティにも機械学習、AIの知識は必要

セキュリティについて色々と調べていると、最近思うことがあります。

それは「セキュリティにも機械学習、AIの知識は必要」ということ


特に開発系の場合は利用する場面が多いようです。


自動で検知するものにはより精度を上げるため、機械学習の機能を備えていると気が付きました。



セキュリティエンジニアを目指されている方であれば、進む先によっては必要になってくることもあるので、今から勉強しておけば強くなれそうですね。


私はインフラ勉強会で講演があるのでそこで概要やイメージをつかむことからはじめようかな。



以上
Twitter UserStreamの代用品メモ for Python

# はじめに
わたしは趣味で秒速でレスを返すTwitter botを作っているのですが、TwitterがUserStream APIを廃止するようなので困りました。他のタイムライン取得APIである`statuses/home_timeline`では現時点 (2018/06/26) では1分に1回しか許可されていないからです。そこで `statuses/filter.json` という別のストリーミングAPIを利用したUserStreamの代替となるコードを書きました。こちらのAPIはdepricatedにはならないそうです。

※ただし`statuses/filter.json`は、非公開アカウント (鍵垢) のツイートは受信できないので注意！ 非公開アカウントのツイートも取得したい場合は`statuses/home_timeline` APIと組み合わせるなりしましょう。

# UserStream代用品コード
## Requirement

```
pip install twitter
```

※`python-twitter`ではないので注意！

## コード
```py
import twitter

SCREEN_NAME = 'write here'

# OAuth
ACCESS_TOKEN_KEY = 'write here'
ACCESS_TOKEN_SECRET = 'write here'
CONSUMER_KEY = 'write here'
CONSUMER_SECRET = 'write here'

oauth = twitter.OAuth(ACCESS_TOKEN_KEY,
                      ACCESS_TOKEN_SECRET,
                      CONSUMER_KEY,
                      CONSUMER_SECRET)

# Retrieve friends IDs
twitter_api = twitter.Twitter(auth=oauth)
friends = twitter_api.friends.ids(screen_name=SCREEN_NAME, count=5000)
friends_ids = ','.join(map(str, friends['ids']))

stream = twitter.TwitterStream(auth=oauth, secure=True)
for tweet in stream.statuses.filter(follow=friends_ids):
    if 'user' in tweet and tweet['user']['id'] in friends['ids']:
        print(tweet['user']['screen_name'], tweet['text'])

```
※そのままでは自分のフォロイーでないユーザーがフォロイーに対して投げたリプライやRTも受信してしまうので `tweet['user']['id'] in friends['ids']` のように条件をつけてフォロイー以外は除外するようにしました。

# 参考
- http://cucmberium.hatenablog.com/entry/twitter-userstream
Ubuntu環境でRabbitMQ が Erlang 21に対応してない今この瞬間の対処法

RabbitMQ 3.7.5 をUbuntu 16.04 にインストールしようとしてハマりました。１ヶ月ほど前は何の問題もなくインストールできていたので、ちょっと悩みました。1ヶ月後には不要なネタかも知れません。

メモがわりにやったことを書いてます。

## 症状

rabbitmq-server は、インストールできているのだけど、 `sudo rabbitmqctl status` を実行してもエラーになってしまう。

## 調査

そういえば、ちょっと前に Erlang 21.0 が公開されてたなと思い、ちゃんと動作している環境と、動作していない環境で、Erlang のバージョンを比較してみたら、バージョンが違ってました

```shell-session:動く環境
$ erl +V
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 9.3
```

```shell-session:駄目な方
$ erl +V
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 10.0
```

これかと思って調べてみたら、 [公式サイトにErlang21はサポート対象外](https://www.rabbitmq.com/which-erlang.html#unsupported%20versionsu) と書いてありました。

## 対策

Erlang 21.0 をアンインストールして、Erlang 20.3 をインストールする。

が、試行錯誤しているうちに、綺麗にアンインストールして、インストールし直す方法が良くわからなくなってしまいました。Vagrantな仮想環境だったこともあり、まるっと仮想マシンごと最初から作り直しました。

んでもって、Erlangをインストールする準備をします。

```shell-session
$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
$ sudo dpkg -i erlang-solutions_1.0_all.deb
```

Erlangをインストールする前にErlangのバージョンを固定させます（ http://www.rabbitmq.com/install-debian.html#apt-pinning )。これがポイント！

前回、インストールした時にはこの設定をしてなくて、インストール時点での、Erlang最新版がインストールされるようになっていました。前回時点での最新版が20.3、今回が21.0になってしまったのが、敗因です。

```:/etc/apt/preferences.d/erlang
Package: erlang*
Pin: version 1:20.3-1
Pin-Priority: 1000

Package: esl-erlang
Pin: version 1:20.3.7
Pin-Priority: 1000
```

これで、インストールします。

```shell-session
$ sudo apt-get update
$ sudo apt-get install erlang-nox
``` 

## 教訓

バージョンはちゃんと指定しよう。あと、ちゃんと公式ドキュメントをちゃんと読もう。
１ヶ月先には、Erlang21がサポートされているかも知れない (https://github.com/rabbitmq/rabbitmq-server/issues/1616)
Visual Studio CodeでFlowを使用する

TypescriptからFlowに切り替える為の備忘録。

## 拡張機能のインストール

VS Codeの拡張機能タブ、または[Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=flowtype.flow-for-vscode)から`Flow Language Support`の拡張機能をインストールする。

## VS Codeの設定を変更

左下の設定アイコンから`Settings`を選択し、`User Settings`、または`Workspace Settings`に以下の設定を追加する。

```
"flow.useNPMPackagedFlow": true,
"javascript.validate.enable": false
```

`flow.useNPMPackagedFlow`が`true`になっている場合、現在のプロジェクトにインストールされている`flow`が使用される。

`javascript.validate.enable`を`false`にすると、元からVS Codeに備わっている`typescript`のチェックが行われなくなる代わりに、`Flow`のシンタックスが使用できる。

`User Settings`に設定した場合は、全てのプロジェクトに設定が適応される。
`Workspace Settings`に設定した場合は、現在のプロジェクトのみに設定が適応される。

## 参考
[Flow for Visual Studio Code](https://github.com/flowtype/flow-for-vscode)
[AutoHotKey]ある正規表現パターンにマッチする全ての部分を返す関数


## 概要
`grep -o`みたいなことをやりたい。

例えば、`aa11bb22cc11dd`という文字列があるとして、
正規表現`[a-z]{2}11`にマッチする部分`aa11` `cc11`を両方返してほしい。

## `RegExMatch()`ってどうなの
- [RegExMatch\(\) \- AutoHotkey Wiki](http://ahkwiki.net/RegExMatch)

AutoHotKeyで正規表現にマッチする文字列を得るといえば`RegExMatch()`。

しかしこれだと、**与えた正規表現にマッチする文字列**の中の**`()`で括られたサブマッチ文字列**しか得ることができない。
言い換えると、得たい部分の全てを含む文字列にマッチする正規表現を与える必要がある。

さっきの例でいうと、`aa11` `cc11`の両方を得るには、以下のような記述になる。

```sample.ahk
InputVar = aa11bb22cc11dd
RegExMatch(InputVar, "([a-z]{2}11).+([a-z]{2}11)",Match)

MsgBox, , %A_scriptname%,
(
%Match1%
%Match2%
)
```

ややこしいし、マッチする数が多いほど正規表現が際限なく長くなり、さらにマッチする数がわからない場合にはどうしようもない。

どうすれバインダー。

## 開始位置をシフトする
`RegExMatch()`には、検索を開始する位置（文字数）を指定することができる。
また、返り値としてマッチした位置（マッチした部分の最初の文字が全体で何文字目か）も得ることができる。
さらに、マッチした文字列を`StrLen()`に突っ込めば、その文字数も得ることができる。

上の例で言えば、最初にマッチする部分`aa11`については、以下のようになる。

| 項目 | 結果 |
| --- | --- |
| 検索を開始した位置 | 1 |
| マッチした位置 | 1 |
| マッチした文字数 | 4 |
| マッチした位置と文字数の和 | 5 |

ということは……
同じ正規表現パターンで、5文字目から検索を開始したら、次の一致箇所を得られるということではないか。

## ループする
開始位置をシフトしながらループするという方向性が見えた。

正規表現にマッチしなかった場合、`RegExMatch()`は0を返すので、[Whileループ](http://ahkwiki.net/While)を用いれば、マッチしなくなるまでループできる。

マッチした文字列は配列に食わせておけば、あとで（マッチした数も含めて）適切に参照できる。

さっきの例で言えば、以下のようなコードになる。

```sample.ahk
Matches := object() ; マッチした文字列を格納する配列オブジェクトを用意
InputVar = aa11bb22cc11dd
pos = 1 ; スタート位置を1文字目に設定

While (pos != 0) ; マッチしなかったら終了
{
    ; マッチした文字列を変数`Match1`、マッチした位置を`tpos`に格納
    tpos := RegExMatch(InputVar, "([a-z]{2}11)",Match,pos)
    ; マッチした位置＋マッチした文字数分開始位置をシフト
    pos := (tpos + StrLen(Match1))
    ; マッチしていたら文字列を配列に挿入
    If (pos != 0)
        Matches.insert(Match1)
}
for index, Match in Matches
{
    MsgBox, , %A_scriptname%, %Match%
}
```

`RegExMatch()`の返り値は「検索開始位置からの距離」ではなく「文字列先頭からの距離」なので、1ループごとに`pos`に加算していく必要はない。

この例だと正規表現全体が`()`で括られているので`%Match%` = `%Match1%`なのだが、例えばパターンが`[a-z](11[a-z]{2})[a-z]`とかになると違ってくる。
「前後を特定のなにかに挟まれた部分」とかを抜き出したい場合も多いので、概ね`%Match1%`の方を抜き出すことになると思う。

## 関数化してみる
- [\[AutoHotKey\]FileSelectFileのクソ野郎を置き換える関数 \- Qiita](https://qiita.com/catfist/items/74082a0e19046ca3f207)

上記記事でやったように、配列を戻り値とする関数にするのが適切だろう。

必要なパラメータは、元になる文字列と正規表現パターンの2つ。

```StringDraw.ahk
StringDraw(Input,Pattern)
{
    Matches := object()
    pos = 1
    While (pos != 0)
    {
        tpos := RegExMatch(Input, Pattern, Match, pos)
        pos := (tpos + StrLen(Match1))
        If (pos != 0)
            Matches.insert(Match1)
    }
    Return, Matches
}

/* 使用例
for index, Match in StringDraw("aa11bb22cc11dd","([a-z]{2}11)")
{
    MsgBox, , %A_scriptname%, %Match%
}
*/
```

思いつくまで悩んだけど、出てきたコードは大して複雑でもなかった。

### 可変長引数対応
パターンが複数欲しい時があったので可変長引数にしてみた。

```StringDraw.ahk
StringDraw(Input,Pattern*)
{
    Matches := object()
    for index, Pat in Pattern
    {
        pos = 1
        While (pos != 0)
        {
            tpos := RegExMatch(Input, Pat, Match, pos)
            pos := (tpos + StrLen(Match1))
            If (pos != 0)
                Matches.insert(Match1)
        }
    }
    Return, Matches
}
```

第2引数以降が正規表現パターンで、各パターンでマッチした文字列を全てひとつの配列にまとめて返す。
AKS + ASP.NET Core でHello Worldする

# 概要

- AKS(Azure Kubernetes Service)でASP.NET Core 2.1のコンテナを動かす
- ACR(Azure Container Registry)にコンテナをpushする

# 使用環境

- Ubuntu 16.04LTS
- [前記事](https://qiita.com/narachannel/items/8f18fbfdf61e3b8e97db)のminikubeの手順を既に踏んでいるものと想定
- AzureのSubscriptionを所有していること
- azコマンドがシェル上で利用可能なこと

# 環境準備

## 1. Azure PortalからAKSを作成

Docsはコマンドラインで作成するような手順となっているが、
6月27日現在で作成できるリージョンやインスタンスに大幅な制限があるため、
Portalから利用可能なリージョンを選ぶ。
(Japan Eastが利用可能になったとは言ってもインスタンスが作成出来るとは言ってない)

ここではEast USで作成する。
バージョンはKubernetesの利用可能な最新バージョンの1.10.3



基本的に必要な情報を入力してcreateボタンが押せればOK.
作成されるまでに結構時間がかかる。

## 2. Azure PortalからACRを作成

これも入力できる情報を入力してそのまま作成。
ここで作成したACRのリソースグループ名とインスタンス名を控えておく。
(ここでは便宜上AKSのリソースグループの名前を `aksrg`, ACRのリソースグループの名前を `acr-rg-name`, AKSのインスタンス名を `aksinstancename`, ACRの名前を `acrname`とする)

## 3. ACRにコンテナのイメージをpush

以下のコマンドを実行

```shell
$ docker tag containerapp:v2 acrname.azurecr.io/containerapp:release
$ docker images
> containerapp:v2 ____　# 元からあったやつ
> acrname.azurecr.io/containerapp:release ____ # 今回作成されたpush用のイメージ
$ docker push acrname.azurecr.io/containerapp:release
```

# ACRからAKSへデプロイ

## 1. ローカルからAKSに接続

Kubectlとazコマンドを使えるシェルで作業を行う。

```shell
$ az aks get-credentials --resource-group aksrg --name aksinstancename --subscription 'subscriotionname(optional)'
$ kubectl config get-contexts
> * minikube
>   aksinstancename
$ kubectl config use-context aksinstancename
```

これでローカルのkubectlがAKSに接続されたことになる。試しにgetコマンドを実行。

```shell
$ kubectl get nodes
$ kubectl get pods
```

## 2. ACRからイメージをpullするための設定

AKSからACRにアクセスしてコンテナイメージをひっぱってくるために、Azure内のユーザの設定が必要。
これは[Docs](https://docs.microsoft.com/en-us/azure/aks/tutorial-kubernetes-deploy-cluster)にも書いてある。

```shell
$ az acr login --name acrname
$ az aks show --resource-group aksrg --name aksinstancename --query "servicePrincipalProfile.clientId" --output tsv
> xxxxx-xxx-xxxx-xxxx
$ az acr show --name acrname --resource-group acr-rg-name --query "id" --output tsv
>/subscriptions/xxx.../resourceGroups/acr-rg-name/providers/Microsoft.ContainerRegistry/registries/sample/providers/Microsoft.Authorization/roleAssignments/yyy-...
$ az role assignment create --assignee xxxxx-xxx-xxxx-xxxx --role Reader --scope /subscriptions/...
> { "canDelegate": null, "id": "..."...}  
```

## 3. あとはminikubeと同じ

```shell
$ kubectl run aspdeployment --image=acrname.azurecr.io/containerapp:development --port=8080
$ kubectl expose deployment aspdeployment --type=LoadBalancer --port=80
$ kubectl get service
> NAME            TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
> aspdeployment   LoadBalancer   10.0.138.254   xx.xx.xxx.xx   80:30325/TCP   1m
> kubernetes      ClusterIP      10.0.0.1       <none>         443/TCP        1h
```

Externl IPがpendingから何かしらのip addressに変わったらアクセス可能。（AKSの場合ポートの指定なしで行ける）
もしダメそうな場合は以下のコマンドで確認する。

```shell
$ kubectl get pods
$ kubectl logs pod-name #<-Containerプルで失敗していたら大体この辺でわかる
$ kubectl get deploy #<-デプロイが怪しかったらここに警告がでる
```

# 最後に

- azコマンドとkubectlがローカルで動けば、簡単にコンテナクラスタがいじれる（という気分に浸れる）
- ACRにコンテナイメージを集約して管理することで、Kubernetesのデプロイとアプリの開発を切り分けることが可能。
- 基本的にアプリ開発者はコンテナを作るところまで、そこから先はk8s好きな人がやればいいと思う。
Ruby while 無限ループ

Rubyのwhile文を書いてる際に、気を付けてほしいこと！
(僕もやってしまった笑)

通常コード↓

```rb
i = 0
  while i < 3 do
  puts "無限ループ"
  i += 1
end
```

(!)↑　「i += 1」が抜けてしまうと無限ループになり処理がずっと走ってしまうので、
注意すること。もし抜けてしまい、無限ループに陥った場合は「ctrl + c」で脱出しましょう。
Ectoでupdated_atだけを更新する方法

Ectoではテーブル定義でtimestampsを記述すると、追加日時`inserted_at`と更新日時`updated_at`が追加されます。

```elixir
create table(:users) do
  add :name, :string, null: false
  timestamps()
end
```

`updated_at`は、下記のようにレコードを更新したときに自動的に更新されます。
Railsを使っている人にもお馴染みでしょう。

```elixir
user = Repo.get(User, 1)
Repo.update(User.changeset(user, %{name: "hoge"}))
```

時には`updated_at`だけを更新したいことがあります。
しかし、次のコードでは更新が走らず、`updated_at`も更新されません。

```elixir
user = Repo.get(User, 1)
Repo.update(User.changeset(user))
```

Railsの場合は、touchを使いますが([参考: Railsでupdated_atのみ更新したい場合](https://blog.hello-world.jp.net/ruby/764/))、 Ectoではforceオプションを使って、強制的に更新を走らせます。

```elixir
user = Repo.get(User, 1)
Repo.update(User.changeset(user), force: true)
```

[HexDocs](https://hexdocs.pm/ecto/Ecto.Repo.html#c:update/2)にも、きちんと説明が書いてあります。

> By default, if there are no changes in the changeset, update/2 is a no-op. By setting this option to true, update callbacks will always be executed, even if there are no changes (including timestamps).

> デフォルトでは、changesetに変更がない場合にはupdate/2は何もしない。このオプション(force)をtrueに設定することで、(timestampsで作られたカラムも含めて)changesetに変更がなくてもupdateコールバックは常に実行されるようになる。

また、Google Groupでは、Elixirの生みの親であるJose氏が[How to update updated_at only](https://groups.google.com/forum/#!topic/elixir-ecto/hb3T9g_N_Gw)という質問に答えています。

> You can pass a force: true option when you call Repo.update with an empty changeset

> force: trueオプションを渡してRepo.updateを呼び出せば良い
Project EulerでF#の勉強をしました（Problem6～7編）

## はじめに
この記事は以下の記事の続きです。
Project EulerでF#の勉強をしました
[（Problem1～3編）](https://qiita.com/nanoyatsu/items/0f44b5b19fb49241d7b2)
[（Problem4～5編）](https://qiita.com/nanoyatsu/items/448f8ad22dc7212ec47f)
手元でしか動かしていないので、間違いがあったら指摘を頂けると喜びます。
## Problem 6
> 最初の10個の自然数について, その二乗の和は,
> 1^2 + 2^2 + ... + 10^2 = 385
> 最初の10個の自然数について, その和の二乗は,
> (1 + 2 + ... + 10)^2 = 3025
> これらの数の差は 3025 - 385 = 2640 となる.
> 同様にして, x最初の100個の自然数について二乗の和と和の二乗の差を求めよ.

```Fsharp
let target = [1..100]
let Problem6 = 
    (pown (List.sum target) 2) //和の二乗
    - ((List.map (fun x -> (pown x 2)) target) |> List.sum) //二乗の和
//val Problem6 : int = 25164150
```
突然明らかに難易度が下がりましたね・・・あまり言うことがない・・・。

ところで投稿用にコードをまとめる際、
自作関数を使うのをやめてmapとsumを重ねたらVSCodeのリファクタリング機能にツッコミを入れられました。

```Fsharp
    (List.sumBy (fun x -> (pown x 2)) target) //二乗の和
```
こうとも書けるみたいですね。「各要素に処理したやつ足し合わせるで」ということらしい。
やはりメソッドを覚えなければなりませんね・・・。メソッドとか言うと怒られそう。
## Problem 7
> 素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.
> 10 001 番目の素数を求めよ.

```Fsharp
let target = 10001
let makePrimeListFromLength maxLen =
    let rec inMakePrimeListFromLength (pList:int list) x = //primeList,判定対象x
        match pList.Length with
        | n when n = maxLen -> pList
        | _ ->
            if List.forall (fun y ->(x % y) <> 0) pList then
                inMakePrimeListFromLength (pList@[x]) (x+1)
            else
                inMakePrimeListFromLength pList (x+1)
    inMakePrimeListFromLength [2] 3
    
let Problem7 = makePrimeListFromLength target |> List.item(target-1)
//val Problem7 : int = 104743
```
要素数のほうから素数リストを求めました。(makePrimeListFromLength)
ロジック的にはそれほど大した事はないと思います。if分岐らへんがエラトステネスの篩です。

この問題を解いている最中に知ったんですが、
Listでも配列みたいにアクセスする方法(item)が備え付けで存在するんですね。（ただし当然ながら計算量は異なる）

それから書き方の話題ですが、letしたリストのプロパティにアクセスする場合、

```Fsharp
    let hogelist = [1..100]
    hogelist.Item 50
    hogelist |> List.item(50)
```
どちらのほうが好ましいんだろうなあ、とか。（今回でいうと4行目のLengthと最終行のitem）
List.itemの方が関数型的か・・・？　という気はします。hogelist.Itemの方はインスタンス的な生え方に見える。
あと、例を挙げるに当たって今気づきましたが、sumとかはList.sumしか無いみたいですね。
有識者の方がおられましたらご意見を汲みたいところです。個人的には後者を使いそうです。長いけど。
## おわり
以上です。小出しですみません。（Problem8がやたらゴツい）
Problem10まで続きます。（投稿したらリンクを貼りに来ます。→来ました）
[（Problem6～7編）](https://qiita.com/nanoyatsu/items/7823d28eccab995fbadb)
[（Problem8～10編）](https://qiita.com/nanoyatsu/items/89dc542c9c2fb84c8fe7)


ご指導してくださる方がいらっしゃれば、よろしくお願い致します。
pecoなどglideを使うgolangアプリケーションがビルドできない

pecoをインストールしようとして数日ハマったのでメモ代わりに

#peco
pecoとはなにかと言われれば↓こんなもの
[え、まだpecoを使ってないの？？？]
(https://qiita.com/vintersnow/items/08852df841e8d5faa7c2)

この記事書こうと調べてたらこんなの見つけた。
[例えば、pecoをビルドしない](https://qiita.com/lestrrat/items/de8565fe32864f76ac19)
・・・まあtermuxにインストールしたりもしたしね、流石にarmのバイナリはなかったでしょきっと。

#原因
気を取り直して本題。
[こちら]
(https://tech.cookbiz.co.jp/engineering-1114)のブログを読んでもらえばわかると思う。
ざっくり言えば
-**glideを使うプロジェクトは$GOPATH/src/ディレクトリ以下に作成する**
という暗黙の了解があるらしいのだ。~~知らんがな~~

#初心者向けpecoのビルド&インストール方法
というわけでgolangの設定から全部書いていこうと思う。goのインストールについてはディストリ毎で違うので省略する。

```shell:~/.bash_profile
#golang settings
export GOPATH="$HOME/.go" #ここにgolangのソースコードとバイナリが入る
export GOBIN="$GOPATH/bin"　#go installした際ここにはいる
export PATH="$GOPATH/bin:$PATH"　#つまりPATHの追加が必要
export GO15VENDOREXPERIMENT=1　　#知らない
```

以上を追記

```shell
$ curl https://glide.sh/get | sh #glideのインストール
$ git clone https://github.com/peco/peco.git "$GOPATH/src/github.com/peco/peco"
$ cd "$GOPATH/src/github.com/peco/peco"
$ glide install　#依存関係の解消
$ go install cmd/peco/peco.go
```

おしまい
サンプルコード　文字列 -> 数値

# C言語でchar型の数字からint型の数字に変換したときのメモ

###  やっていること
１. 入力した値を文字列として保存
2. 文字列を数値に変換
3. INT型の範囲にあるかをチェック

注）　int型の範囲は一般に以下のように定義されているが、~~環境によっては異なる場合もあるので~~、一応、桁数をFOR文で数えている。

int の最小値 = -2147483648
int の最大値 = 2147483647

```c:kadai.c
#include<stdio.h>
#include<limits.h>

#define NUMBER 100 // 入力できる文字は100桁までとする（変更可）

// プロトタイプ宣言
int str2value(const char moji);

// main関数
int main(void){
	int i; // カウンタ
	int num=0; // 入力された文字列の文字数保存用
	int int_max=INT_MAX; // INT_MAXの桁数確認用
	int max_num=0; // INT_MAXの桁数保存用
	int flag=0; // 記号の有無の確認用
	int power=1; // 乗数計算用
 	long check = 0; // long型 入力された値のチェック用
	char word[NUMBER]; // 入力文字の保存用１

	// 文字列の入力
	printf("文字列を入力してください：");
	scanf("%s",word);

	// 入力された　文字数のカウント
	for(i=0;word[num]!='\0';i++)
		num++;

	// INT_MAXの　文字数のカウント
	while(int_max != 0) {
		int_max /= 10;
		max_num++;
	}

	// 一文字ずつ'char型'を'int型'にする
	int kazu[num]; // 入力文字の保存用２

	for(i=0;word[i]!='\0';i++) {
		kazu[i] = str2value(word[i]);

		// 変換された文字を確認する
		// 1桁目の処理
		if(i==0) {
			// 負の値のとき1のフラグを立てる
			if(kazu[i] == -3)
				flag = 1;
			// "+記号"のとき2のフラグを立てる
			else if(kazu[i] == -5) {
				flag = 2;
			}
			// 無効な値の場合　終了
			else if(kazu[i] <= 0 || kazu[i] > 10) {
				printf("無効な値が入力されました。終了します。\n");
				return 0;
			}
		}
		// 二桁目以降の処理
		else
			// 無効な値の場合　終了
			if(kazu[i] < 0 || kazu[i] >= 10) {
				printf("無効な値が入力されました。終了します。\n");
				return 0;
			}
	}

	// 記号なし数字の場合
	if(flag == 0) {
		// 桁数が多すぎるときは入力された文字列がINT_MAX以上とみなして終了させる
		if(max_num < num) {
			printf("INT_MAX以上の値が入力されました。終了します\n");
			return 0;
		}

		// check に入力された文字列を数値にする
		for(i=num;i>0;i--) {
			check = check + (long)kazu[i-1]*power;
			power *= 10;
		}
	}
	// 記号あり数字の場合
	else {
		// 桁数が多すぎるときは入力された文字列がINT_MAX以上とみなして終了させる
		if(max_num < num-1) {
			printf("INT_MAXまたは、INT_MINを超える値が入力されました。終了します\n");
			return 0;
		}

		// check に入力された文字列を数値にする 終了条件を(i>1)にすることで符号を無視
		for(i=num;i>1;i--) {
			check = check + (long)kazu[i-1]*power;
			power *= 10;
		}
	}

	// 負の値をチェック
	if(flag == 1) {
		// 負の値にする
		check *= -1;

		if(check < (long)INT_MIN) {
			printf("INT_MINより小さい値が入力されました。終了します\n");
			return  0;
		}
	}
	// 正の値をチェック
	else {
		if(check > (long)INT_MAX) {
			printf("INT_MAXより大きい値が入力されました。終了します\n");
			return 0;
		}
	}

	// 正しい値が入力された時
	printf("文字列を数値に変換しました。\n");
	printf("入力された値は:%ldです。\n", check);

	return 0;
}

// str2value関数　(文字列を数値に変換して返す)
int str2value(const char mozi){
	return mozi - '0';
}

```
[Angularメモ] createComponent は、Input, Output を指定できない

あとで忘れたときにもう一回Googleで検索して時間を無駄にしたくないのでメモ

`ViewContainerRef` から `createComponent()` でコンポーネントを動的に作るときに、 `@Input()` を入れて作成したいときがあります。

**でも、入れられないので、他の方法を考えましょう！！**

例えばこんな感じのときにInputを入れたい。

```test.component.ts
@Component({
  selector: 'app-test',
  template: `<div>{{ answer }}<div>`,
})
export class TestComponent implements OnInit {
  @Input() question: string;
  answer: string;

  ngOnInit(): void {
    // questionからanswer作成する処理
    // ...
  }
}
```


```main.component.ts
const factory = this.componentFactoryResolver.resolveComponentFactory(TestComponent);
const componentRef = this.viewContainer.createComponent(factory);
```

`createComponent()` でコンポーネントを作成すると、 `ngOnInit()` がその時点で動いてしまいます。
そのため、上記のように作成するとエラーが出ます（というかanswerがquestionがundefinedの状態で作成される）
ここで、下記のようにしてみます。

```main.component.ts
const factory = this.componentFactoryResolver.resolveComponentFactory(TestComponent);
const componentRef = this.viewContainer.createComponent(factory);
componentRef.question = 'test-question';
```

この場合、値の代入自体はできるのですが、 `question` に値が入るのは `ngOnInit()` の後になります。
そのため、このコードもダメです。

嫌な書き方ですが、下記のようにすると、意図通りに動きます。

```test.component.ts
@Component({
  selector: 'app-test',
  template: `<div>{{ answer }}<div>`,
})
export class TestComponent {
  answer: string;

  init(question): void {
    // questionからanswer作成する処理
    // ...
  }
}
```

```main.component.ts
const factory = this.componentFactoryResolver.resolveComponentFactory(TestComponent);
const componentRef = this.viewContainer.createComponent(factory);
componentRef.init('test-question');
```

もう `ngOnInit()` とか知らん！ 自分で `init` 書くわってやつです。
Angularっぽい書き方にならず、この `Component` を普通の使い方できないので、こういう書き方になるのは嫌ですね。という話でした。

## おわりに
こういうたまに使いたくなる関連の処理はメモっておかないと泥沼なので、みなさんも素直に諦めましょう。

**みんなでIssueの動向を見守ろう！（closeされてるけど！）**
https://github.com/angular/angular/issues/8164


## ちなみに

下記のような書き方にすれば、 Angularらしい＋動的コンポーネント作成と同時にクリアできるコードにはなります

```test.component.ts
@Component({
  selector: 'app-test',
  template: `<div>{{ answer }}<div>`,
})
export class TestComponent implements OnInit {
  @Input() question: string;
  answer: string;

  ngOnInit(): void {
    if (this.question) {
      this.init(this.question);
    }
  }

  init(question): void {
    // questionからanswer作成する処理
    // ...
  }
}
```
超人的な速さでソース書き換えとmakeを繰り返すと更新がすっぽ抜けて死ぬ（タイムスタンプの精度より早くソースの書き換えとビルドを行うと更新漏れにつながる）

## 概要
- makeはタイムスタンプを見てファイルの更新管理をしている
  - `(依存物のタイムスタンプ) > (生成物のタイムスタンプ)`⇒ 更新 
- タイムスタンプの精度は意外と荒い
- 実行速度がタイムスタンプの精度に勝つと`(ソース(更新前)のタイムスタンプ) == (ソース(更新後)のタイムスタンプ)`になってしまうことがある
- そうなると更新の必要性判定がうまく動いてくれず、更新がうまくいかなくなる
- だからシェルやニンジャパワー[^1]でファイルの書き換えとビルドを行うなら、ファイルの上書きとビルドをする時とかは気を付けよう

## 問題
Q ①のような状況で ②を実行したとき、 ファイル `dst` には何が書かれている？
(脳内bashで実行してみよう)

```Bash:①
$ ls
Makefile  dst  src

$ cat Makefile
dst:src
	cat src > dst

init:
	> dst
```

```Bash:②
make init 
echo "foo" >src
make dst
```


A fooが書かれてる

**本当に？**


筆者が使っているサーバで試したところ、以下のような結果となった

```
$ make init ;echo "foo" >src;make dst
> dst
cat src > dst
$ make init ;echo "foo" >src;make dst
> dst
make: `dst' は更新済みです
```

なぜか実行毎にdstが更新されたり更新済みだったりした

## 何が起こった？

シェルの実行速度がタイムスタンプの精度を上回った結果、
srcが前回から変更されてない→dstも更新する必要なしと判断された



makeはファイルのタイムスタンプを見て更新の不要必要を判断している

つまり、
`(srcのタイムスタンプ) > (dstのタイムスタンプ)` なら
『srcのほうがdstより新しい→最後にmakeしてからsrcが更新された→再ビルドが必要』となる


問題の例だと
1. `make init` で dst更新
2. `echo "foo" >src` でsrc更新
3.  `make dst`で  `(srcのタイムスタンプ) > (dstのタイムスタンプ)` なら dst更新

という流れになる


しかし、1と2がタイムスタンプの精度より高速に終わると
``(srcのタイムスタンプ) == (dstのタイムスタンプ)` という状況が成立し、
3でdstの更新が行われなくなる



現に3で更新に失敗した際、タイムスタンプは以下のようになっていた
dstとsrcのタイムスタンプが同じである

```
$ ls --full-time src dst
-rw-rw-r-- 1 fuyutsubaki fuyutsubaki 0 2018-06-26 12:31:16.196755342 +0900 dst
-rw-rw-r-- 1 fuyutsubaki fuyutsubaki 4 2018-06-26 12:31:16.196755342 +0900 src
```


## 対策

- ファイルの上書きが発生する処理を避ける
- ニンジャパワー[^2]を手に入れてもむやみやたらに使わない

[^1]: ニンジャは早い
[^2]: ニンジャは早い
GoogleTestがテストを登録する仕組みを調べてみた

GoogleTestがどうやってテストを登録しているのか調べてみた．

# TESTの展開

単純なテストは次のように書ける．

```cpp
TEST(テストケース名, テスト名)
{
    // テスト内容
}
```

このテストは，マクロが展開されて次のようなコードになる．

```cpp
class テストケース名_テスト名_Test : public ::testing::Test
{
public:
    テストケース名_テスト名_Test() {}
private:
    virtual void TestBody();
    static ::testing::TestInfo * const test_info_;
    テストケース名_テスト名_Test(テストケース名_テスト名_Test const &) = delete;
    void operator=(テストケース名_テスト名_Test const &) = delete;
};

::testing::TestInfo * const テストケース名_テスト名_Test::test_info_ = ::testing::internal::MaekAndRegisterTestInfo(
    "テストケース名",
    "テスト名",
    0,
    0,
    ::testing::internal::CodeLocation(ファイルパス, 行数),
    (::testing::internal::GetTestTypeId()),
    ::testing::Test::SetUpTestCase,
    ::testing::Test::TearDownTestCase,
    new ::testing::internal::TestFactoryImpl<テストケース名_テスト名_Test>
);

void テストケース名_テスト名_Test::TestBody()
{
    // テスト内容
}
```
まず，テストケースとテスト名から新しいクラスが作られ，test_info_というstaticメンバ変数が用意される．このtest_info_を初期化する際に，MakeAndRegisterTestInfo()を呼び出すことで，テストを登録しているようだ．

そして，テストの内容は，生成されたクラスのメンバ関数TestBody()の本体として扱われる．

# MakeAndRegisterTestInfoの概要

MakeAndRegisterTestInfoについて，もう少し詳しく見てみる．宣言は次のようになっている．

```cpp
TestInfo* MakeAndRegisterTestInfo(
    const char* test_case_name,
    const char* name,
    const char* type_param,
    const char* value_param,
    CodeLocation code_location,
    TypeId fixture_class_id,
    SetUpTestCaseFunc set_up_tc,
    TearDownTestCaseFunc tear_down_tc,
    TestFactoryBase* factory
)
```

仮引数の意味は次のようになっている．
<dl>
<dt>test_case_name</dt>
<dd>テストケース名</dd>
<dt>test_name</dt>
<dd>テスト名</dd>
<dt>type_param</dt>
<dd>調査中</dd>
<dt>value_param</dt>
<dd>調査中</dd>
<dt>code_location</dt>
<dd>ファイルの位置とテスト開始行数</dd>
<dt>fixture_class_id</dt>
<dd>fixtureクラスのID．::testing::internal::GetTypeId<テストケース名>()で求める．</dd>
<dt>set_up_tc</dt>
<dd>テストケース開始前に呼び出される関数への関数ポインタ</dd>
<dt>tear_down_tc</dt>
<dd>テストケース終了後に呼び出される関数への関数ポインタ</dd>
<dt>factory</dt>
<dd>テストを生成するクラス</dd>
</dl>

この関数は，実引数からTestInfoを生成し，::testing::UnitTestに登録する．実際には，::testing::internal::UnitTestImplに登録する．レポータによって切り替わるようだ．

この登録時に，テストケース別に登録するようになっており，初めて登録するテストケースの場合，自動的に新しいテストケース情報が登録されるようになっている．

# テストの実行
テストの実行は，登録されたテストのTestBody()を実行しながら進んでいく．EXPECT_EQなどのアサート文を呼び出すと，
例外が有効であれば例外を，例外が無効であればWindowsの場合，Structured Exception Handling (SEH) を利用して，
問題を検出しているようだ．

# まとめ

GoogleTestは，TESTマクロにより::testing::TestInfoのstatic変数を持ったクラスを生成し，その初期化を通してテストを登録している．

テストの本体は，::testing::Test::TestBody()の実装となり，実行時に呼び出される．
JavaScriptでクリップボードへコピー

#はじめに
タイトルとURLが取れたので、次はクリップボードにコピーします。

#クリップボードへコピー
調べてみると clipboardへのコピーは document でするみたいですね。

どうやって documentにコピーしたいデータを追加するかなぁと調べたら、そのものの例 [Copying text to clipboard with JavaScript – Hacker Noon](https://hackernoon.com/copying-text-to-clipboard-with-javascript-df4d4988697f) が見つかりました。document.createElement() ですね。

ポイント

* documet.createElemet で要素にしてからコピー
* position=absolute, left=-9999px で左の見えない場所に配置
* document.getSelection().rangeCount でHTML中を選択してた場合も考慮

JavaScriptに慣れてないせいか、const と var の違いが把握できてないので今度調べてみます。

```javascript:background.js
browser.contextMenus.create({
	id: "copyUrlForQiita",
	title: "copy url for qiita",
	contexts: ["all"]
});

browser.contextMenus.onClicked.addListener((info, tab) => {
   if (info.menuItemId === "copyUrlForQiita") {
    	var urlForQiita = "[" + tab.title + "](" + tab.url + ")"
    	copyToClipboard(urlForQiita);
    }
});

function copyToClipboard(str) {
	const el = document.createElement('textarea');
	el.value = str;
	el.setAttribute('readonly', '');
	el.style.position = 'absolute';
	el.style.left = '-9999px';
	document.body.appendChild(el);
	const selected = document.getSelection().rangeCount > 0 ? document
			.getSelection().getRangeAt(0) : false;
	el.select();
	document.execCommand('copy');
	document.body.removeChild(el);
	if (selected) { 
		document.getSelection().removeAllRanges();
		document.getSelection().addRange(selected);
	}
};
```

#Permissions
上のコードだけだと問題なかったのですが、いろいろ試している間に、

```console:console
document.execCommand(‘cut’/‘copy’) はユーザー生成の短期的なイベントハンドラーの内部からの
呼び出しでないため拒否されました
```

が出力されてしまったので、Permissionsの変更が必要でした。manifest.json に clipboardWrite を追加することで動作するようになりました。

```json:manifest.json抜粋
	"permissions": [
		"contextMenus",
		"storage",
		"tabs",
		"clipboardWrite",
		"http://*/*"
	],
```

#参考
[クリップボードとのやりとり - Mozilla | MDN](https://developer.mozilla.org/ja/Add-ons/WebExtensions/Interact_with_the_clipboard)
[document.createElement - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Document/createElement)
[Copying text to clipboard with JavaScript – Hacker Noon](https://hackernoon.com/copying-text-to-clipboard-with-javascript-df4d4988697f)
php-mecabインストール

## mecabインストール

```
# tar xvzf mecab-0.996.tar.gz
# cd mecab-0.996
# ./configure --enable-utf8-only --enable-mutex 
### エラーが出る場合は ./configure --with-charset=utf8 --enable-utf8-only のオプションに変更
# make
# make check
# make install

# tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
# cd mecab-ipadic-2.7.0-20070801
# ./configure --with-charset=utf8
# make
# make install
```

## PHP7向け

```
# git clone https://github.com/rsky/php-mecab 
# cd php-mecab/mecab 
# phpize
# ./configure --with-mecab=/usr/local/bin/mecab-config 
# make
# make install

# vi /etc/php.ini
「extension=mecab.so」を追記
```

## PHP8 向け

```
# git clone https://github.com/ranvis/php-mecab.git
# cd php-mecab/mecab 
# phpize
# ./configure --with-mecab=/usr/local/bin/mecab-config 
# make
# make install

# vi /etc/php.ini
「extension=mecab.so」を追記

```

使用例

```php
$str = "すもももももももものうち";
$t = new \MeCab\Tagger();
$m = explode("\n", $t->parse($str));
```
## エラーが出る場合

```
# make
/bin/sh /usr/local/src/php-mecab/mecab/libtool --mode=link cc -DPHP_ATOM_INC -I/usr/local/src/php-mecab/mecab/include -I/usr/local/src/php-mecab/mecab/main -I/usr/local/src/php-mecab/mecab -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/usr/local/include  -DHAVE_CONFIG_H  -g -O2  -L/usr/lib64 -o mecab.la -export-dynamic -avoid-version -prefer-pic -module -rpath /usr/local/src/php-mecab/mecab/modules  mecab7.lo -Wl,-rpath,/usr/local/lib -L/usr/local/lib -lmecab -lstdc++
libtool: link: cc -shared  .libs/mecab7.o   -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib/../lib -Wl,-rpath -Wl,/usr/local/lib -Wl,-rpath -Wl,/usr/local/lib/../lib -L/usr/lib64 -L/usr/local/lib /usr/local/lib/libmecab.so -lpthread /usr/local/lib/../lib/libstdc++.so -lm  -Wl,-rpath -Wl,/usr/local/lib   -Wl,-soname -Wl,mecab.so -o .libs/mecab.so
/usr/local/lib/../lib/libstdc++.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
```
configure のオプションを指定

```
# LDFLAGS=-L/usr/local/lib64 ./configure
# make
# make install
```

/etc/ld.so.conf 見てくれない時などは上記のオプションが便利
インストール後に mecab.so ができていることを確認する

```
# make install
Installing shared extensions:     /usr/lib64/php/modules/
# ls /usr/lib64/php/modules/
bz2.so       exif.so      gmp.so       mecab.so    pdo_mysql.so   simplexml.so  sysvsem.so    xdebug.so
calendar.so  fileinfo.so  iconv.so     mysqli.so   pdo_sqlite.so  soap.so       sysvshm.so    xml.so
ctype.so     ftp.so       json.so      mysqlnd.so  phar.so        sockets.so    tidy.so       xmlreader.so
curl.so      gd.so        mbstring.so  opcache.so  posix.so       sqlite3.so    tokenizer.so  xmlwriter.so
dom.so       gettext.so   mcrypt.so    pdo.so      shmop.so       sysvmsg.so    wddx.so       xsl.so
```
ヘキサそろばん(16進数)

#ヘキサそろばん(16進数)
16進数を暗算したいときに使う、16進数そろばん。10進数そろばんと同様、脳内でイメージして暗算に使います。

構造としては上部の玉三個 , 下部の玉三個で構成され、
上部の玉は一つあたり4の量をもち、下部の玉は1の量を持ちます。

例. 0x12471A (16進数)

１２４７１Ａ
◇◇◇◇◇◇
◇◇◇◇◇
◇◇　　◇◆
　　◆◆　◆
――――――――――――
◆◆　◆◆◆
　◆◇◆　◆
◇　◇◆◇
◇◇◇　◇◇

##例えば2F + 3B を計算する時
###1. まず2Fの盤面をイメージします

2 F
◇
◇◆
◇◆
　◆
――――
◆◆
◆◆
　◆
◇

###2. まず上の桁に3を加えます。4を加え1を引きます。
2 F
◇
◇◆
　◆
◆◆
――――
◆◆
　◆
◇◆
◇

###3. 下の桁にBを加えたいが、入りきらないので繰り上げをします。
まずBの補数 0x10 - 0x0B = 0x05 を下の桁から引く
2 F　から
◇
◇◆
　◆
◆◆
――――
◆◆
　◆
◇◆
◇

0 5 を引くと
◇◇
◇
　◆
◆◆
――――
◆◆
　◆
◇
◇◇

あとは上の桁に一つ繰り上げ
◇◇
◇
　◆
◆◆
――――
◆◆
◆◆

◇◇

###4. 計算結果
6 A　が求まりました
◇◇
◇
　◆
◆◆
――――
◆◆
◆◆

◇◇

ぜひ、電卓で2F + 3B = 6A を確かめてみてください。
コンピュータに頼りがちな16進数計算ですが、人間の暗算能力でも扱えることが分かります。

###補足
繰り上げの計算では、下の桁に入りきらなかった場合は、まず下の桁から補数を引き上の桁に1繰り上げることで計算を行います。原理としてB(16進)=11(10進) なので +B(16進) = {+16 - 5 = +11 }(10進)　となるわけです。あとは各桁の玉を上の桁に1足す(+16)して、下の桁を(-5)することで、+11が求まります。

また、珠算では補数は予め暗記しておくと計算がスムーズになります。

##まとめ
16進数の加算を暗算で計算することができた。

ただ、ここまで読んでいただいた読者の方には申し訳ないのですが、
そもそも<b>電卓を使えば済む話</b>なので、あまり<b>実用性はありません。</b>
MASHで物理シミュレーション

# はじめに
先日、珍しくMASHの記事を見つけました。自分も過去に同じようなことをやったことがあるのでシーンを開きつつ覚書程度にまとめようと思います。

[Maya で複雑な形状のオブジェクトを大量にレンダリングする方法](https://qiita.com/karasusan/items/dbf217ecc11b07c743df)

## 環境
- Maya2018 Update3
- windows 10

## 事前知識
MASHを一度でも使ったことのある人であればわかると思います。
これから初めてMASHを触る方はこちらがまとまっていてわかりやすいと思います。
[【Maya】MASHを使ってみよう！紹介編](http://rigglog.sakura.ne.jp/db/2018/02/17/%E3%80%90maya%E3%80%91mash%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%EF%BC%81%E7%B4%B9%E4%BB%8B%E7%B7%A8/)
[MAYA2018 新機能　MASH新ノード「DYNAMICS」を試す①](http://maya.indyzone.jp/2017/08/01/maya2018-%E6%96%B0%E6%A9%9F%E8%83%BD%E3%80%80mash%E6%96%B0%E3%83%8E%E3%83%BC%E3%83%89%E3%80%8Cdynamics%E3%80%8D%E3%82%92%E8%A9%A6%E3%81%99%E2%91%A0/)

# 実践
今回使うのはMASHの中でもMaya2018より新機能として追加された**Dynamics**ノードです。

まずはじめにpCubeを作成し、MASHネットワークを作成します。
この時、オプションでジオメトリタイプをインスタンサにすることで処理が軽くなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/255056/7e318352-2213-490a-e46b-76b617a88ef1.png)

MASHネットワークにある、Distributeの配分タイプをボリュームにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/255056/b55e0cc9-2b30-38ae-50d0-999d5939558d.png)


ポイント数を増加させるとVolume ShapeとVolume Sizeで指定した空間内にポコポコとpCubeが複製されます。
MASHエディタからDynamicsノードを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/255056/abf179fe-74f5-f4a8-8632-0effc86ef17e.png)

特に何も設定しなくてもフロアプレーンが作成されるので、再生してみましょう。
MASHで散らしたオブジェクトが物理シミュレーションされ、相互干渉します。

# ちょっとだけ応用
ID, Random, Transformノードをさらに組み合わせることでこのような複数の形状・色のレゴブロックをランダムに流れる滝のようなことができます。(調整不足のため突き抜けてしまっていますが...)
↓youtube
[![youtube](http://img.youtube.com/vi/1S0TDfmjG0Y/0.jpg)](http://www.youtube.com/watch?v=1S0TDfmjG0Y)


**これを機会に一度MASHを触ってみてはどうですか？**

もっとMASH Dynamicsを詳しく知りたいかたは[こちら](http://help.autodesk.com/view/MAYAUL/2018/ENU/?guid=GUID-1249B03C-0EA6-4F97-BA44-7B0646F7E1C7)
git rebase後、fast-forward mergeするべきか 

はじめに
-------

rebase後にfeatureをmasterにマージする際に、**fast-forward**をした場合と、コミットログを残す場合の違いをSourceTreeを使って確認します。


準備：ブランチをrebaseする
-------
まず`master`から`feature`を分岐します。
交互に両方に何回かコミットします。

![ブランチ作成](https://qiita-image-store.s3.amazonaws.com/0/66405/69831b55-0b1a-20d5-ad47-ea0cbe372975.png)

featureを選択し、masterにrebaseします。

```
> git checkout feature
> git rebase master
```

エディタで競合を解決してrebaseが完了するまで繰り返します。

```
> git add.
> git rebase --continue
```

![rebase完了](https://qiita-image-store.s3.amazonaws.com/0/66405/cce8c0d3-c9e0-f933-9aa0-7d138ee697b8.png)

rebaseができたらmasterをチェックアウトします。

```
> git checkout master
```

fast-forwardの場合
-------
masterをチェックアウトした状態で、featureを右クリックしてマージ

```
> git merge feature
```

rebaseしたので何も指定しなければ通常はfast-forwardになります。featureはmasterを完全に含んだ状態なのでマージする必要がなく、HEADが移動するだけです。

![fast-forward](https://qiita-image-store.s3.amazonaws.com/0/66405/d8dd50f8-6665-182d-b61e-4492ba0d4893.png)

同じブランチ上でコミットした場合と同じ状態です。どれがfeatureブランチでの作業かは分らなくなっています。修正範囲が小さい場合や凡ミスの修正はこちらのほうがすっきりして良さそうです。

コミットログを残す場合
-------
masterをチェックアウトした状態で、featureを右クリックしてマージ。その際にno-ffオプションをチェック。

![2018-06-27_00h59_49.png](https://qiita-image-store.s3.amazonaws.com/0/66405/5392ba71-1af9-910f-69b5-58fe5ba02094.png)


```
> git merge --no-ff feature
```

![non-fast-forward](https://qiita-image-store.s3.amazonaws.com/0/66405/bd604956-f2a2-f62a-a984-c5245fe9febf.png)

分岐が発生していたことがはっきりとわかります。機能ごとのコミットを把握したい場合は視覚的にわかりやすいです。細かい修正にまで多用すると、ごちゃごちゃしてわかりにくくある可能性はあります。mergeのコミットログとadd3は同じ状態なので無駄といえば無駄なログです。

まとめ
-------

感覚的には分岐が残っていたほうがわかりやすいかなと思いますが、修正内容や運用によるかなと思います。コミットログがわかりにくい場合は明示的にコミットしたほうが良いかもしれないと思いました。その場合は、rebase -iやsquashでコミットログを整備する方法もあります。SourceTreeの価値はこの樹形図の見やすさにあると思いますのでうまく活用したいです。
GhostScript 8.xで一部のフォント埋め込みpdfが変換失敗する時は9系にバージョンアップするといいかも

## TL;DR
問題: GhostScript(v8.7)で連結したPDFの、日本語のうちいくつかの文字が文字化けしてしまう…
回避策: 9.23 に上げたら直った


## 背景1 GhostScript で複数のPDFファイルを連結
wkhtmltopdf で何枚かのviewをPDF化し、バックグラウンドで表紙PDFと目次PDFを対象に含めて連結するみたいなことをしていた。

`gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=#{file_path}/#{output_file_name} #{files_str}`

みたいなやつ。
環境はAWSのamazon linuxに日本語フォントはIPAゴシックのみ入れた状態。
そうすると一部の文字が見つからないような感じ。

|    かなしい    |    本当はこう    |
|:-----------------:|:------------------:|
|    ![スクリーンショット 2018-06-26 23.56.48.png](https://qiita-image-store.s3.amazonaws.com/0/45597/7b281eb9-2c53-d4ad-131c-a596d18c3ae0.png)          |    ![スクリーンショット 2018-06-26 23.57.16.png](https://qiita-image-store.s3.amazonaws.com/0/45597/1c8f4984-3b7c-c77a-1b8c-07df4cb9636c.png)           |

## 背景2 原因がだいぶわからずつらい
1. 多くの日本語はうまくいった。これが起こったのは1%程度だった。
2. 連結前の wkhtmltopdf で生成したPDFは問題なかった
3. 文字特有というわけでなく、他ページでも「雑給」は問題なく出力されていた。ただ、このページのこの箇所では絶対に再現するというような感じ。

他のページでOKのがある例
![スクリーンショット 2018-06-26 23.59.09.png](https://qiita-image-store.s3.amazonaws.com/0/45597/8c1c2d07-da07-a31d-94a9-cc47b9badfac.png)


## 対応
cidfmap 対応しても変わりなし
回避が大変そうなのと、バージョンアップすると変換エラーが出ないかもしれない情報(Ubuntu で ghostscript 9.0.7)もあり、yumで入れたghostscriptを引っこ抜き、ソースからコンパイルした。

## 結果
直った〜 :open_hands:

たいへん参考になった記事 :pray: 
http://d.hatena.ne.jp/donbulinux/20150319/1426764756
http://kamae-norihiro.blogspot.com/2012/11/japanese-font-ghostscript.html
https://qiita.com/iharakenji/items/476e8b32e4e7a3c1a274
Salesforce Apex 静的リソース StaticResourceの登録

VisualForceから静的リソースを登録する例
静的リソースはStaticResourceオブジェクトに入るのでここを更新
MetaData APIを使う

```java
public String name {get; set;}
public Blob uploadFile {get; set;}

public PageReference doPost()
{
    if (uploadFile != null ){
        MetadataService.MetadataPort service = createService();
        MetadataService.StaticResource staticResource = 
          new MetadataService.StaticResource();
        staticResource.fullName = name;
        staticResource.contentType = 'application/x-zip-compressed';
        staticResource.cacheControl = 'public';
        staticResource.content = EncodingUtil.base64Encode(uploadFile);
        MetadataService.AsyncResult[] results = service.create(
          new List<MetadataService.Metadata>{StaticResource});
    }
    return null;
}
```