OmniAICreator/Qiita-1.07M huggingface dataset:
【CSSアニメーション】CSSで読み込み時にフェードイン


##内容

CSSのみでアニメーションするスニペットです。
CSS記述のみで読み込み時にフェードインします。

##コード

```CSS
body {
    animation: fadeIn 2s ease 0s 1 normal;
}

@keyframes fadeIn {
    0% {opacity: 0}
    100% {opacity: 1}
}

@-webkit-keyframes fadeIn {
    0% {opacity: 0}
    100% {opacity: 1}
}
```

#デモ

<p data-height="265" data-theme-id="0" data-slug-hash="gWmwvK" data-default-tab="html,result" data-user="harumi-sato" data-pen-title="CSS fadein" class="codepen">See the Pen <a href="https://codepen.io/harumi-sato/pen/gWmwvK/">CSS fadein</a> by harumi-sato (<a href="https://codepen.io/harumi-sato">@harumi-sato</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##参考サイト

CSS だけで Web ページのフェードイン表示を実装する方法 | q-Az
https://q-az.net/fadein-open-only-css/
PythonでEnum

[Enum](https://docs.python.jp/3/library/enum.html)は標準モジュールです。

```python3
from enum import Enum, unique


@unique
class Game(Enum):
    action = "Action"
    rpg = "RPG"
    simulatoin = "Simulation"
    puzzle = "Puzzle"

```

使えているかチェック

```python3
>>> @unique
... class Game(Enum):
...     action = "Action"
...     rpg = "RPG"
...     simulatoin = "Simulation"
...     puzzle = "Puzzle"
... 
>>> Game.action
<Game.action: 'Action'>
>>> Game.rpg
<Game.rpg: 'RPG'>
>>> Game.rpg.value
'RPG'
```

以下のような使い方は、そのままでは出来ない。

```python3
>>> 'RPG' in Game
False
```

`__members__` を利用すると解決できる。

```python3
from enum import Enum, unique


@unique
class Game(Enum):
    action = "Action"
    rpg = "RPG"
    simulatoin = "Simulation"
    puzzle = "Puzzle"

    @classmethod
    def values(self):
        return [e.value for e in self.__members__.values()]


>>> Game.values()
# ['Action', 'RPG', 'Simulation', 'Puzzle']
>>> 'RPG' in Game.values()
# True
```

値がINT型の場合はIntEnumも利用できますが、
[以前の互換を維持するためや、Enumが上手くいかないケースでのみ利用を検討するべき](https://docs.python.jp/3/library/enum.html#enum.IntEnum)と書かれています。

以下は、Color.redはenum型ですが、INT型との比較で同一と判定されている例です。

```python3
>>> from enum import IntEnum
>>> class Color(IntEnum):
...     red = 0 
...     yellow = 1 
...     blue = 2 
... 
>>> Color.red == 0
True
>>> Color.red.value == 0
True
>>> type(Color.red)
<enum 'Color'>
>>> type(Color.red.value)
<class 'int'>
```

IntEnumはIntのサブクラスなので、以下のようなことが起こる可能性があります。
よほどのことがない限り、この挙動は意図しないものなはずです。

```python3
>>> from enum import IntEnum
>>> class Color(IntEnum):
...     red = 0 
...     yellow = 1 
...     blue = 2 
...
>>> class Season(IntEnum):
...     spring = 0
...     summer = 1
...     autumn = 2
...     winter = 3
... 
>>> Season.summer == Color.yellow
True
```

楽しいEnumライフを。
リモートへのpushを修正する（僕が思う）一番簡単な方法

##今回解決したい状況
すでにリモートのmasterへpush済みの最新のcommitに修正を加えたい（今回は分割したい）.

##手順
###1.リモートの該当コミットを削除
今回は、最新のコミットを削除したいため

```
git push -f origin HEAD^:master
```

のようにし、リモートの街頭コミットを削除.
（最新から２個目のコミットの場合は、HEAD^^:masterのようにする。）


###2.ローカルの作業内容を一時退避（該当コミットの後に、別の作業を進めていた場合）

```
git stash
```

として、現在の作業内容を一時退避する.

###3.ローカルの該当commitの内容を修正
まず、

```
git rebase -i HEAD^
```

とする.
（※この際に、ローカルで新しい作業内容が存在するとエラーとなるため、上記にあるstash作業を行う）

次に、

```
pick 8e9fe0a index.htmlを修正
```

のような表記が上部にあらわれるため、これを

```
edit 8e9fe0a index.htmlを修正
```

とすることで、このcommitを修正できる.

よって、この後は、まず

```
git reset HEAD^
```

とし、commitの内容をadd前へ戻した後、今回の例では、分割を行いたいため、
はじめにcommitしたい内容をadd&commitした後、次にcommitしたい内容をadd&commitする.

その際に、同一ファイル内でも、編集箇所ごとにaddを分けたい場合はこの記事を参照.
[Gitで部分的にコミットする方法]
(https://qiita.com/miyohide/items/79ab0ff3b3852289a6be)

その後、

```
git rebase --continue
```

とすることで、ローカルのcommitが分割された.


###4.リモートへ反映

```
git push origin master
```

とする.

###5.一時退避していた作業内容を戻す
stashしていた作業内容を戻すには、

```
git stash pop
```

とする.

以上で、ローカル, リモート共に修正が完了した。

##参考ページ
[Git のさまざまなツール - 歴史の書き換え]
(https://git-scm.com/book/ja/v2/Git-のさまざまなツール-歴史の書き換え)
[【git】git pushを取り消す](http://tweeeety.hateblo.jp/entry/2015/06/10/215753)
[[git]特定のコミットの内容を修正する](http://dackdive.hateblo.jp/entry/2014/09/21/122200)
[git-rebase - 過去のコミットを修正したい（コミット分割、内容訂正・追加）](https://ruffnote.com/akikumo_tea/657/6941)
[gitでコミットしたものを後から複数のコミットに分割する方法](http://d.hatena.ne.jp/cakephper/20111011/1318303685)
vagrant upでuninitialized constant VagrantVbguestが出る

最近、会社の仮想環境を立てる時に初歩的なところでハマったので備忘録的として書きます。
既存のリポジトリをローカルに落としていざ、vagrant upをしたら


```
There was an error loading a Vagrantfile. The file being loaded
and the error message are shown below. This is usually caused by
a syntax error.

Path: /Users/*****/Vagrantfile
Line number: 1
Message: NameError: uninitialized constant VagrantVbguest
```

というエラーになりup出来ませんでした。

#syntax error
なるほど、構文エラーのようです。
Vagrantfileの1行目の書き方が悪いのか...
#Message: NameError: uninitialized constant VagrantVbguest
VagrantVbguestが初期化されていない。定義されていないということらしいです。

uninitialized constant VagrantVbguestでググってもあまりでない。

[https://github.com/dotless-de/vagrant-vbguest/issues/73](https://github.com/dotless-de/vagrant-vbguest/issues/73)
githubに似てるissueを発見しましたが、ちょっと違うようです。

定義されていないから定義すればいいのかとか試行錯誤しましたが、見当外れで依然解消できない。

#解決方法
結局、vagrantのpluginに<b><font color="Red">VagrantVbguest</font></b>がないので、定義されていないというエラーだったようです。
なので<b>`$ vagrant plugin install vagrant-vbguest`</b>を実行

```
$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.15.1)'!
```

再度、vagrant upしたら成功でした。

もう少し柔軟な考え方を身に付けたいです。
Excelで他のWorkbookのマクロを実行する

* Application.Runでマクロを呼び出す。
* ファイル名はシングルクォーテーションで括る。
* ファイル名の後に「！」を付ける。
* シート内のマクロの場合にはシート名を付けてドット
* 最後にマクロ名を付ける。

```C:example
Application.Run "'BOOK.xlsm'!Sheet1.Macro"
```
Project Euler Q68 【Magic 5-gon ring】

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


## 問題
下に示す図のようなものを"magic" 3-gon ringという. これは$1$～$6$の数字を当てはめて, 各列の数字の和が$9$となっている. これを例として説明する.
![p_068_1.gif](https://qiita-image-store.s3.amazonaws.com/0/204486/8f0fa6bf-ee08-cc30-5961-8ff660b06c17.gif)

外側のノードのうち一番小さいものの付いた列(例では$4,3,2$)から時計回りに回ってそれぞれ列の数字を$3$つ連ねて説明する. 例えば例のものは$4,3,2; 6,2,1; 5,1,3$という組で説明することができる.

$1$～$6$の数字を当てはめて, 各列の数字の和が等しくなるものは次の$8$通りある.

|合計|組|
|:---|:---|
|$9$|$4,2,3; 5,3,1; 6,1,2$|
|$9$|$4,3,2; 6,2,1; 5,1,3$|
|$10$|$2,3,5; 4,5,1; 6,1,3$|
|$10$|$2,5,3; 6,3,1; 4,1,5$|
|$11$|$1,4,6; 3,6,2; 5,2,4$|
|$11$|$1,6,4; 5,4,2; 3,2,6$|
|$12$|$1,5,6; 2,6,4; 3,4,5$|
|$12$|$1,6,5; 3,5,4; 2,4,6$|

この組の各数字を連結して, $9$桁の数字で表すことができる. 例えば, 上の図のものは$4,3,2; 6,2,1; 5,1,3$であるので$432621513$である.

さて, 下の図に$1$～$10$の数字を当てはめ, 各列の数字の和が等しくなる"magic" 5-gon ringを作って, それを表す$16$桁または$17$桁の数字のうち, $16$桁のものの最大の数字を答えよ.
![p_068_2.gif](https://qiita-image-store.s3.amazonaws.com/0/204486/3a1485e5-486c-bd3c-a4c8-13da7fc9c700.gif)

(注, $3$つの場合の例を見ても分かる通り, 列の始まりの数字を比べた時一番小さい数字で始まる列から時計回りに繋げるという条件のもとで文字列を生成する必要があります. この条件下で最大となる数字を答えてください. )

## アプローチ
五角形に入る値を$a_1$、...$a_5$、外側の値で$a_1$から伸びているものを$a_6$、以下$a_k$から伸びているものを$a_{k+5}$とおく。
$16$桁にせよという条件より、$10$は$a_6$から$a_{10}$のいずれかにあることがわかる。
この条件により全パターンを考えても$1814400$通りしかない。

面倒なので全パターン計算してみる。

## 解答

```bash
time seq -s"," 10 |
python -c "import itertools;print list(itertools.permutations(input(),10))" |
sed 's/),/)\n/g' |
tr -d "[]()'," |
awk '$6$7$8$9$10 ~ ".*10.*"' |
awk '{print $0,$6+$1+$2,$7+$2+$3,$8+$3+$4,$9+$4+$5,$10+$5+$1}' |
awk '$11==$12' |
awk '$12==$13' |
awk '$13==$14' |
awk '$14==$15' |
awk '{min=10;for(i=6;i<=10;i++){if($i<min){min=$i;m=i}};print $0,m}' |
awk '{print $6$1$2,$7$2$3,$8$3$4,$9$4$5,$10$5$1,$NF}' |
awk '{print $1,$2,$3,$4,$5,$1,$2,$3,$4,$6}' |
awk '{for(i=$NF-5;i<=$NF-1;i++){printf $i};print ""}' |
sort |
tail -1
6531031914842725

real    0m18.051s
user    0m23.208s
sys     0m1.129s
```

$1$から$10$までの順列を出すうまい方法はないかと検索してみたところ、pythonで関数があるようだったので利用させてもらった。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/068.html

## 参考にさせて頂いたサイト様
[Pythonで直積，順列，組み合わせ，階乗の計算 _ 粉末@それは風のように (日記)](https://funmatu.wordpress.com/2017/05/24/python%E3%81%A7%E7%9B%B4%E7%A9%8D%EF%BC%8C%E9%A0%86%E5%88%97%EF%BC%8C%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%EF%BC%8C%E9%9A%8E%E4%B9%97%E3%81%AE%E8%A8%88%E7%AE%97/)
[Python Tips：ワンライナーが書きたい - Life with Python](https://www.lifewithpython.com/2015/01/python-use-command-one-liner.html)
配信等で送るURLに対してGAで取得したい場合

## Campaign URL Builderを使う

[Campaign URL Builder — Google Analytics Demos & Tools]
https://ga-dev-tools.appspot.com/campaign-url-builder/

慣れたら自力でも大丈夫。

|パラメータ名|内容|
|:--|:--|
|utm_source|**必須** line@とかFacebookとか、流入元|
|utm_medium|cpcとか流入メディア|
|utm_campaign|雪の日とか、キャンペーン名|
|utm_term|携帯,カイロ とか広告・検索用のキーワード|
|utm_content|広告のA/Bテスト用に使うと良い、とは記載がある（ロゴからなのかテキストなのか、とか）
sshコマンドを.ssh/configのhostで補完させよう

# はじめに

[.ssh/configが長すぎていつもgrepしている人へ](https://qiita.com/albyte/items/7daea592d7e58803d954)ってのを書いたら、もっとバリ便利な方法がありました！

# .bash_profileにsshコマンド用のBash-Completionを設定

.bash_profileに下記を追加してやりましょう。

~~~bash:~/.bash_profile
# 下記を追加
function _compreply_ssh(){
  COMPREPLY=(`cat ~/.ssh/config | grep -i -e '^host' | cut -d " " -f 2 | grep -E "$2"`)
}
complete -F _compreply_ssh ssh
~~~

# 使用例
例えばこんなconfigを書いていた場合

```text:.ssh/config
# hoge service(develop)
Host dev-front-hoge
    Hostname 192.168.10.10
    User         hogeop
Host dev-backoffice-hoge
    Hostname 192.168.10.11
    User         hogeop    
Host dev-api-hoge
    Hostname 192.168.10.12
    User         hogeop
Host dev-ci-hoge
    Hostname 192.168.10.13
    User         hogeop
    
# hoge service(production)
Host prd-front-hoge
    Hostname ******
    User         ****
    ProxyCommand ssh bastion-hoge -W %h:%p
... 略）
# fuga service(develop)
Host dev-front-fuga
    Hostname ******
    User         ****
... 略）
```

こんな感じで、補完してくれます。

~~~bash:コマンド
$ ssh dev-【tabキーを叩く】
dev-front-hoge  dev-backoffice-hoge   dev-api-hoge    dev-ci-hoge
~~~

# おわりに

have a good ssh life!
EclipseでのABAPプログラム開発

こちらを参考に進めます↓
[Create Hello World ABAP Program in Eclipse](http://www.saplearners.com/create-hello-world-abap-program-in-eclipse/)

#**前提**
Eclipseのセットアップについてはこちら
[SAP ABAP Development Tools in Eclipseのセットアップ](https://qiita.com/mahko2/items/7d287bc5794e38b732ef)


#**手順**
##1. ABAP Projectの作成

![スクリーンショット (576)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/5c34d74a-947f-a100-7624-0688df047420.jpeg)

![スクリーンショット (577)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/d76f49f7-e362-ae40-4af7-9c47500c35f1.jpeg)

![スクリーンショット (578)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/4babe9fd-ce2e-863e-07f0-9ef8f8fef472.jpeg)

![スクリーンショット (579)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/97166e82-b2f0-5d37-dd8b-8b75b62e6ffe.jpeg)

![スクリーンショット (580)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/72ae5e25-36c1-765a-dcf0-524c4c8427a6.jpeg)

![スクリーンショット (581)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/e02c12fd-d762-9536-5110-68c23620c0b1.jpeg)

![スクリーンショット (582)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/62178586-874c-feb5-d822-3c6e9c386afa.jpeg)

![スクリーンショット (583)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/36c422bb-799a-1799-6dab-288da7c7cfa1.jpeg)


##2. ABAPプログラムの登録、実行

![スクリーンショット (584)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/f0ecba7d-ac7c-0b50-b95e-53235a070e67.jpeg)

![スクリーンショット (585)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/5b15d5e4-d7ca-755b-7c37-046df08bb865.jpeg)

![スクリーンショット (586)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/ab42be45-730b-c2bb-a870-56ec4fa95d4a.jpeg)

ソース書いて、有効化して、実行
![スクリーンショット (587)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/9f72da94-d3b7-2e93-7c75-b24a9d50790c.jpeg)

![スクリーンショット (589)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/5e7d50fe-4b65-a1be-7f83-25fb22c0250e.jpeg)

![スクリーンショット (590)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/101769c7-bafa-b925-00f4-480ee46777d9.jpeg)

順調にできました♪
xampp設定 備忘録

# はじめに 2018/01/26記述
xampp バージョン 7.2.1 / PHP 7.2.1のプログラミングを行う前の日本語の各種設定のメモを記す.
初めのインストールのみでは日本語は文字化けしている.

# php.iniの変更
```php.ini
mbstring.language = Japanese　
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
mbstring.func_overload = 0
```



# 参考文献
- https://qiita.com/guzuri/items/643c1311224e8d482278
SAP ABAP Development Tools in Eclipseのセットアップ

こちらのブログを参考にやってみました↓
[Install SAP ABAP Development Tools in Eclipse](http://www.saplearners.com/install-sap-abap-development-tools-in-eclipse/)


#**手順**
##1. Eclipse IDE インストール
以下からダウンロード。
https://tools.hana.ondemand.com/#abap
※2018/1月現在 Oxygen(4.7)
詳細は割愛

##2. ABAP Development Tools for SAP Netweaver のインストール
“http://tools.hana.ondemand.com/oxygen”
Help → Install New Software
日本語だとこんな感じ
![スクリーンショット (551)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/edcec23a-8971-b9be-ce65-26fb09cbba1a.jpeg)

![スクリーンショット (553)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/de15ca7a-ba05-3847-bf04-1156ce0bfa4c.jpeg)


あとは参考元通りで。
Materials Project の API を利用してみた（メモ）


###導入
@KentoObata さんの素晴らしい記事
[機械学習でなんとなく材料研究者の気分を味わおう](https://qiita.com/KentoObata/items/7fd8c7527d586dffc329/)
に触発されて Materials Project の API を使ってデータを入手してみました。
あんまり日本語の情報がないみたいなので、メモを残しておきます。


###参考記事
[機械学習でなんとなく材料研究者の気分を味わおう](https://qiita.com/KentoObata/items/7fd8c7527d586dffc329/)
[Citrine：MACHINE LEARNING FOR THE MATERIALS SCIENTIST](https://citrine.io/2015/03/04/machine-learning-mat-sci-1/)


###やったこと
上記参考記事と同様に、binary の計算データ（VASP）を入手しました。
目的変数はバンドギャップと形成エネルギー。
説明変数は組成......だけでは味気ないので、他の色々な計算値も考えることにします。
　▶︎目的変数：formation_energy_per_atom, band_gap
　▶︎説明変数：pretty_formula, volume, density, nsites, spacegroup, total_magnetization


###必要なもの
- Python 3.x
- pymatgen


###Materials Project の APIキー入手
Materials Project にユーザー登録。
その後ログインしてAPIのページを見ると書いてあるのでコピペしてください。

###データの取得
1時間もするとデータを取得できる、はず。
sleep とか書いてないのでマナー悪そうですが、そのあたりは pymatgen の方で調整してくれています。多分。

```python:feature.py
from pymatgen import MPRester
import itertools

file = open('feature.csv', 'w')
file.write('pretty_formula,volume,density,nsites,spacegroup,total_magnetization,formation_energy_per_atom,band_gap\n')

API_KEY = 'Your API-KEY' # Materials Project の API をここに入れる

# pymatgen は 103 元素扱えるので、binary は C(103,2) = 5253 パターンありえる
all_symbols = ["H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"]
allBinaries = itertools.combinations(all_symbols, 2) 

with MPRester(API_KEY) as m:
    for system in allBinaries:
        results = m.get_data(system[0] + '-' + system[1], data_type='vasp') # 計算データ（VASP）を入手
        for material in results:
            if material['e_above_hull'] < 1e-6: # 熱力学的安定性のチェック。凸包上にデータがあればその物質は安定（分解しない）。
                output = material['pretty_formula'] + ',' 
                       + str(material['volume']) + ',' 
                       + str(material['density']) + ',' 
                       + str(material['nsites']) + ',' 
                       + str(material['spacegroup']['number']) + ','
                       + str(material['total_magnetization']) + ','
                       + str(material['formation_energy_per_atom']) + ',' 
                       + str(material['band_gap'])
                file.write(output + '\n')

file.close()
```

###その後は？
これで feature.csv にデータが格納されました。
あとは参考記事みたいに入手したデータを元に pymatgen を用いて説明変数を追加して、
バンドギャップや形成エネルギーの予測をしてみるといいのではないでしょうか。

###備考
- 本当はバンドギャップの値がゼロなのに有限の値となっているものがあります。
VASPの計算データだとよくあることなので、解析前にはちゃんとデータを確認するようにしましょう。
（単位胞あたりの電子数が奇数なら、普通はバンドギャップはゼロとなります）

- 一度バンドギャップのヒストグラムを描くとわかるのですが、入手したデータのほとんどのバンドギャップの値はゼロです。バンドギャップの予測精度が悪いのは、このデータの偏りが原因でしょう。

- 今回は結晶構造データは取り出しませんでした。多分、構造データもあった方が予測精度があがるので、そのうち情報を追加します。
Webマーケティング情報収集まとめ

こんにちわ。
普段はプログラム書いてますが、たまたまマーケティングについて勉強する機会があったので
随時まとめていきます。
まずは基本的な概要とか用語を全然しらなかたのでググるところからスタートしました。

## 参考記事

[Webマーケティングとは？今さら聞けない基礎知識を徹底解説](https://ferret-plus.com/519)
[【保存版】10分でわかるWebマーケティング手法の全施策まとめ【図解付き】](https://liginc.co.jp/web/useful/153607)

## Webマーケティングとは

Webを媒介にしたマーケティングのこと。

Webマーケティングの理想は販売を不要にすること。
つまり`販売（売り込み）をせずとも物が売れる流れを作ること`。

**主な特徴**

- 効果を全て数値化できる
- すぐ始めることができる
- 省コストでできるものもある
- 特定のターゲットに絞って行うことができる

![参考画像](https://ferret-a.akamaihd.net/images/58c8f9f67f58a8028c0001f3/original.jpeg?1489566197)

>[Webマーケティングとは？今さら聞けない基礎知識を徹底解説](https://ferret-plus.com/519)より参考画像

## 用語

### オウンドメディア 

自社サイト、企業ブログなどのように企業が所有している情報発信源のこと。

### ペイドメディア

広告ツールなどの外部が運営する情報発信源のこと。

### アーンドメディア

SNSのように消費者自身が情報を発信すること。
オウンドメディア、ペイドメディアと合わせてトリプルメディアと呼ばれる。

### エンゲージメント

消費者、社員が企業にどれだけ愛着をもっているかを示したもの、ユーザーとの繋がりのこと。
エンゲージメントが高いと、離職率の低下や購入率が高くなり、ファンが増える。

## Webマーケティングで大事なこと

### エンゲージメントを高める

企業体力があれば、一人一人に手厚くサポートをすることができるかもしれない。
ベンチャー企業では一人一人は難しいので、まずは`自社のサービス利用者や問い合わせをしてくれた
ユーザーに対して十分なサポートをするのがいいかも`。

### 良質な情報（コンテンツ）を発信する

ブログを書くなど。
内容は製品やサービスについて紹介するよりも、ユーザー目線にたって
ユーザーのライフスタイルに役立つ内容にするといいかも。
また、中立的な情報を発信するように心がけること。
企業が真実を歪めてもユーザーは見抜くので、隠さずに情報発信することで信頼を得る。

## 具体的な試作

- SEO
- Facebook広告
- LPO
- EFO
- メールマガジン
- リターゲティング広告
【iOS】アラートのボタン、右にする？それとも左にする？

## アラートのボタンの配置

開発中のアプリで、アラートのボタンをどのように出せばいいのか悩んだので、あらためて[Human Interface Guidelines](https://developer.apple.com/ios/human-interface-guidelines/views/alerts/ "Human Interface Guidelines")を読みました。

> Place buttons where people expect them. In general, buttons people are most likely to tap should be on the right. Cancel buttons should always be on the left.

アップルさんによると、イチオシのボタンは右がいいそうです。
キャンセルボタンは `常に左` だそうです。

> Identify destructive buttons. If an alert button results in a destructive action, such as deleting content, set the button’s style to Destructive so that it gets appropriate formatting by the system.

また、データ削除のように `destructive（破壊的な）` 変更をするボタンは、ボタンの見た目を `Destructive` に設定してユーザーが一目でわかるようにしよう、という指示もあります。

<img width="375" alt="Simulator Screen Shot 2018.01.26 13.00.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/0384c362-93ad-9125-6cf8-b74ce20cbe02.png">


Destructiveに設定すると、こちらのスクリーンショットの `Remove（削除）ボタン` のように文字が赤くなります。

> Label cancellation buttons appropriately. A button that cancels an alert’s action should always be labeled Cancel.

ほかにも、キャンセルボタンのラベルは必ずキャンセルにしましょう、ともあります。
このあたりは、ユーザーインターフェースの統一感を大切にするアップルさんらしいですね。

とはいえ、アップルさんも試行錯誤しているところもあります。
アラートのボタンもそのひとつで、iOSのバージョンによって右だったものが左になったりしています。

というわけで、[Human Interface Guidelines](https://developer.apple.com/ios/human-interface-guidelines/views/alerts/ "Human Interface Guidelines")をたまに読み返してみるとあらたな発見があるかもしれません。

## Destructiveなボタンとキャンセルボタンのあるアラートのサンプルコード

最後に、アラートのサンプルコードを紹介します。

```Swift
        let alert = UIAlertController(title: "削除", message: "削除してもよろしいですか？", preferredStyle: .alert)
        let cancelAction = UIAlertAction(title: "キャンセル", style: .default)
        let okAction = UIAlertAction(title: "OK", style: .destructive) { (action: UIAlertAction) in
            // なにか削除する処理
        }
        alert.addAction(cancelAction)
        alert.addAction(okAction)
        present(alert, animated: true, completion: nil)
```

`style: .destructive` にすると、Destructiveに設定されてボタンの色が赤くなります。

また、ボタンはaddした順番に左から表示されるので、キャンセル左のルール通りにする場合は

```Swift
        alert.addAction(cancelAction)
        alert.addAction(okAction)
```
というふうにcancel→okの順番でaddします。

アラートひとつとっても、いろいろと奥が深いですね。
IE11でXHRのHEADが、エラーメッセージ（算術結果が32ビットを超えています）でこける

# 事の発端

IaaSのウェブアプリを作成しています。(私が担当しているのはフロントのみ)
オブジェクトストレージ機能を作成しました。
オブジェクトストレージ自体の仕様は`OpenStack`です。

一応仕様上は5GBまでオブジェクト作成可能なのでブラウザから作ってみたら、
作成自体はできたけど、そのオブジェクトの詳細情報を参照するページを開設するとエラーが発生する。

XHRには `axios`を使用していて、今回落ちていたのもaxiosだった。
XHRのメソッドはHEAD。
content-lengthはなぜかそのオブジェクトのサイズ。
（サーバー側は私が関知できない・・・）

IE11が表示するエラーメッセージは「算術結果が32ビットを超えています」。
そのエラーメッセージをググっても一つの情報も出てこないばかりか、公式のMSすら解説を用意してない:frowning2:


というわけで、IEと私との戦いが始まりました:man_tone1:
エラー箇所はレスポンスペイロードを参照するところ。

< axiosのxhr.jsファイル>

```javascript

var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
//　以下の一行でこける・・・
var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
      var response = {
        data: responseData,
        // IE sends 1223 instead of 204 (https://github.com/mzabriskie/axios/issues/201)
        status: request.status === 1223 ? 204 : request.status,

```



# なぜ？
メソッドはHEADを投げていたので、ペイロードはもちろん空です。
32ビットを超えるわけない。
しかも、発生条件はある程度大きいオブジェクトの時だけ・・・
エラーが発生していた箇所は、XHRをインスタンス化してリクエストした結果の中身を参照しているだけだから`axios`が原因の可能性も薄い・・・
(ただのXHRを動作させているだけで、axiosが特別な動きをしている箇所ではなかった)

# 原因
原因は`XMLHttpRequest.responseType`でした。
[ここ](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest)を参照してください。

responseTypeが`arraybuffer`か`document`か`blob`のどれかだとエラーが発生しなくなります。

おそらく、`content-length`が大きい数字だからどうせレスポンスペイロード参照しても大きすぎるでしょって感じで、エラーを吐き出しているものと思われる。
だから、ペイロードが空でもエラーがでる。(METHODはHEADなのに:rage:)

じゃあなぜresponseTypeを変えるとエラーが発生しないのかというと、
`arraybuffer`とかは大きいペイロードが来ることが予想されるから、`content-length`がある程度大きくてもエラーが発生しないようになっている。。。
とか予想したけど、あってるかはわからない。



丸一日消えるくらい、めちゃくちゃ大変だった:spy:
[WordPress] ターム（カテゴリー・タグ）アーカイブで記事が指定件数以下なら404扱いにしたい

タイトルそのまま。
`template_redirect` アクションフック使うだけ。
タームにはカテゴリー、タグも含まれるので条件分岐はよしなに。

via. https://increment-log.com/access-redirect-404/

# コード

```php:tag_archive_template_redirect.php
<?php
add_action( 'template_redirect', 'tag_archive_template_redirect' );
function tag_archive_template_redirect() {

	if ( ! is_tag() ) { // タグアーカイブ以外は何もしない
		return;
	}

	$queried = get_queried_object();
	if ( $queried->count < 6 ) { // 総記事数が5件以下なら
		global $wp_query;
		$wp_query->set_404();
		status_header( 404 );
	}
}
```

* `template_redirect` : https://developer.wordpress.org/reference/hooks/template_redirect/
* `get_queried_object()` : https://developer.wordpress.org/reference/functions/get_queried_object/
* `WP_Query::set_404()` : https://developer.wordpress.org/reference/classes/wp_query/set_404/
* `status_header()` : https://developer.wordpress.org/reference/functions/status_header/

現場からは以上です。
CloudFoundry × SpringBoot環境でDBの鍵をUserProvidedServiceで管理

## この資料について

CloudFoundryにデプロイしているSpringBootアプリケーションの鍵を管理する際に直接書いたりしたくないので、CloudFoundryが用意しているUserProviededService(UPS)を使っていい感じにやる方法を記述する

## 導入までの大筋

1. UPSインスタンスを立ち上げて鍵を登録する
2. アプリケーションからUPSで登録した鍵を引けるように記述する
3. manifest.ymlにUPSをバインドする設定を記述する
4. アプリケーションをCFにpushする

## 導入するアプリケーション
MySQLに接続してデータを返却するAPIとする。詳細なコードは巻末のソースを参照すること

## 導入する

#### 1. UPSインスタンスを立ち上げて鍵を登録する

###### 下記コマンドを実行して鍵を対話的に登録する

```bash
$ cf cups my-user-provided-service -p "url, user, password"

url> jdbc:mysql://your.mysql.server.domain:3306/demo

user> demo

password> secret
```

###### 補足. 登録すると下記のようなJSONがバインドしたインスタンスの環境変数に登録される

```json
"VCAP_SERVICES": {
  "user-provided": [
   {
    "credentials": {
     "password": "secret",
     "url": "jdbc:mysql://your.mysql.server.domain:3306/demo",
     "user": "demo"
    },
    "label": "user-provided",
    "name": "my-user-provided-service",
    "syslog_drain_url": "",
    "tags": [],
    "volume_mounts": []
  }
 ]
}
```

#### 2. アプリケーションからUPSで登録した鍵を引けるように記述する

###### application.ymlにMySQLの接続情報を下記のように記述する

```yaml
spring:
  datasource:
    url: ${vcap.services.my-user-provided-service.credentials.url}
    username: ${vcap.services.my-user-provided-service.credentials.user}
    password: ${vcap.services.my-user-provided-service.credentials.password}
```

###### 補足. 配信されるVCAP_SERVICEの情報は下記で取得できる

SpringBootでは、内部的にVCAP_*の情報をパースして下記の指定方法で使用できるようしているため、独自でJSONのパーサ等を作る必要はない

```
${vcap.services.UPSのnameにあたるもの.user-provided以下のkey名.前で指定したオブジェクトのkey名}
もしくは、
${cloud.services.UPSのnameにあたるもの.user-provided以下のkey名.前で指定したオブジェクトのkey名}
```

#### 3. manifest.ymlにUPSをバインドする設定を記述する

```yaml
applications:
- name: bind-ups-sample
  buildpack: https://github.com/cloudfoundry/java-buildpack.git
  memory: 1G
  path: build/libs/bind-ups-sample-0.0.1-SNAPSHOT.jar
  services:
  	- my-user-provided-service # これがバインドする設定
```

#### 4. アプリケーションをCFにpushして起動できれば完了

```bash
$ cf push
```

## ソース
[mitsuya-saida/bind-ups-sample](https://github.com/mitsuya-saida/bind-ups-sample)

## 参考にした資料

* [User-Provided Service Instances | Cloud Foundry Docs](https://docs.cloudfoundry.org/devguide/services/user-provided.html)
* [Deploying with Application Manifests | Cloud Foundry Docs 
](https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html#services-block)
* [cloudfoundry - can not access environment variable specified by user provided service with java - Stack Overflow](https://stackoverflow.com/questions/45293954/can-not-access-environment-variable-specified-by-user-provided-service-with-java)
* [Binding to Data Services with Spring Boot in Cloud Foundry](https://spring.io/blog/2015/04/27/binding-to-data-services-with-spring-boot-in-cloud-foundry#a-purely-declarative-approach)
カルマンフィルター　有本卓先生　産業図書

ARMAを勉強のため、packageを使わずに実装してみました。
よければ一度、動かしてみてください。
変なところがあったら、教えてください。

```{r}
#ARMA(修正) 　p.198

library(dplyr)
library(pryr)

Data=read.csv("C:/Users/kozakai/Desktop/arima_sample/arima/data/unemploy_train.csv")

data=Data %>% mutate(num=1:nrow(Data))
colnames(data)=c("Month","value","num")
plot(data$num,data$value,type="p",xlab="num",ylab="value")



p=2;r=0
print(paste0("num(a)=",p-1," ;num(b)=",r))
P=1
val=c()
pthi=rep(0,p+r-1)
pthi_data=matrix(0,ncol=p+r-1,nrow=nrow(data)-p+1)
V=c()
V=matrix(0,ncol=p+r-1,nrow=nrow(data)-p+1)
data=data %>% dplyr::mutate(predict=0)

sigma_vec=c()

for(j in p:nrow(data)){
  
  val=c(val,P)
  
  if(p==2){
    
  sigma=0.01  
    
  }else{
  
  if(var(data$value[(j-p+1):(j-1)])>0){
  
  sigma=var(data$value[(j-p+1):(j-1)])
  
  }else{
  
  if(j>p){
        
  sigma=sigma_vec[length(sigma_vec)] 
  
  }else{
    
  sigma=1  
    
  }
    
  }
    
  }  
  
  sigma_vec=c(sigma_vec,sigma)
  
  vec=c(t(data$value[(j-p+1):(j-1)]),rnorm(r,mean=0,sd=sqrt(sigma)))
  S=(sum(vec^2)*(1/sigma)+P^(-1))^(-1)
  pthi=S*(pthi/P+(data$value[j]*vec)/(sigma))
  P=S;pthi_data[j-p+1,]=pthi
  V[j-p+1,]=vec
  data$predict[j]=sum(pthi*vec)

}
P=val

#learning(b0=1)

colnames(data)=c("Month","value","num","learning")

#iteration
plot(data$num,data$value,xlab="time",ylab="value",main="Iteration",xlim=c(min(data$num),max(data$num)),ylim=c(min(data$learning),max(data$learning)),col=2)
par(new=T)
plot(data$num,data$learning,xlab="time",ylab="value",main="Iteration",xlim=c(min(data$num),max(data$num)),ylim=c(min(data$learning),max(data$learning)),col=3)

#predict

data=data %>% dplyr::mutate(predict=0)

for(j in p:nrow(data)){

a=pthi[1:(p-1)];b=pthi[p:length(pthi)]  

data$predict[j]=sum(data$value[(j-p+1):(j-1)]*a)+sum(b*rnorm(r,mean=0,sd=sqrt(sigma)))+rnorm(1,mean=0,sd=sqrt(sigma))

}

plot(data$num,data$value,xlab="time",ylab="predict",main="ARMA",xlim=c(min(data$num),max(data$num)),ylim=c(min(data$predict),max(data$predict)),col=2)
par(new=T)
plot(data$num,data$predict,xlab="time",ylab="predict",main="ARMA",xlim=c(min(data$num),max(data$num)),ylim=c(min(data$predict),max(data$predict)),col=3)

cor(data$value,data$predict)

```
ESP32でping

ESP32 で ping が使えるようになった。

正確には、 Arduino core for the ESP32 において、ping 応答は前からできていたのだが、ping 発信の機能が無かったのが最近できるようになった。

試してみた記録。

# インストール

https://github.com/pbecchi/ESP32_ping

こちらからダウンロード&解凍ないし、cloneする。
今回は、ZIPでダウンロードした。

それをESP32_ping-masterというフォルダができるので、ESP32_pingという名前にリネームし、

~/Arduino/hardware/espressif/esp32/libraries

の中に移動。


~/Arduino/hardware/espressif/esp32/libraries/ESP32_ping
という感じにする。

# 試してみる
こちら
https://github.com/espressif/arduino-esp32/issues/564
を参考にして、


```

#include <WiFi.h>
#include "ping.h"

void setup()
{
  Serial.begin(115200);
  WiFi.begin("myESSID","mypassphase");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

}
bool pingtest (IPAddress ia) {
  IPAddress adr = IPAddress(ia[0], ia[1], ia[2], ia[3]);
  Serial.printf("Ping : %d.%d.%d.%d : ", ia[0], ia[1], ia[2], ia[3]);
  if (ping_start(adr, 4, 0, 0, 5)) {
    Serial.println("OK");
    return true;
  } else {
    Serial.println("Request time out");
    return false;
  }
}

void loop()
{
  pingtest( IPAddress(192,168,179,2));
}


```
PMD形式のMMDモデルをJavaFXで読み込んで表示する

とりあえずメモ書き程度。細かい処理とかはソースコードを参照。ここでは、PMDデータを読み込んでJavaFXで表示するまで。JavaFXの3D表示についてはここでは記載しない。

#MMDモデルとは
[樋口氏によって開発されたMikuMikuDance](http://www.geocities.jp/higuchuu4/)専用の3Dモデルフォーマット。PMD形式とPMX形式の２種類あり。

#使用したMMDモデル
Twitter上で連載されている漫画「いきのこれ！社畜ちゃん」（ビタワン氏@vitaone_)の登場キャラクターのMMDモデルを使用。[公開サイトはこちら](https://syachiku-chan.com/?p=529)
データ形式はPMD形式

#PMD形式データ
バイナリ形式。基本的にデータフォーマットは非公開。以下のサイトを参考に読み込み部を実装。

[通りすがりの記憶](http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4)

#JavaFXで3D表示
TriangleMeshとPhongMaterialを使用。PMDの頂点データと面データをそのまま使用すると、上下が逆転して表示される。これはY座標の正方向がPMDでは上、JavaFXでは下となってるため。
![texture.jpg](https://qiita-image-store.s3.amazonaws.com/0/195280/3ad2fc0f-450c-fcb8-932b-fb5d0bf3b5b7.jpeg)

なので、Y座標については＋－を反転させて設定する。
ただし、Y座標の反転だけでは面の表裏が逆になってしまい正常に表示されない。
![texture2.jpg](https://qiita-image-store.s3.amazonaws.com/0/195280/54108156-9850-9f2c-1a8c-1de44a7ab218.jpeg)

正常に表示させるために、面データの頂点3点を指定する順番を逆転させることで、正常に表示できる。
![texture3.jpg](https://qiita-image-store.s3.amazonaws.com/0/195280/f58ccabb-e6c0-1edf-20cb-edade48989a3.jpeg)

#PMDのどのデータをどこに設定するか
PMDデータの詳細は[通りすがりの記憶](http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4)を参照。

##TriangleMesh
TriangleMesh.getPoints().addAll()で、頂点リストのfloat[3] posを設定。
pos[0] = x, pos[1] = y, pos[2] = zとなるので、pos[1]の値は+-を反転

TriangleMesh.getTextCoords().addAll()で、頂点リストのfloat[2] uvを設定。
これはy座標の反転は不要

TriangleMesh.getFaces().addAll()で、面情報のWORD face_vert_index[]を設定。
face_vert_index[]の値３つで１つの面を表し、指定順を逆転させて指定するので、
{
face_vert_index[2], face_vert_index[2],
face_vert_index[1], face_vert_index[1],
face_vert_index[0], face_vert_index[0]
}
のようになる。（左側が頂点のインデックス、右側がテクスチャのインデックス）

##PhongMaterial
テクスチャイメージ(javafx.scene.image.Image)は、材質リストのchar texture_file_name[20];で指定されているファイルを指定。

PhongMaterial.setDiffuseMap()に、材質リストのfloat diffuse_color[3]およびfloat alphaの値を使用してjavafx.scene.paint.Colorで設定。

PhongMaterial.setSpecularColor()に、材質リストのfloat specular_color[3]の値を使用して（アルファ値は1.0固定）javafx.scene.paint.Colorで設定。

PhongMaterial.setSpecularPower()に、材質リストのfloat specularityを設定。

ざっくりと説明するとこんな感じ（ほんと超ざっくりｗ）

#ソースコード
ソースコードはこちら。
https://github.com/nekog1975/fxmmd

#使い方
PMDLoader.load(Path)でPMDクラスを生成し、PMDConverter.convert(PMD)でList<MeshView>を生成して使用する。（ソースコード中のtest.TestMain.javaを参照）

#実行結果
後輩ちゃん
![後輩ちゃん.jpg](https://qiita-image-store.s3.amazonaws.com/0/195280/715de55c-5557-1c60-6f51-8cfa313b166a.jpeg)

先輩さん
![先輩さん.jpg](https://qiita-image-store.s3.amazonaws.com/0/195280/29b43af5-d551-8585-f967-cc46a0a1f6a2.jpeg)

同期ちゃん
![同期ちゃん.jpg](https://qiita-image-store.s3.amazonaws.com/0/195280/6a33bebb-5c65-1067-2fee-51984dd59f01.jpeg)
RxJava を Kotlin で利用する時に andThen や concatWith でラムダ式を使ってはいけない

完全にハマりました。

RxJava (RxKotlin 含む) を Kotlin で利用している場合に、 Completable の `andThen` や `concatWith` でラムダ式を使用してはいけません。

```Kotlin:ダメな例
Completable.complete()
        .andThen{ Completable.complete() }
        .test()
        .assertComplete()
```

この場合、このストリームは Complete しません。
ラムダ式を使用すると内部で emitter に emit されなくなってしまうようです。[^1]

[^1]: https://github.com/ReactiveX/RxJava/issues/5551#issuecomment-321998155
パスフレーズ付き秘密鍵を使った knife zero converge


# 概要
* 今更ながら knife solo から knife zero へスキルシフトしている。その時に躓いたことをメモしておく。<br />
<br />
* AWS で EC2 を利用する場合は、たいてい AWSマネジメントコンソール から作成したキーペアを使っている。
けど、それには秘密鍵にパスフレーズが付いていない。セキュリティの感度が高い人は独自にパスフレーズ付き秘密鍵のキーペアを作成してインポートしているはず。<br />
<br />
* macOS にある chefレシピ を knife zero で chefクライアントである EC2 (ホスト名:chef-client-host) へ収束するときにパスフレーズ付き秘密鍵のキーペアを使う場合は、knife zero 実行前に ssh-agent で秘密鍵を登録しておく必要がある。<br />
<br />
* macOS側の .ssh/config と、EC2(chef-client-host) の knife zero bootstrap は設定済み。

# エラー＆トライ
* エラーメッセージ

```
$ knife zero converge "name:chef-client-host" --sudo
WARNING: Failed to connect to ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com -- Net::SSH::AuthenticationFailed: Authentication failed for user foo@ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com@ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com
ERROR: NoMethodErrorundefined method `forward' for nil:NilClass
ERROR: /Users/foo/.chefdk/gem/ruby/2.4.0/gems/knife-zero-1.19.1/lib/knife-zero/bootstrap_ssh.rb:32:in `block in ssh_command'
/Users/foo/.chefdk/gem/ruby/2.4.0/gems/knife-zero-1.19.1/lib/knife-zero/bootstrap_ssh.rb:30:in `each'
```
* 対処<br />
「-x」オプションでユーザー名を指定する<br />
「ssh-add」で鍵を登録する<br />

```
▼ssh-agent起動
$ eval `ssh-agent`
Agent pid 3726

▼秘密鍵を登録する
$ ssh-add ~/.ssh/秘密鍵
Enter passphrase for /Users/foo/.ssh/秘密鍵:
パスフレーズを入力

▼確認
$ ssh-add -l
4096 SHA256:***** /Users/foo/.ssh/秘密鍵 (RSA)

▼収束開始
$ knife zero converge "name:chef-client-host" -x ec2-user --sudo

▼鍵の登録を削除
$ ssh-add -d ~/.ssh/秘密鍵
```
AWS環境への最新版Libreofficeインストール

AWS環境へのLibreofficeインストール

# 1. LibreofficeをダウンロードURLを取得(GUI環境)

GUI環境にて[Libreoffice公式](https://ja.libreoffice.org/)へアクセス。

上部のメニューバー->Download->Libreoffice最新版->Linux x64 (rpm)をダウンロードし、一度ダウンロードページに飛ぶ。

このページにアクセスすることで、ファイルサーバーへリダイレクトし、ダウンロードしてくる仕組みなため、「すぐにダウンロードが始まります。始まらない方はこちら」的な文言があるため、ここのリンクをコピー。


# 2.AWSでダウンロード・インストール

インストールする環境へSSHしダウンロードする。

	$wget http://download.documentfoundation.org/libreoffice/stable/5.4.4/rpm/x86_64/LibreOffice_5.4.4_Linux_x86-64_rpm.tar.gz
	
しばらくするとダウンロードが完了するので解凍

	tar xvzf LibreOffice_5.4.4_Linux_x86-64_rpm.tar.gz
	
今回はすでにLibreofficeをインストール済みの場合でも対応できるよう、アップグレードにも対応したコマンドを実行する。（もちろん新規インストールでもOK)

	sudo rpm -Uivh LibreOffice_5.4.4.2_Linux_x86-64_rpm/RPMS/*.rpm
	
これでインストール完了。

libreoffice5.4 コマンドで実行できる。

さらに今回はlibreofficeコマンドとして実行したいのでシンボリックリンクを作成する。

	cd /usr/bin
	#必要であればsudoする
	sudo ln libreoffice5.4 libreoffice
	
あとはlibreofficeコマンドを入力して動けば成功。
nodeでdyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.59.dylibとなったときの対処法

## 環境
osx 10.13
brewでnodeをインストール済み

## こんなエラーになったときの対処
node実行時に以下メッセージで実行できない。

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.59.dylib Referenced from: /usr/local/bin/node Reason: image not found

## 解決
brew reinstall node --without-icu4c

こちらでも行けるらしい。
brew upgrade node


## 参考
[node 7.7.4 builds but throws Abort trap: 6, trying to load dyld libicui18n.58.dylib · Issue #11713 · Homebrew/homebrew-core](https://github.com/Homebrew/homebrew-core/issues/11713)
SpreadsheetのConditional Formattingで正規表現を使う

まず、適用させる範囲・スタイルを選択して式をCustom formula isにセット
<img width="242" alt="Screen Shot 2018-01-26 at 17.53.47.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/211297/a2ff1629-a949-0639-3e89-a271d26090bc.jpeg">


```
=REGEXMATCH(INDIRECT("R[0]C[0]", false),"ここに正規表現パターンを記入") = true
```
上のコードに正規表現を記入してペーストすると、それぞれのセルごとに判定が行われる。
マッチしなければ、設定したスタイルがそのセルのみに適用される！
lighthouse のスコアを CLI だけで確認する

[Lighthouse によるウェブアプリの監査  |  Tools for Web Developers  |  Google Developers](https://developers.google.com/web/tools/lighthouse/?hl=ja)

整形用スクリプト

```js:format-lighthouse-stats.js
const input = require('fs')
  .readFileSync('/dev/stdin')
  .toString()

const stats = JSON.parse(input)
const scoreMap = Object.entries(stats.audits).reduce((acc, [key, a]) => {
  if (typeof a.score === 'number') {
    return Object.assign({}, acc, {[key]: a.score })
  }
  return acc
}, {})
console.log(scoreMap)
```

点数を見る

```
$ npm i -g lighthouse # lighthouse-cli をインストール
$ lighthouse https://google.com --output json --quiet | node format-lighthouse-stats.js

{ 'first-meaningful-paint': 86,
  'speed-index-metric': 81,
  'screenshot-thumbnails': 100,
  'estimated-input-latency': 100,
  'first-interactive': 70,
  'consistently-interactive': 70,
  'image-aspect-ratio': 0,
  'total-byte-weight': 100,
  'offscreen-images': 100,
  'uses-webp-images': 100,
  'uses-optimized-images': 100,
  'uses-request-compression': 100,
  'uses-responsive-images': 100,
  'dom-size': 100,
  'link-blocking-first-paint': 100,
  'script-blocking-first-paint': 100 }

```
Leiningenのprofileを合成する

## やりたいこと

- あるプロジェクトを、元々使っていたライブラリに加え、派生したライブラリ（この例の場合はDatomic on-premとDatomic Cloud)のそれぞれに対応するようにしたい。Datomicへ接続する機能は同じだが、オンプレミス版とクラウド版は異なるクライアントライブラリを要求するので、環境に応じて使い分けたい。

## Leiningenにはprofileがある

- もともと下記のようなprofileが設定されている。

```clojure
(defproject org.onyxplatform/onyx-datomic "0.12.5.1-SNAPSHOT"
...
  :profiles {:dev {:dependencies [[com.datomic/datomic-free "0.9.5544"]
                                  [aero "0.2.0"]]
                   :plugins [[lein-set-version "0.4.1"]
                             [lein-update-dependency "0.1.2"]
                             [lein-pprint "1.1.1"]]
                   :resource-paths ["test-resources/"]}
             :circle-ci {:jvm-opts ["-Xmx4g"]}})

```

- `com.datomic/datomic-free`はオンプレミス用なので、クラウド向けの開発をするときは除外したい。なので、`:datomic-onprem`という新しいprofileを作成し、ライブラリをそのprofile配下の`:dependencies`に移動した。さらにクラウド用のライブラリも`:datomic-cloud`profileを作成して定義した。

```clojure
(defproject org.onyxplatform/onyx-datomic "0.12.5.1-SNAPSHOT"
...
  :profiles {:dev {:dependencies [[aero "0.2.0"]]
                   :plugins [[lein-set-version "0.4.1"]
                             [lein-update-dependency "0.1.2"]
                             [lein-pprint "1.1.1"]]
                   :resource-paths ["test-resources/"]}
             :circle-ci {:jvm-opts ["-Xmx4g"]}
             :datomic-onprem {:dependencies [[com.datomic/datomic-free "0.9.5544"]]
             :datomic-cloud {:dependencies [[com.datomic/client-cloud "0.8.50"]]}}})
```

- オンプレミス版を取り込むためには、`with-profile`で指定すれば良い。`+`接頭辞は、デフォルトのprofile群を置き換えずに、デフォルトに追加することを意味する。

```
lein with-profile +datomic-onprem [task]
```

## だが、破壊的変更は避けたい

- しかし、これでは、今までの振る舞いを維持するために、既存のビルドスクリプトに `with-profile +datomic-onprem`を追加しなければならない。こういった類の留意点が増えると管理しきれなくなるので、極力避けるべきである。特にオープンソースでは誰が使っているか分からないし、READMEに追記しても読んでもらえる可能性は低い。
- そこで、default profileを書き換えることにする。最後の行に注目。

```clojure
(defproject org.onyxplatform/onyx-datomic "0.12.5.1-SNAPSHOT"
...
  :profiles {:dev {:dependencies [[aero "0.2.0"]]
                   :plugins [[lein-set-version "0.4.1"]
                             [lein-update-dependency "0.1.2"]
                             [lein-pprint "1.1.1"]]
                   :resource-paths ["test-resources/"]}
             :circle-ci {:jvm-opts ["-Xmx4g"]}
             :datomic-onprem {:dependencies [[com.datomic/datomic-free "0.9.5544"]]}
             :datomic-cloud {:dependencies [[com.datomic/client-cloud "0.8.50"]]}
             :default [:base :system :user :provided :dev :datomic-onprem]})

```

- これで`with-profile`を指定しなくても元のふるまいを維持することができた。

## でも、クラウド版を使うにはオンプレミス版を除外しなければならない

- 今度はdefaultで`cloud-onprem`が含まれているので、クラウド版を使うのには、下記のprofile設定が必要。

```
lein with-profile +datomic-cloud,-datomic-onprem [task]
```
`-`接頭辞は、defaultから除外して無効化する意味を持つ。

- 目的は達成したが、クラウド版を使うのにオンプレミス版を除外しなければいけない、というのは、この２つの相互排他的な関係性が分かっていないと忘れてしまいがち。

## default以外でもComposite profilesを定義することができる！

```clojure
...
             :default [:base :system :user :provided :dev :datomic-onprem]
             :cloud   [:base :system :user :provided :dev :datomic-cloud]})

```
- これで、profileを一つ定義するだけでクラウド版に切り替えられる！

```
lein with-profile cloud [task]
```
【簡単2ステップ】vimでコメントアウト行のみを削除する

# はじめに
OSSとかインストールするとコンフィグがコメントアウト行ばかりで見にくかったりする。
~~もっと、スマートな方法はあるかもだけどとりあえずこれで解決できる。~~（コメント対応したのでもうスマートなはず）

# ［ステップ1］「#」から始まる全ての行を空行（改行のみの行）に変換

```
:%s/#.*
```

# ［ステップ2］全ての空行を削除

```
:v/\S/d
```

# （追記）lessでコメントアウト行のみは表示しない
vimじゃないけどメモ

```
less <file> | grep -v "^\s*$" | grep -v "^\s*#"
```
関数 ()=>AとUnit=>Aは違う

こんな関数があったとして

```scala
def foo[A](func: A => Int, param: A): Int = func(param)
```

以下関数をfoo関数の第一引数に渡して（第二引数はよしなに）実行してみたい。

```scala
val f: Int => Int = identity
val g: () => Int = () => 3
val h: Unit => Int = (_:Unit) => 3
```

実行。

```scala
foo(f, 3)   // 3が返る
foo(g, ())  // コンパイルエラー！
foo(h, ())  // 3が返る
```

gはコンパイルエラー。hは大丈夫。
エラーメッセージはこんな感じ。

```scala
<console>:14: error: type mismatch;
 found   : () => Int
 required: ? => Int
       foo(g, ())
```

## ちょっと確認

改めてgの方。

```scala
scala> val g: () => Int = () => 3
g: () => Int = $$Lambda$1092/345607713@1921994e

scala> g.getClass
res1: Class[_ <: () => Int] = class $$Lambda$1092/345607713

scala> g.isInstanceOf[Function1[_,_]]
res2: Boolean = false
```

おお、false.
hの方。

```scala
scala> val h: Unit => Int = (_:Unit) => 3
h: Unit => Int = $$Lambda$1111/122513206@52a33c3f

scala> h.getClass
res3: Class[_ <: Unit => Int] = class $$Lambda$1111/122513206

scala> h.isInstanceOf[Function1[_,_]]
res4: Boolean = true
```

hはFunction1だけどgはFunction1じゃなくてFunction0でした。
単一選択のセレクトボックスを連動させたい

# 概要

単一選択のセレクトボックスが複数個あって連動させる場合、
ajax通信でn個目の選択状況を反映して～といったことはしたくない。

こういうときなんか楽な方法ってないでしょうか。
以下、optgroupというタグとjQueryを使ってサボる方法。

# html のoptgroup

存在を忘れていたけど[そういえばこんなタグがあった。](https://www.w3schools.com/tags/tag_optgroup.asp)

話を分かりやすくするために、セレクトボックス2個の親子関係を例にする。
親の選択が子にも影響するって感じ。

```html
<select name="parent">
	<option value="">（指定なし）</option>
	<option value="1">hogehoge.jp</option>
	<option value="2">Yahoo! Japan</option>
	<option value="3">Test</option>
</select>
<select name="child">
	<option value="">（指定なし）</option>
	<optgroup label="hogehoge.jp">
		<option value="1">hogehoge</option>
		<option value="3">fugafuga</option>
	</optgroup>
	<optgroup label="Yahoo! Japan">
		<option value="2">Yahoo! Japan</option>
		<option value="4">ヤフー知恵遅れ</option>
	</optgroup>
	<optgroup label="Test">
	</optgroup>
</select>
```

# jQuery

jQueryで選択状態の反映を実現する。
ソースコードは…まあ参考までということで。

```javascript
// 親の選択が変更された場合、子の表示を変更しつつ処理する
$("select[name='parent']").change(function() {
	// 子の選択状態を解除
	$("select[name='child'] option:selected").attr("selected", false);
	$("select[name='child']").val([""]);
	// 子を全て非表示で初期化
	$("select[name='child'] > optgroup").each(function() {
		$(this).attr("hidden", "hidden");
	});
	// 親の選択済みをループさせて子を処理する
	$("select[name='parent'] option:selected").each(function() {
		var val = $(this).val();
		var text = $(this).text();
		// ラベルで比較は気持ち悪いね
		if (val != "") {
			// 親の選択状態が（指定なし）以外の場合、子も限定させる
			$("select[name='child'] > optgroup").each(function() {
				if ($(this).attr('label') === text) {
					// ラベルが親と一緒の場合、hiddenを消すことで見せる
					$(this).removeAttr("hidden");
				} else {
					// ラベルが親と違うから、hiddenで消す
					// 実は上で既にやってるから要らないけど、一応書いておく
					$(this).attr("hidden", "hidden");
				}
			});
		} else {
			// 親の選択状態が（指定なし）の場合、全部見せる
			$("select[name='child'] > optgroup").each(function() {
				$(this).removeAttr("hidden");
			});
		}
	});
});
```
Angular未経験者だった自分に教えたいこと

## はじめに
Angular 4/5を数か月使ってみて、
知識0のときに、これを知っていれば！という私的Tips 7つをまとめました。

## 1. Angularの公式サイトは日本語版がある
Angular未経験者が初めに読むのが公式サイトのチュートリアルかと思います。
https://angular.io

非常にわかりやすいです。*Angularすげー!*ってなります。**英語でなければ**。

日本語のAngular記事では、上記が紹介されることが多いですが
公式サイトには、なんと日本語版があります。

https://angular.jp

angular.ioのURLを見つけたら、.ioを.jpに変換すると、幸せになれました。

## 2. npmの代わりにyarnを使う
* yarnは、--saveし忘れがない
* yarnはadd(install)がやたら速い
* yarnのほうがトラブルが少ない  
npmを使用していたころ、Angular CLIのアップデートで依存関係エラーが頻発しました。  
よくわからない初心者の私は、yarnを使ったほうが幸せになれました。

## 3. とりあえずAngular Materialをいれておく
「見てくれ」がよくなるとレビュアーの顔色が変わります。
Angular Materialである必然性はないですが、公式サイトわかりやすいしね！
https://material.angular.io/

## 4. IEに対応しておく
AngularはデフォルトでInternet Exploreに対応していません。
いまさらIEなんて使ってるの？...いました。別組織にたくさん。
レガシーな人々のフォローは面倒なので、こちらで対応します。

### IE対応
polyfiles.ts内の、IE対応コメントの指示に従います。
コメントに記載されているpackageもインストールします。

### IE互換モード回避
ローカルNWにサーバを置くと、IEが *「社内だね！互換モードにするよ！表示できないよ！」*
となる場合があります。
index.htmlの\<head>に、忘れずに下記を記載しておきます。

```html:index.html
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
```

※下記、参考にさせていただきました。
https://qiita.com/rico/items/09c896290e218ed2b7c3


## 5. 検索するときには「-angularjs」をつける
「検索ワード」+「angular」でWeb検索すると、
AngularJSの記事が大量にでます。Angularの記事はほぼないです。

そこで、魔法のワード、「-angularjs」です。

```
[検索ワード] angular -angularjs
```

なんと、AngularJSの記事が除外されるではありませんか！

※下記記事にて勉強させていただきました。感謝です。
https://qiita.com/daikiojm/items/46f6b2b355f9f73536e1

## 6. Angular CLIでプロジェクトひな形を作成する
初期は公式チュートリアルのプロジェクトを改造して開発していましたが、
不要な機能を削除するのが存外大変でした。
下記コマンドで１から作り直しました。

```bash
# プロジェクト作成
ng new <プロジェクト名>

# コンポーネント|サービス作成
ng g <component|service> <コンポーネント/サービス名>

# コンポーネント作成（モジュール指定)
# モジュールたくさんあって、どこに作ればいいかわからないよ！と怒られた場合
ng g component <コンポーネント名> --module <モジュール名>

```

結果、サンプルプロジェクトを改変するより１から作成したほうが、
経験値が上がりました。

## 7. (番外編)DBはMongoDBを使う
Angularではありませんが、私の最大のミスは
バックエンドのDB選定でした。

初期に、Node.js + PostgreSQLを採用しました。
*MongoDB？いやいや、PostgreSQLの方が慣れてるし～。あれ？××実装のNode.js + PostgreSQLの記事が見つからない！
 Node.js + MongoDBの記事は山ほどあるのに！*

結果、PostgreSQLのコードをすべて捨てるという事態に。

開発速度、Web情報量ともにMongoDBが圧倒しています。
リレーショナルDBである必要がなければ、まずはMongoDBをお勧めします。

# おわりに
少しでも皆様の参考になっていただければ。では、すてきなAngularライフを！
Smalltalk(Pharo)でHMACを利用する

必要になったのでメモ。[Pharo6.1](http://pharo.org/)で確認。
[System-Hashing](http://magaloma.seasidehosting.st/System-Hashing)あたりも参考に。

# SHA256でHMACを利用する
鍵は`test`で、内容は`abc`。

```smalltalk
hmac := HMAC on: SHA256.
hmac key: 'test' asByteArray.
mac := hmac digestMessage: 'abc' asByteArray.
mac hex. 
"'d796579aed123e7b743ccaf5b150affa1223e31ecba8b88c9da9ccf7ad5e0594'"
```

#確認
[HMAC Generator / Tester Tool](https://www.freeformatter.com/hmac-generator.html)で確認。

> d796579aed123e7b743ccaf5b150affa1223e31ecba8b88c9da9ccf7ad5e0594

よさそうです。
Office365で独自ドメインを利用する(切替)場合のアプリケーションの挙動について[前編]

#Office365とは何か
サブスクリプション型で販売されているOffice及び関連サービスのこと。
今まではwordやExcel、PowerPointなどなど、一度購入してしまえば永久に使用できる買い切り型が主流でしたが、Office365のように月や年単位の一定期間費用を支払うタイプのクラウド型のサービスが出てきているのです。
買い方が異なるだけで、wordやExcel、PowerPoint使用できる製品にほぼ変わりありません。

今回はこのOffice365のサービスでonmicrosoft.comドメインから独自ドメインへ変更を行なった場合の諸々の設定について少し触れてみたいと思います。

#今回のケースさらっとまとめ
- xxx.onmicrosoft.comというカスタムドメインでOffice365を既に利用している
- xxx.onmicrosoft.com　→　abc.com(例)　に変更希望
- 現在利用しているアプリケーションへの影響はどの程度なのか

※DNS側での設定やOffice365側でのドメイン追加等については割愛しています。あくまでも、ドメインを変更した際のアプリケーションの挙動についてのお話です。

ドメインの追加設定が完了すると、Office365の管理画面のユーザ編集にて@以降のドメインを独自ドメインに変更する設定が可能になります。

![qiita00.png](https://qiita-image-store.s3.amazonaws.com/0/174392/c11dd71f-9392-cf91-4ee7-d1bd9184c140.png)

この設定を行うと、自動的に現在ログインしているOffice365(オンライン)から強制的にログアウトされます。
そのまま待つと、ログイン画面に切り替わるので新しいアカウントとPWを入力し、ログインします。
この時、PWは以前使用していたものと同じものを使用します。

web側はログイン後そのまま問題なく利用可能です。注意しなければならないのはローカルで利用しているアプリケーションです。

#ローカルのOffice関連アプリケーションは切り替え前の事前準備をしておくと安心

事前準備とは、主にアプリケーションからのサインアウトです。
※Outlookについての作業は割愛しています。(別途記事作成予定)

前述したドメインの切替前に事前準備を行なっておくと安心ですよ。

まずはExcel、Word、PowerPointのサインアウトから。
いずれか１つのアプリケーションからサインアウトすれば、その他のアプリケーションからもサインアウトされます。

![エクセル01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/70f0a494-642f-277c-37b3-57f858f4fb94.png)
![エクセル02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/2fbf6e2a-5b1a-391e-a02c-ecbfb63e5d19.png)
最後に以下のようなポップアップが出てきますが、いいえをクリックし進めます。
![エクセル04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/6835f7dd-397f-d214-d48b-b4d16f76340b.png)

Skypeを利用している場合は、Skypeも同じようにサインアウトします。
![Skype01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/6fdf867f-650e-7925-8b48-cfd680407036.png)


つづいて、OneDrive。こちらはサインアウトではなく、PCとのリンクを解除します。
作業前に現在設定されているローカルフォルダのパスを確認しておくと安心です。
![onedrive01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/a94eb52d-e9d2-d725-7949-81e0fc9d45c7.png)
画面右下、タスクバーからOneDriveのアイコンを右クリック。
![onedrive02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/a63199b8-ef82-ae47-a254-24507cab5280.png)
設定を押下。
![onedrive03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/c33f7f10-720c-31f5-1a33-86f0b5201767.png)
アカウントタブ　＞　このPCのリンクを解除
![onedrive04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/698f8ec2-0575-9f4f-05f9-2fa9239682b7.png)

![onedrive05.png](https://qiita-image-store.s3.amazonaws.com/0/174392/68b4be5a-77b8-dcd5-9f55-34a7b6699686.png)

事前準備は以上です。
事前準備が完了し、ドメインの切替が完了したら一度PCの再起動をオススメします。

次回は切替後についてまとめてみたいと思います。
リンククリックでファイルをダウンロードさせる

# これは何？
単一ファイルをリンククリックするだけでダウンロードさせたいときに使います。
セキュリティ的な考慮により、外部パラメーターでファイル名組み立て、はやってません。

# コード
```php
<?php
// ファイルパス（ドメインルートからのフルパス）
$filepath = './wp-content/DEMO.pdf';
/**
  以下は特に変更する必要はありません
 */
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
header('Content-Length: '.filesize($filepath));

// out of memoryエラーが出る場合に出力バッファリングを無効
while (ob_get_level() > 0) {
	ob_end_clean();
}
ob_start();

// ファイル出力
if ($file = fopen($filepath, 'rb')) {
	while (!feof($file) and (connection_status() == 0)) {
		echo fread($file, '4096'); // 指定したバイト数ずつ出力
		ob_flush();
	}
	ob_flush();
	fclose($file);
}
ob_end_clean();
?>
```

# デモ
### 元ファイル
http://www.musta.jp/wp-content/DEMO.pdf
### ダウンロードリンク
※ いきなりダウンロードされますのでご注意ください
http://www.musta.jp/download.php