OmniAICreator/Qiita-1.07M huggingface dataset:
Wordpress スラッグ、ポストタイプを使って画像を切り替える

最近WordpressでWebサイトを構築する案件が増えてきており、その中でも各ページごとにビジュアル画像やタイトルが変わっているデザインをもらうことが増えてきた。
コーディングのルール上imgタグへはalt属性へ代替えテキストを記述、また、レスポンシブサイト以外では基本的に画像のWidth属性とHeight属性を記述しなければならず、ちょっと面倒くさい……
うまく自動化できないかな〜と考えた結果をメモメモ。

あくまでもメモなので、用出てくる語などは別途お調べください……

もっといい方法がある！って方はコメント等で教えていただけると助かります。

## やりたいこと
- 現在見ているページを判断して、特定の画像を切り替えたい。
- 指定したaltテキストを記述したい。
- 画像のwidth値とheight値を自動的に取得して記述したい。
- お知らせなどの投稿ページはカスタムポストで。そこも画像切り替えしたい。

## 各ページのURLを決める
Wordpressの**ダッシュボード** -> **固定ページ** -> **新規追加**を選択し、
**新規の固定ページを追加**する。
固定ページのタイトルを入力すると、その下に**パーマリンク（その固定ページのURL）が表示されるので、編集ボタンを押して任意のURLへ変更**。
http:example.com/hogehoge (このhogehogeがページのスラッグ)

## 切り替えに使う画像の名前を変更
今回は**text_main_ページスラッグ.拡張子**という命名規則で指定。
この辺りの縛りはお好みで。拡張子は固定仕様。
**text_main_about.png**、**text_main_products.png**など

## functions.phpに以下のコードを記述し関数を作成
```php
function getImageSwitcher() {
  // 初期化
  $image_size = array();
  $image_alt = '';
  $alt_flag = '';

  // スラッグ、ポストタイプ取得
  // シングルページの場合タイトルがスラッグ判定を受けるのでポストタイプを取得
  // シングルページでの切り替えがない場合、スラッグ名だけでOK
  $page_name = get_page( get_the_ID() );
  $slug_name = $page_name->post_name;
  $post_type = $page_name->post_type;

  // 現在のページがシングルページの場合、$alt_flagにポストタイプを
  // 固定ページの場合はスラッグ名を$alt_flagへ格納
  if ( is_single() ) {
    $alt_flag = $post_type;
  } else {
    $alt_flag = $slug_name;
  }

  // 画像代替えテキスト設定
  switch ( $alt_flag ) {
    
    case 'news':
      $image_alt = 'お知らせ';
      break;
    case 'privacy_policy':
      $image_alt = 'プライバシーポリシー';
      break;
    case 'site_policy':
      $image_alt = 'サイトポリシー';
      break;
    case 'sitemap':
      $image_alt = 'サイトマップ';
      break;
    case 'qa':
      $image_alt = 'よくある質問';
      break;
    case 'contact':
    case 'confirm':
    case 'thanks':
      $image_alt = 'お問合せ';
      break;

    default:
      break;
  }

  // シングルの場合タイトルがスラッグになる為、post_typeで画像サイズ取得
  // $img_tagへは生成するImgタグを格納
  // getimagesize()：　画像サイズを取得するphp関数
  // getimagesize()はhttp:// https:// でアクセスする為、BASIC認証だと401エラーになり表示されない
  if ( is_single() ) {
    $image_size = getimagesize( get_template_directory_uri() . '/assets/img/text_main_' . $post_type . '.png');
    $img_tag = '<img src="'. get_template_directory_uri(). '/assets/img/text_main_'. $post_type .'.png" alt="'. $image_alt .'" '. $image_size[3] .'>';
  } else {
    $image_size = getimagesize(get_template_directory_uri().'/assets/img/text_main_'. $slug_name .'.png');
    $img_tag = '<img src="'. get_template_directory_uri(). '/assets/img/text_main_'. $slug_name .'.png" alt="'. $image_alt .'" '. $image_size[3] .'>';

  }

  // imgタグ吐き出し
  echo $img_tag;
}
```
## 画像切り替えをしたい場所へ作成した関数を記述
```index.php
<div class="mainimage_text">
  <?php getImageSwitcher();?>
</div>
```
特定のページのみに使いたい場合、Wordpressであらかじめ用意されているis_front_page()関数やis_page()関数での条件分岐と併用すると良いかも。
Jupyter notebook(Python 3.6環境)でnwdiagを使う


##はじめに
Jupyter NotebookのModuleで簡単にネットワーク図を作成できるPythonライブラリのnwdiagが
[ipthon-diags](https://bitbucket.org/vladf/ipython-diags)という形で出ています。
ただ、最終更新が2013年と古いため、
Dockerで配布されているJupyter Notebook(Python3.6の環境)でipython-diagsを試したところ、
Python3.6上では動かないモジュールでした。(Unicode Encode Errorが発生)

そこで、修正個所は多くなかったので、動くように直しました。
https://gist.github.com/a8e8269d4331b6b93e7ef90744fe0b3b.git

動作スクショ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97185/4cb70739-2d2e-8ad3-d589-42640aaab479.png)



この記事ではそのコードのJupyter Notebookへの適応手順を記載します。


##手順
- Docker imageをPullする

```bash:shell
docker pull jupyter/datascience-notebook
```

- Dockerコンテナを起動する

```bash:shell

docker run -d --name notebook -p 8888:8888 jupyter/datascience-notebook
```

- 起動したコンテナへ接続する

```bash:shell
docker exec -it  notebook /bin/bash
```

- トークンを表示し、出力されたURLへブラウザからアクセスする。

```bash:shell
jupyter notebook list
```

- アクセスしたブラウザにて、よしなにnwdiagを実行したいnotebookを作成する。(kernelはpython3を選択する)

- コンソールに戻り、nwdiagをインストールする

```bash:shell
pip install nwdiag
```
- diagmagic.pyをgit cloneする

```bash:shell

git clone https://gist.github.com/a8e8269d4331b6b93e7ef90744fe0b3b.git
```

- 作成したnotebookのディレクトリ配下の.ipython/extensions/へdiagmagic.pyをコピーする。

```bash:shell
cp a8e8269d4331b6b93e7ef90744fe0b3b/diagmagic.py <notebookの格納ディレクトリ>/.ipython/extensions/
```

- 下のスクリーンショットの様に定義して、「Run」で実行していけばネットワーク図を生成することができる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97185/4cb70739-2d2e-8ad3-d589-42640aaab479.png)
karabiner-Elementsを使ってshift + caps_lockで caps_lockを実現する方法 how to assign "shift + caps lock" to caps lock with karabiner-elements

Windowsのように、shift押しながらcaps_lockを押さないと効かないようにしたかったので
このようにしました。
自分の場合、まずcaps_lockに左commandを割り当てていますので、その前提でお読みください。

I want to assign "shift + caps lock" to caps lock like windows.
In my case, I assigned casp_lock to left_command.
This article is written based on it.

![スクリーンショット 2018-04-09 12.48.48.png](https://qiita-image-store.s3.amazonaws.com/0/55504/8e24b4fe-7255-df09-795d-a83d5be5c7b2.png)


以下のディレクトリに任意の名前でファイルを作成
In Karabiner-elements, you can put your config file in this directory.
at first, create json file in this directory.

```
/Users/[ユーザー名]/.config/karabiner/assets/complex_modifications
```

以下の内容をコピペ
create a file and copy and paste below.

```
{
  "title": "caps lock",
  "rules": [
    {
      "manipulators": [
        {
          "description": "caps lock with shift + caps lock",
          "type": "basic",
          "from": {
            "key_code": "left_command",
            "modifiers": {
              "mandatory": [ "left_shift" ],
              "optional": [ "any" ]
            }
          },
          "to": [
            {
              "key_code": "caps_lock"
            }
          ]
        }
      ]
    }
  ]
}
```

Complex-modifications -> rulesにて、Add ruleクリックすると、先ほど作成したファイル名で設定した項目が出てくるので、「Enable」を押下
The item that you set appears in Complex Modification.
After clicking "Enable", the setting will be active.
![スクリーンショット 2018-04-09 12.46.18.png](https://qiita-image-store.s3.amazonaws.com/0/55504/9c006eb0-c547-d613-7ca6-d9f78a848f23.png)

2021/10/06追記
スクリプトが動かなくなっていたので、修正しました。

参考：
[Karabiner-Elementsの設定項目をまとめました](https://qiita.com/s-show/items/a1fd228b04801477729c) @s-show 
[Karabiner-Elementの設定例について](https://qiita.com/s-show/items/40ad22c4ee4a0465fad5) @s-show
Python3 > モジュールのリロード > importlib.reload(demo)

@ Scipy lecture notes, Edition 2017.1
~~https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf~~
https://scipy-lectures.org/_downloads/ScipyLectures-simple.pdf (2019-05-12現在)

p34

> Warning: Module caching
...
In Python3 insteaad of reload is not builtin, so you have to import the importlib module first and then do:

```
In [10]: importlib.reload(demo)
```

cachingによる失敗は何度かしている。

### link

- [Jupyter + Matplotlib > dunder main(if `__name__` == '`__main__`'実行)にすると描画がされない > グローバル変数の使用 + キャッシュに基づき実行されていた? | 対処](https://qiita.com/7of9/items/3c9632f490a0bd0dc2ba)
Scipy lecture notes, Edition 2017.1 > Functions > first-class objects | 関数に変数を持たせることができる

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p29
2.4.8 Functions are objects

> Functions are first-class objects, which means they can be:
- assigned to a variable
- an item in a list (or any collection)
- passed as an argument to another function

### link

- [What are “first class” objects? @ StakOverflow
](https://stackoverflow.com/questions/245192/what-are-first-class-objects?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)
    - > In short, it means there are no restrictions on the object's use.

### 関数に変数を持たせることができる

@shiracamus さんの[コメント](https://qiita.com/7of9/items/e7e6702b1dff6c278ed7/#comment-d42dbe79b962ab0094d9)
にて関数に変数(属性、アトリビュート)を持たせることができることを教えていただきました。

情報感謝です。
Scipy lecture notes, Edition 2017.1 > イメージやコードがフッターにかぶる症状 >#239 にissueあり 

### 関連

- [Scipy lecture notes, Edition 2017.1 > typo > 3.1.5 Indexing and slicing](https://qiita.com/7of9/items/68451f39bb774123d3ae)

### '#239

上記のリンク先で報告した症状は#239としてissueになっていたようだ。
https://github.com/scipy-lectures/scipy-lecture-notes/issues/239

今後、同じような症状が見られた時には、あえてissueを出す必要はない。
Jenkinsについて

##はじめに
Ansible,Gitと調べてきましたが、今回はJenkinsについて調べます。
弊社でもよく聞くキーワードの「Jenkins」ですがいったい何者なのか自分なりにまとめました。

##Jenkinsとはいったい何者
わからないものはとりあえずググる。
>Jenkins (ジェンキンス) とは、Javaで書かれたオープンソースの継続的インテグレーションツールである。ソフトウェアのビルド、検証、サーバへのインストール等の一連作業を自動化する事が出来る

ほう、また困ったキーワードが出てきてしまいました。
継続的インテグレーションツールとな、、

##継続的インテグレーション？
<b>C</b>ontinuous <b>I</b>ntegration(継続的インテグレーション)
↑略して<b>"CI"</b>と呼ばれたりもしている(こちらのほうが聞いたことがある)
このCIだが、主にプログラマがアプリ開発時の品質改善やリリースまでの期間をなるべく短くするのための習慣のことらしい。

具体的には、以下のような恩恵がある

①作業ミスの削減
②開発者の作業量軽減
③品質の向上
④素早い開発

すごい。
いままで人の手で行っていた「検証」や「プロジェクト管理」を肩代わりしてくれる、おじさん(機械)それがJenkins

参考URL：
http://www.exmotion.co.jp/solution/legacy-4.html
https://www.techmatrix.co.jp/product/cisolution/cisolution1.html

前回紹介した、Gitとの連携も可能
たとえばGitで新しくファイルがpushされるとJenkinsにそれを通知、受け取ったJenkinsはGitからpullして実行。

ごちゃごちゃしてしまうが、Jenkinsは実行の指示出し係(トリガ)？かな
いままでサーバに入って人間の手で「ansible-playbook -i XXX YYYY.yml」とか書いていたコマンドを代わりに送り込んでくれるおじさんってイメージです。

##インストールしてみた
さっそくinstallしてみる

環境: 
centos7
java-1.8.0-openjdk
※javaのバージョンは最新にしておきましょう。
さっそくyumでとる！

~~~
[vagrant@centos7 ~]$ sudo yum -y install jenkins
~~(略)~~
Downloading packages:
jenkins-2.114-1.1.noarch.rpm                                                                                                                                |  71 MB  00:00:32
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : jenkins-2.114-1.1.noarch                                                                                                                                        1/1
  Verifying  : jenkins-2.114-1.1.noarch                                                                                                                                        1/1

Installed:
  jenkins.noarch 0:2.114-1.1

Complete!
[vagrant@centos7 ~]$
~~~


取れました
さっそく起動させる

~~~
[vagrant@centos7 ~]$ sudo systemctl start jenkins
[vagrant@centos7 ~]$ systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Mon 2018-04-09 03:16:06 UTC; 40s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1264 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/jenkins.service
           mq1283 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=...
[vagrant@centos7 ~]$
~~~

さっそくログインしてみます。
デフォルトのポートが8080らしいので
localhost:8080にhttpでアクセスします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246478/6d32573e-638d-b716-876e-8cac00fa668a.png)

おおぉ
うまくいきましたね。


##まとめ
ざっくりとJenkinsとはどんなものかを紹介しました。
高品質を維持すること、作業リスクを減らす、作業員の負担を減らすツールとして注目されているツールでした。
主にアプリ側やサーバ側の範疇な気もしますがAnsibleがネットワークに対応してきているなどの理由からネットワーク屋でも取り入れていきたいツールでもあります。

自動化ってキーワードで追いかけるとよくぶつかる
Jenkinsおじさんですが、ほんの少しは理解をすることができました。
今後は実際に動かしながら身に着けていきたいと思います。
Bootbox.js 「モーダル中のモーダル」のスクロール問題を何とかしてみる

Bootstrap のモーダルダイアログ「Bootbox」で、モーダルの中にモーダルを作ると発生する件

![bf.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/4ba19cdb-afa3-f02a-3350-c0f3fcdb9c1f.gif)

手前をスクロールさせようとすると、奥がスクロールしてしまう。お前じゃないんだ・・
記憶が正しければ前に公式を調べたところ「モーダルinモーダル？！そんなもの対応してないに決まってるじゃないか」といった応答だったはず・・
あとはスクロールだけなんです・・

今回は時間があったので、何とかしてみました。（ダイアログの呼び出しに追記するだけ）
モーダルを閉じる時、他のモーダルが残っていたら、「まだモーダル中」とテレビ前でうたた寝するお父さんを召喚します。
（【更新】：反応が鈍かったので、改善しました。イベントの呼び出し方を勘違いしていました）

```js
bootbox.dialog({
    //ダイアログ設定
})
.off("shown.bs.modal")
.on("hidden.bs.modal",function(){ 
    if(document.querySelectorAll(".bootbox.modal").length){
        document.body.classList.add("modal-open");
    }
});
```

とりあえず回避できた。（無理やり）
![af.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/4001769d-37e8-8564-2b77-4f529fd1c874.gif)

実装例（CodePen）
https://codepen.io/RAWSEQ/pen/geBQVv

実は既に対応済みだよ等の情報あればください。
初心者がつまづいた、PWAアプリSafari版でホームボタンのアイコンが読み込まれない件

## 前置き

最近界隈をよく賑わせているPWAですが、皆様の記憶に新しい通り3月末のiOS 11.3リリースに伴いSafariにも対応が開始されました。

## 問題

私もReact × github pages × PWAで試してみたのですが、
AndroidはChromeからホーム画面にで上手く表示されたものの、
iOSではSafariからホーム画面に表示したいはずのアイコンが上手く反映されませんでした。

## 原因
先に結論をいうと、PWAアプリに必須であるmanifest.jsonに、ホームアイコンやらなんやらを指定して表示させるのですが、ここにアイコン画像を指定していても未だiOSの場合反映されないということが判明いたしました。

## 対応方法
ではどうやってSafariでホームに追加した時に指定したアイコンを反映させるのか、
`<link rel="apple-touch-icon" href="%PUBLIC_URL%/___画像___.png" sizes="192x192"/>`
この "apple-touch-icon" が含まれたリンク要素をindex.htmlの中に埋め込む必要があります。
またsizesでちゃんとアイコンサイズも指定してあげる必要があります。

※AndroidのみのPWA化であればindex.htmlに上記を埋め込む必要はないです。

## 所感
- 3月末に対応されたiOSのPWAですので、まだまだ対応されていない部分が多いです。あとは英語でググってもなかなかiOS版PWAでヒットしないことがあります。
- apple-touch-iconの埋め込みはウェブクリップ等ネイティブユーザー向けWEB開発をされていた方には常識だと思いますが、私は初めての経験だったため結構ハマって抜け出せなかったです。

おしまい。

## ※ 2018/08/01 追加　　

現状スプラッシュスクリーンのアイコンも同じようにindex.htmlの<head></head>内に専用のタグを埋め込まないといけません。
ホームアイコンの件もまだmanifest.jsonでの処理はできません。
そんな現状を見兼ねたのか、googleが[PWACompat](https://developers.google.com/web/updates/2018/07/pwacompat)という、ホームアイコンもスプラッシュスクリーンアイコンもiOS(safari)で簡単に表示させられるアーキテクチャを作ってくれていたようです。
  
**(引用URL)**
■github
https://github.com/GoogleChromeLabs/pwacompat
■海外SEO情報ブログ
https://www.suzukikenichi.com/blog/pwacompat-to-bring-web-app-manifest-to-safari-for-ios/
■Medium
https://medium.com/@firt/you-shouldnt-use-chrome-s-pwacompat-library-in-your-progressive-web-apps-6b3496faab62
JuliaでTensorFlow その2: 線形回帰をやってみる


Julia 0.6.2でTensorFlowを使う。その２。
その１は
https://qiita.com/cometscome_phys/items/358bc4a1feaec1c7fa14
ここでは、簡単な線形回帰をやってみる。

#元のデータの生成
まずはじめに、元のデータを
$$
y = ax+b +{\rm noise}
$$
として作る。ここで、noiseを適当に発生させておくことで、データが直線からずれることになる。
このようなズレがある場合に、元の直線を推測できるか($a$と$b$を推測できるか)、という問題。
元の直線は

```julia:original.jl 
using Plots
ENV["PLOTS_TEST"] = "true"
gr()
n = 10
x0 = linspace(-1,1,n)
noise = 0.5*rand(linspace(-1,1),n)
a0 = 3.0
b0 = 1.0
y0 = a0.*x0 + b0 + noise
plot(x0,y0,marker=:circle,label="Data")
savefig("data.png")
```
で描くことができる。
これを実行すると
![data.png](https://qiita-image-store.s3.amazonaws.com/0/246113/6a217d53-8a3d-4c36-868f-6c3703f43cb8.png)
というグラフが得られる。
なお、Plotsのバックエンドのgrが6倍大きな図を作ってしまう問題があるので、```ENV["PLOTS_TEST"] = "true" ```を使っている。詳しくは
http://nbviewer.jupyter.org/gist/genkuroki/3d6dbf52a3e52eb7c664bc88632c81d3
を参照。

# グラフの設計
次に、その１と同じようにグラフを設計してみよう。
まず、$x_i$をインプットデータ、$y_i$をアウトプットデータとして、この$(x_i,y_i)$の組が複数ある状況を考える（上のコードでは10個）。
そして、
データが
$$
y_i = a x_i + b
$$
という直線に従っていると仮定する。
この仮定のもと、一番もっともらしい$a$と$b$を求めるのが線形回帰である。
そして、二乗誤差：
$$
{\rm loss} = \sum_i (y - y_i)^2
$$
が一番小さくなるような$a$と$b$が、一番もっともらしいとする。

TensorFlowでは、何かの関数を最小化することが簡単にできる。
何を最小化するか、どのように最小化するかの情報を設定しておけばよい。
その１の小人の例で例えると、小人Bに「最小化しろ」といえばあとはよしなにやってくれるのである。
まず、小人Aへの指令（グラフ作成）は

```julia:test1.jl 
using TensorFlow

x = placeholder(Float64)
yout = placeholder(Float64)
a = Variable(2.0)
b = Variable(0.0)
y = a.*x+b
diff = y-yout
loss = nn.l2_loss(diff)
optimizer = train.AdamOptimizer()
minimize = train.minimize(optimizer, loss)
```
となる。ここでは、minimizeを小人Bに指定すれば、lossを最小化してくれることになる。
# グラフの実行
次に、実際の計算を小人Bにやらせるコードは

```julia:test1.jl 
sess = Session()
run(sess, global_variables_initializer())
nt = 10000
for i in 1:nt
    run(sess, minimize, Dict(x=>x0,yout=>y0))
    if i%1000==0
        println(i,"\t",run(sess, loss, Dict(x=>x0,yout=>y0)))
    end
end
```
となる。
出力結果は

```
1000	0.5525778742090897
2000	0.2062854331360348
3000	0.20391311222929595
4000	0.20391251120152726
5000	0.20391251120114107
6000	0.203912511201141
7000	0.2039125112011411
8000	0.20391251120114104
9000	0.20391251120114096
10000	0.20391251120114093
```
となる。
ここで、最小化は逐次的に行われるので、何回も繰り返すことで少しずつlossが小さくなっていくことに注意。ある程度まで回数をこなすと、lossの値は変わらなくなる。この時、今仮定している線形のモデルでの最良の$a$と$b$が得られている可能性が高い（今後言及する「過学習」が起きた場合には、その限りではない）。

最後に、$a$や$b$の値を表示させ、グラフをプロットするには、

```julia:test1.jl 
ae = run(sess, a)
be = run(sess, b)
ye = run(sess, y, Dict(x=>x0,yout=>y0))
println("a = ", ae," b = ", be)
close(sess)
plot(x0,[y0,ye],label=["Data","Estimation"],marker=:circle)
```
とすればよい。そして、
```
a = 3.0662337662337653 b = 0.8816326530612243
```
という値が得られる。
グラフは

![comparison.png](https://qiita-image-store.s3.amazonaws.com/0/246113/e824d9af-b412-7463-9a0e-52c83663df19.png)

となる。
それなりにいい感じにフィッティングされている。
PHP 配列のマージいろいろ

# はじめに
PHPの配列マージで新しい発見があったのでのまとめ

# やりたかったこと
設定ファイルの上書きで、envファイルのような仕組みがなかったので自作する。
配列で管理している設定ファイルに対して、別ファイルを用意して設定内容を上書きする。
設定内容は階層がまばらなため、多次元配列で管理。

# 欲しい結果例
```
# ベースの設定
$base = [
    "db" => [
        "adapter" => "pdo_mysql",
        "params" => [
            "host" => "production.db.xxxxxx",
            "user" => "db_user",
            "dbname" => "prod_db",
            "password" => "xyz12345"
        ]
    ]
];

# 上書き内容 （hostとdbnameのみ上書き）
$env = [
    "db" => [
        "params" => [
            "host" => "localhost",
            "dbname" => "local_db"
        ]
    ]
];

# 欲しい結果
$result = [
    "db" => [
        "adapter" => "pdo_mysql",
        "params" => [
            "host" => "localhost",
            "user" => "db_user",
            "dbname" => "local_db",
            "password" => "xyz12345"
        ]
    ]
];

```

# array_merge()
再帰処理は行わず、第1階層の同一キーの要素を上書き。
※ キーが数値の場合は、キーがゼロから始まる連続した数値に置き換えられ、後の配列が前の配列の後ろに追加される。

```
$result = array_merge($base, $env);
echo print_r($result, 1);

# 出力結果
Array
(
    [db] => Array
        (
            [params] => Array
                (
                    [host] => localhost
                    [dbname] => local_db
                )

        )

)

```

# array_merge_recursive()
再帰処理でマージを行ない、同一キーの要素は上書きではなく、前の配列の値を残した形で追加される。

```
$result = array_merge_recursive($base, $env);
echo print_r($result, 1);

# 出力結果
Array
(
    [db] => Array
        (
            [adapter] => pdo_mysql
            [params] => Array
                (
                    [host] => Array
                        (
                            [0] => production.db.xxxxxx
                            [1] => localhost
                        )

                    [user] => db_user
                    [dbname] => Array
                        (
                            [0] => prod_db
                            [1] => local_db
                        )

                    [password] => xyz12345
                )

        )

)
```

# array_replace()
再帰処理は行わず、第1階層の同一キーの要素を上書き。（キーが文字列の場合、array_mergeと同じ挙動）
※ キーが数字の場合でも、同一キーであれば上書きを実施。

```
$result = array_merge_recursive($base, $env);
echo print_r($result, 1);

# 出力結果
Array
(
    [db] => Array
        (
            [params] => Array
                (
                    [host] => localhost
                    [dbname] => local_db
                )

        )

)

```

# array_replace_recursive()
再帰処理で同一キーの要素を上書き。

```
$result = array_replace_recursive($base, $env);
echo print_r($result, 1);

# 出力結果
Array
(
    [db] => Array
        (
            [adapter] => pdo_mysql
            [params] => Array
                (
                    [host] => localhost
                    [user] => db_user
                    [dbname] => local_db
                    [password] => xyz12345
                )

        )

)

```

# 結論
今回やりたかったことは、array_replace_recursive()で実現できる。
array_mergeはキーが数字の場合の挙動に要注意。
riot.js click demo

### riot.tag(...)は~~~将来的にサポートされないらしいが、誤訳~~~一部機能制限があるが、short coding用として便利。
```html
<script src="//gnjo.github.io/riot.js"></script>
<h1>Acme community</h1>
<test></test>
```
```js
riot.tag(
 'test'
 ,`<h3 class={cls} onclick={click}>{message}</h3>`
 ,`.red{color:red}`
 , function(opts){
   message='helloxyz'
   click=function(ev){ cls='red' }
})
;
riot.mount('*');//finally one
```

### clickするごとにカラーを変更
```html
<script src="//gnjo.github.io/riot.js"></script>
<script src="//gnjo.github.io/colorNames.js"></script>
<h1>Acme community</h1>
<test></test>
```
```js

riot.tag(
 'test'
 ,`<link gvar={gvar}><h3 onclick={click} style="color:{c};cursor:pointer">{message}</h3>`
 , function(opts){
   gvar={num:0,cArray:opts.cArray}
   message='click me'
   console.log(this);
   //style need "" //http://riotjs.com/api/#manual-construction
   click=function(ev){
    c='#'+gvar.cArray[gvar.num++].hex
   }
});

//finally one;
window.cArray=Object.keys(window.colorNames).map((d)=>{return{name:d,hex:window.colorNames[d]};});
riot.mount('test',{cArray:window.cArray});

```
LINUX（CentOS）のフォントのあれこれ

#CentOS7でフォントを少しいじるメモ

リナックスにフォントのインストールやあれこれする必要があった。
毎回ググってたので、ここにメモする。
意外とfontconfigに関する情報って纏まってない気がする。

#インストール
フォントのインストールは実体のフォントファイルを特定のディレクトリにコピーするだけでいい。

###・すべてのユーザー向け
全リナックスユーザーで共通に使用するフォントは
/usr/share/fonts/
にコピーする

```bash
cp /path/to/fontfile /usr/share/fonts
```
ちなみに/usr/share/fonts/に新たにディレクトリを作成した階層構造にしても問題ない。

```bash
cp /path/to/fontfile /usr/share/fonts/AdditionalFonts/
```

###・特定のユーザー専用
特定のユーザーにのみフォントの追加を行う場合、
追加したいユーザーのホームディレクトリに
.local/share/fonts/
というディレクトリを作って、その配下にフォントファイルをコピーする
（すでに存在していれば作成する必要無し。）

```bash
cd /home/username　
mkdir ./.local/share/fonts/ #すでにあれば必要無し
cp path/to/fontfile .local/share/fonts/
```
こんな感じでOKだと思う。

#fc-list

インストール済みフォントはfc-listで取得できる。

```bash
fc-list
```
ちなみに

```bash
fc-list -v
```
とすると一覧の情報が詳細になる。

ここで取得できるのは、fc-listコマンドを実行したユーザーが使えるフォントである。
ユーザーAに対してインストールしたフォントはたとえrootで実行しても表示されないので注意。

#fc-match
あるキーワードを渡すと、それにマッチすると思われたフォントの情報が返される。

こんな感じ

```bash 
fc-match serif
```
すると返り値はこんな感じ

```bash 
SourceHanSerif-Medium.otf: "Source Han Serif" "Medium"
#ファイル名　　　　　　　　　　フォント名　　 ウェイト
```
ウェイトを指定して検索する場合

```bash 
fc-match serif:weight=bold
```
や

```bash 
fc-match serif:bold
```

のように```:weight=```をつけたり```:```区切ってやるといいみたい。
ちなみにfc-matchでも```-v```のオプションを付けることで、
詳細なフォント情報を出力させることができる

そのほかの条件で検索する場合
ファイル名なら

```bash
fc-match :file="/usr/share/fonts/gen_min/SourceHanSerif-Regular.otf"
```

ポストスクリプト名なら

```bash
fc-match :postscriptname=SourceHanSerif-Regular
```
こう

そんなかんじ
let のない Lisp処理系で lambda を let のかわりにつかう

無いものを嘆いていても仕方がないので、できることを模索しよう。

autolisp系のLispでは let が使えず、ローカル変数は、関数の頭でしか宣言できない。また、use strict 相当のものがないため、関数が長くなるとローカル変数の宣言漏れがないかどうかをチェックするのも（宣言するところと使用する場所が離れているため）結構たいへんだ。

そんな折、[let が lambda の糖衣構文である処理系もあるという話](http://www.shido.info/lisp/scheme6.html)を聞いた。なるほど、let は lambda の変形なのか。ということで、lambda で let 相当のことをやってみよう。

```test-lambda.lsp
(defun C:test-lambda (/ tmp)
  (setq tmp "<global value>")
  (princ "\nBefore=")
  (prin1 tmp)
  ((lambda (/ tmp) ; let local
     (setq tmp "<local value>")
     (princ "\nIn lambda=")
     (prin1 tmp)
  )) ; end local
  (princ "\nAfter=")
  (prin1 tmp)
  (princ)
)
```

思ったほど、見づらくない。lambda と同じ行に「`; let local`」と書くようにすれば、他の読み手にも分かってもらえそう。動作結果はどうだろう。

```
: TEST-LAMBDA

Before="<global value>"
In lambda="<local value>"
After="<global value>"
```

よしよし
uGUIでMaxHeightのようなレイアウトを実現したい（iPhoneX対応）

![MaxHeight.gif](https://qiita-image-store.s3.amazonaws.com/0/53934/7975e54b-8026-6093-a908-3f568f53b6d9.gif)
こんな感じで画面の縦横比によって各uGUI要素がいい感じになるレイアウトの作り方。
Header/Footerは画面上下に固定され、Contentは伸縮する。指定したMaxHeightを超えると、Contentの伸縮が止まり、上下余白用の要素が出現する。

# 背景
そもそもはiPhoneXやGalaxy S8のような超縦長の端末に対応するために考えた策。9:16を想定したゲームUIでもある程度縦横比の変化は許容できるが、1:2を超える超縦長になってくると、どうしても意図したデザインや操作性とは異なってしまうので、伸縮の限界点を指定しつつ、見栄えを保つための余白用のデザインを用意しようという発想。また、限界点をうまく調整すればiPhoneXの画面上部の切り欠きに対応したデザインにできる。理想では、端末を判別して個別にレイアウトを調整するのがベストではあるが、それではUnityでiOS/Androidを同時に開発するメリットが下がってしまうので、できるだけ個別対応はしたくなかった。しかし最近はAQUOS R compactなど画面が超縦長でなくとも切り欠きがある端末が出てきてしまったので結局この策は短命に終わった。（アプリごとにフル画面で表示するかどうかのサポート機能が端末側で用意されていたりするのでそれに頼るのはあり）

# 構成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/1da2b6fe-7061-2799-a00e-3a8c891eabcd.png)

## Canvas（親）のコンポーネント
Canvas Scalerでスケーリングしているため横幅は変わらない。
`Vertical Layout Group` を設定しているのが肝。（Layout Groupとしての機能が使えれば良い）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/35302aaf-e307-84ec-b8d5-53aedf3a7de4.png)

### Background（背景）
画面サイズに関わらず全画面表示させるため `ignore layout` を設定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/9ba84cac-7c37-5eb9-8e93-2e75d63bef54.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/4e1b09a0-b852-a9c6-0510-94af03946dc1.png)

### Content Area
`Preferred Height` を設定するとそれ以上は大きくならない。設定した値より小さい場合は親の `Layout Group` の機能によってよしなに高さが調整される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53934/8c728879-51a9-2d58-ab58-a6c61624f9d6.png)

# レイアウトサンプル
https://github.com/morigamix/MaxHeightSample

# 参考資料
iPhoneX対応の他の方法
https://qiita.com/tkyaji/items/8cdc0a4324d4e89633e8

サイズ
https://qiita.com/usagimaru/items/761e9a5f3d78b1939df8

ガイドライン
https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/
Kotlinのrun, let, with, apply, alsoでthis/itが使えるのかどれか

Kotlinで使えるrun,let,with,applyのいまいち違いが分からず、どれがthisが使えてitがダメなのか理解できていないので試した。

# よく見るアレ

この表が結論なのだが…

| 戻り値\レシーバ | it   | this  |
|-----------------|------|-------|
| 結果            | let  | run / with   |
| 自身            | also | apply |

実際に試して覚えることにした。

あと、使用用途もついでに書いた。

# run

- this : 使える
- it : 使えない

```kotlin
    val string = "a"
    val result = string.run {
        println(this) // => a
        //println(it) // エラー  itは使えない
        1 // 戻り値
    }
    println(result) // => 1
```

### 使用用途
nullの場合の制御に使える

```kotlin
    val string: String? = null
    val result = string ?: run {
        "nullだぞ"
    }
    println(result) // => nullだぞ
```

# let

- this : 使えない
- it : 使える

```kotlin
    val string = "a"
    val result = string.let {
        //println(this) // エラー  thisは定義されていない
        println(it) // => a
        2 // 戻り値
    }
    println(result) // => 2
```

### 使用用途
null時の制御に便利

```kotlin
    val string: String? = "a"
    val result = string?.let {
        "nullじゃないよ"
    }
    println(result) // => nullじゃないよ
```

# with

- this : 使える
- it : 使えない

```kotlin
    val string = "a"
    val result = with(string) {
        println(this) // => a
        //println(it) // エラー  itは使えない
        3 // 戻り値
    }
    println(result) // => 3
```
### 使用用途
イマイチ分からない、runでいいじゃんって思った

# apply

- this : 使える
- it : 使えない
- return使えない！

```kotlin
    //apply
    val string = "a"
    val result = string.apply {
        println(this) // => a
        //println(it) // エラー  itは使えない
        4 // applyブロック内ではreturnは使えない
    }
    println(result) // => a
```

### 使用用途
FragmentをnewInstanceしてBundleをセットするパターンによく使う

```kotlin
    companion object {
        // applyの出番!!
        fun newInstance(args: Bundle?): MyFragment =
                MyFragment().apply {
                    args ?: run { Bundle() }
                    arguments = args
                }
    }
```

# also

- this : 使えない
- it : 使える
- return使えない！


```kotlin
    val string = "a"
    val result = string.also {
        // println(this) // エラー  thisは使えない
        println(it) // => a
        5
    }
    println(result) // => a
```

### 使用用途

applyと似ているが、ラムダ内外でthisの意味が変わらず。
以下はViewのクリックイベントに使用している。

```kotlin
val button = Button(this).also { button -> 
  button.text = "Click me"
  button.setOnClickListener { 
    startActivity(Intent(this, NextActivity::class.java))
  }
}

```
gulp (v4) の削除タスク 〜 特定のディレクトリ/ファイルを除外


ファイルやディレクトリの削除をしてくれるパッケージ [del (npm)](https://www.npmjs.com/package/del) を使う。
del は rimraf に比べ以下の点が優れている。

* 対象ファイルを柔軟に指定できる (複数、glob)
* 保護機能
  - カレントディレクトリ以上の削除には、要 force オプション
  - Dry Run 機能 (実際には削除せず、対象ファイルを表示してくれる)
* [Promise API](https://qiita.com/koki_cheese/items/c559da338a3d307c9d88) .then() で"成功なら続けて処理" ができる

## サンプル

**※ 【重要】試す場合は要バックアップ。意図せず重要なファイルを削除してしまう可能性がある。**

以下のディレクトリ構成で、ルートフォルダ(project)から「dev ディレクトリ以外」のファイルを全削除したい場合

```
project/
 ├ dev/
 │  ├ gulpfile.babel.js
 │  ├ package.json
 │  ├ node_modules/
 │  ├ src/
 │  │  ├ style.scss
 │  │  ├ js/
 │  │  │  ├ main.js
 │  │  │  ├ sub.js 
 │  │  │  ├ vendor/
 ├ index.html 
 ├ style.css
 ├ js/
 │  ├ main.bundle.js
 │  ├ vendor.bundle.js
 ├ 
```

`npx gulp clean` で実行
(Babel で es6(ES2015) が動く環境にしているのが前提)

```gulpfile.babel.js
import path from 'path';
import del from 'del';
import gulp from 'gulp';

/**
 * 対象ファイルのパス
 */
const rootdir = path.resolve(__dirname + '/..');
const paths = {
  del([
    rootdir + '/**',
    '!' + rootdir, // これがないと自身のディレクトリ自体が全削除されてしまう😱
    '!' + rootdir + '/dev', // これがないと dev 自体が全削除されてしまう
    '!' + rootdir + '/dev/**'
  ]);
};


/**
 * gulp の削除タスク
 */
export const clean = () => del(
  paths.del,
  {
    force: true, // カレントディレクトリ以上を対象にするなら必要
    dryRun: true // テスト(本番時はコメントアウト)
  }
).then(paths => {
  // eslint-disable-next-line no-console
  console.log('Files and folders that would be deleted:\n', paths.join('\n'));
});
```

glob パターン `**` は、全ての子要素と親を対象とするので、除外しないと意図しないディレクトリが削除されてしまう。例えば、`[rootdir, '!' + rootdir + '/dev/**/*']` だとルートディレクトリごと消えてしまう






## 参考記事

* [del - npm](https://www.npmjs.com/package/del)
* [isaacs/node-glob: glob functionality for node.js](https://github.com/isaacs/node-glob)
* [gulp：特定のディレクトリやファイルを対象から除外する方法 | NxWorld](https://www.nxworld.net/services-resource/gulp-exclude-files-and-directories-task.html)
Android-SDKのパッケージがインストできないときは

Android-SDKのSDKとAVDのマネージャーのインストールが出来たので、パッケージのインストも試みました。

でも、エラーが出てインストールできませんでした。
エラーを自動翻訳したところ、tempファイルを作ることが出来ませんという内容でした。
SDKは、管理者権限でないとインストールできないとネット検索して確認できたので、SDKのフォルダのアクセス権限を修正しました。
それでも、だめでした。

そのため、SDKマネージャーを右クリックして、管理者として実行を選択して起動したところ、無事にインストール出来ました。

![キャプチャ0408010.png](https://qiita-image-store.s3.amazonaws.com/0/20977/2d64a5a0-c46d-c611-18ba-118a28d2a450.png)


![キャプチャ040809.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/f507ab08-2012-cc64-1692-836e65aaf418.png)

ただ、画像のように空き容量が無くなってしまいました。
インストールしたパッケージは、１つのos分のみでしたが、その中でハードウェアのイメージを絞り込むなどして1GB程度空きを作りました。
でも、新しくAVDを作ろうとしたら、ディスク容量が足りずできませんでした。

ダウンロードフォルダを空にしたら2GB空いたので、実機のデバックのみで行っていきます。

アプリ開発には、i5で4GB以上のRAMで256GBの内蔵ストレージのパソコンが必要と痛感しました。
エミュレーターを動かすのに、空き容量も1GB以上必要ですし。
RAMも8GBあれば、安心だと思います。

私のMacBookAirは、キーボード壊れているので、外付けのUSBキーボードを使っています。
USBでないと、起動するときのパスワードを入力できないからです。
空き容量も10GBなので、SDKのパッケージをインストールしたら、同じように両量不足になると思います。

アプリ開発をしようとする人は、内蔵ストレージは、大きいサイズのパソコンを購入されると良いと思います。
CPUも、i5はあった方が良いと思います。
Windowsは、PRO版が良いと思います。
hyper-Vのエミュレーターを使うことが出来るからです。
virtualBOXを使う人は、競合すあるので気を付けないといけないようですが。

今回数年ぶりにAndroidアプリを作るあたり、忘れていたこともあったので時代に合った開発環境を学ぶことが出来て、良かったです。

SDKのバージョンが上がったのでGUIが使えないことも、知りました。
今は、SDKをインストールするのではなく、Android studioをインストールして環境を作ることも知りました。

色々と試したいのですが、内蔵ストレージの空きが無いので、新しくパソコンを買ったときに、いろんな環境を作って体験したいと思っています。
秀丸エディタ > エクスプローラからファイルを秀丸エディタで開く > 右クリック, N, H (sendto登録後)

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
秀丸エディタ Version 8.79
```

秀丸エディタでソースファイルをすぐに開きたい。

### 準備

- `shell:sendto`にて秀丸エディタのショートカットを登録
    - [SendToフォルダを開く @ atmarkIT](http://www.atmarkit.co.jp/ait/articles/1109/30/news131.html)
    - `C:\Program Files (x86)\Hidemaru\Hidemaru.exe`

### 開く手順

1. エクスプローラでファイル上で右クリック
    - 右手
2. <kbd>N</kbd>
    - 左手
3. <kbd>H</kbd>
    - 左手

NとHが近いので、作業しやすい。


### 失敗条件

コンテキストメニューを書替えてしまうソフトがインストールされていると、上記の動作に失敗するかもしれない。

Dr**boxとか。

Hで始まる他のソフトがsendtoにある場合も失敗する。
MindMup 2 > error > your changes are not saved > 対処

```txt:動作環境
Windows 8.1 Pro (64bit)
Google Chrome バージョン: 65.0.3325.181（Official Build） （64 ビット）
```

[MindMup 2](https://www.mindmup.com/)を使用中、下記のメッセージが上部に赤色表示されるようになった。

> your changes are not saved

作業マップが消えてしまう。

下記の対処をした。

1. File > Download as > Mindmup形式でダウンロード
2. ブラウザの別タブでMindMupにログイン
3. Importで手順1のファイルを読込む
4. 古いファイルを消す

ネットワークトラブル時、Star Trek Next GenerationのPicard艦長が頭を抱えている画像が表示される。
その際には「your changes are not saved」でないか確認し、保存されない場合は上記の対処をすること。
SQL Serverのバージョンが異なるため復元に失敗する

# SQL Serverで古いバージョンへDB構造を移したい
## 古いバージョンへは直接復元ができない
開発環境から実行環境へ、テーブル構造を移し込みたい。
開発環境のSQL Server Management Studioでバックアップを作成し、実行環境でDBを復元しようとしたところ、エラーが出た。

>データベース　×××　の復元に失敗しました。(Microsoft.SqlServer.Management.RelationalEngineTasks）
追加情報：System.Data.SqlClient。SqlError:データベースはバージョン　×××　を実行中のサーバーにバックアップされました。このバージョンは、このサーバー（バージョン　×××　を実行）とは互換性がありません。（略）（Microsoft.SqlServer.SmoExtended）

このエラーが出た手順は、以下の通り。
リストア先で新しいDBを作成する（以下の例ではProduct_MngというDBを作成した）。
タスク → 復元 → データベース を選択する。

![restore1.png](https://qiita-image-store.s3.amazonaws.com/0/241999/f54e52d1-f35c-3af6-202b-0b4cca69a4ee.png)

データベースの復元ウィンドウが開かれるので、バックアップデバイスを選択して、OKをクリックする。

![restore2.png](https://qiita-image-store.s3.amazonaws.com/0/241999/63abb50e-0ab4-ad0c-e418-8f45b21c4f03.png)

すると前述のエラーが表示された。

![restore3.png](https://qiita-image-store.s3.amazonaws.com/0/241999/4864dcb7-ca48-15da-28ba-fd66de27607a.png)

## 原因
SQL Serverのバージョンが異なることが原因。上位互換がなく、新しいバージョンのバックアップを古いバージョンでリストアすることはできない。バックアップを作った開発環境のSQL Serverと、リストアする実行環境のSQL Serverのバージョンを調べてみる。
### SQL Serverのバージョンの調べ方

SQL Server Management Studioのヘルプ → バージョン情報から表示されるバージョンは、Management Studioのバージョンであって、SQL Serverのバージョンではない。SQL Serverのバージョンを調べるには、Management Studioにて以下のコマンドを入力するとよい。

```SQLQuery1.sql
SELECT @@VERSION
```

バックアップしたSQL Serverのバージョンは、2016 SP1だった。
![restore-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/20cb533c-66d0-e03e-5154-7e5a403c520a.png)


リストアするSQL Serverのバージョンは、2014だった。
![restore5.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/a966f69b-651f-8f95-fa62-c2f4f7075ae4.png)

このような場合は直接復元ができない。SQL Serverのバージョンを最新に統一すれば問題ないのだが、実行環境を変更できない事情があるため、該当の2014をバージョンアップするわけにはいかない。
## 復元方法
直接復元ができないので、テーブルごとに作成スクリプトを保存し、それをリストア先で実行することにした。
バックアップ元のSQL Server Management Studioで、各テーブルごとに右クリックからテーブルをスクリプト化 → 新規作成 → ファイル を選択する。その後、適当なファイル名を付けて保存する。

![restore10.png](https://qiita-image-store.s3.amazonaws.com/0/241999/da610a55-9779-cb17-fc1f-874cd0839a0e.png)

次に、リストア先で、保存したファイルを開き、Product_Mngのデータベースを選択して実行する。テーブル作成に成功すれば「コマンドは正常に完了しました。」と表示される。

![restore11.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/d55fe588-d906-e7ed-830b-a57e2b88f01a.png)

作成できたテーブルを確認すると、正しく構造が正しく移し込まれている。

![restore12.PNG](https://qiita-image-store.s3.amazonaws.com/0/241999/7d81001b-21e0-6f1f-310b-2acbbe7055d7.png)
Amazon SumerianのLimited Previewのファーストレビュー

以前に申請を出していたAmazon Sumerianのプレビュー審査に通過して利用できるようになったのでそのレビューです。

# Sumerianって何？

という人も多いかもしれません。昨年の冬にドカドカ発表されたAWS関連の新機能の一つで、VR/ARコンテンツを簡単に作ってWeb公開できるツールです。
ちなみに正式版の利用は有料で、主に公開するVRコンテンツの容量とトラフィックに課金されます。

# まずは触ってみる

AWSのマネジメントコンソールから起動すると次のダッシュボードが開きます。

![SnapCrab_NoName_2018-4-9_9-9-51_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/51434/d62854f5-f5d1-ca69-8a9a-14de2c4c591b.png)

プリセットのシーン（プロジェクトのようなもの）がいくつも用意されています。

今回はTrainingRoomというシーンから新規作成してみます。

![SnapCrab_NoName_2018-4-9_9-13-29_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/51434/58418925-c376-a26f-0e5d-a72d6d0c0aa8.png)

Sumerian自体の説明にもありますが、このサービスの利用用途の一つとして、遠隔拠点の社員へのリモートトレーニングを想定しているようで、このプリセットもそのような利用を想定しているように思います。

広々としたスペースにプロジェクターや机が置かれ、窓の外には緑豊かな林が見えます。

作成したシーンを開いたら、VR機能を追加してみます。
画面上部にあるImport Assetから、CoreVRアセットをシーンに追加します。

![SnapCrab_NoName_2018-4-9_9-14-54_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/51434/ace74cd7-822a-3865-19f6-61ac5d1030cd.png)

CoreVR以外にも、椅子や説明用のアバターなどたくさんのアセットが用意されています。（ただ、UnityやUnrealEngineのような歴史のあるツールに比べると圧倒的に少ないです。各種インポートもできそうなので今後の発展が楽しみです）

CoreVRをインポートしたら、このアセットに含まれるVRCameraRigというVR用のカメラをシーン内に配置します。

この状態で画面上部のレンダリングモード変更ボタン横の杖のマークを押し、シーン右下にあるVRアイコンをクリックすると、VRデバイスへ映像が映し出されます。PCのディスプレイには次のように表示されます。

![SnapCrab_NoName_2018-4-9_9-43-36_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/51434/81f6dc2a-f899-73ec-dca4-623ced9eabe4.png)

# 最後に

Sumerianは機能が豊富で、英語ですがヘルプも充実しておりとても力の入ったサービスという印象です。VR/ARは技術的な興味を引きやすいですが、いざサービスを作ろうとなると少しハードルが高いのも事実で、こういった簡単に本格的なコンテンツを作成できるツールが登場してくると今後の展開が楽しみです。
C++ Builder 10.2 Tokyo > UI > 完全パス > ファイル名は付随しない | naming: パス (path)

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
秀丸エディタ Version 8.79
```

10.2 Tokyo上で見ているファイルを秀丸エディタで開こうとしていた。
ファイルパスはないだろうか。

オブジェクトインスペクタのプロパティに「完全パス」というのがある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/89b958e7-19bd-a042-6c40-8e5d8a62f2ca.png)

完全パスという用語だが、フォルダまでしかなく、ファイル名は付随しない。
(例: `C:\Windows\System32\`)

上にある「ファイル名」と合わせて使う必要がある。

### naming: パス

https://msdn.microsoft.com/ja-jp/library/system.io.file.getcreationtime(v=vs.110).aspx
> パラメータ
> path
> ...
作成日時情報を取得する対象のファイルまたはディレクトリ。

「filepath」というnamingではファイル名（＋拡張子）まで含むと思っている。「パス」だと、ディレクトリ（フォルダ）までという意味もあるのだろう。

- path
    - directory path
    - file path
Decodableオブジェクトのサブクラスを作成して、値を追加でデコードする方法

基本的には、サブクラスを生成するよりoptionalで宣言した方がいいような気がしますが、どうしてもサブクラスでやらないといけないことがあったので、そのやり方について書きます。

#サンプル
以下の二つのJSONをデコードする想定にします。

```javascript:person.json
{
	"name": "Mery Jane Watson",
  	"work": "actress"
}
```

```javascript:hero.json
{
	"name": "Peter Parker",
   	"work": "hero",
   	"hero_name": "SpiderMan",
  	"costume_colors": ["red", "blue", "black"]
}
```

まずは人間用のクラスを作成します。

```swift:Person.swift
class Person: Decodable {
    var name: String
    var work: String

    private enum CodingKeys: String, CodingKey {
        case name
        case work
    }
}
```

続いてヒーロー用のクラスも用意します。

```swift:Hero.swift
class Hero: Person {
	var heroName: String
	var costumeColors: [String]
	
	private enum CodingKeys: String, CodingKey {
		case heroName = "hero_name"
		case costumeColors = "costume_colors"
	}
	
	required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.heroName = try container.decode(String.self, forKey: .heroName)
        self.costumeColors = try container.decode([String].self, forKey: .costumeColors)
        try super.init(from: decoder)
    }
}
```

#メリット
・どうしてもoptionalを使いたくない場合に使える

#デメリット
・structが使用できなくなるので、値渡しと参照渡しに気をつけないと死ぬ（私は一度死にました。）
views一覧を作るまで(第一日目) Qiita(27)

# 目的
Qiitaに投稿した記事の何が読まれているかを確認し、必要な人に必要な資料が届く工夫をする。
# 成果
自動で一覧と集計ができる。

Qiitaの仕組みがわかる。

Qiitaの利用が高度になるかも。
# 本文
100件までは手作業で集計していた。
https://researchmap.jp/joxqz1wkz-1826017/#_1826017

Qiitaの記事を読みながら、Qiitaの自分の投稿のViewsの一覧と集計を作るまでを記録します。
作業する日は週に１日を予定しています。次の日まで１週間開く場合があります。
ごめんなさい。

耳寄りな情報は、編集リクエスト、コメントのどちらでも結構です。
よろしくお願いします。
# 第一日　資料整理
「Qiita views」検索で出てきた記事を読む。

## 関連記事
Excel で Qiita 投稿一覧を取得する
https://qiita.com/PowerBIxyz/items/1fc385fdd3727b312bdb

Qiita ハック with Python#1
https://qiita.com/41semicolon/items/d8fd99b1854f3b8e6bd6

Qiita iOSについて30日間連続で投稿してわかったこと
https://qiita.com/yusuga/items/e6c28d3ebc176fd024bb
## 未整理
Djangoを始めるにあたっての備忘録 (Admin・Views編) part5
https://qiita.com/sebecjealuc/items/339c9a5a8adac2aea4ed

Django views.pyとurls.py のベストプラクティス（？）
https://qiita.com/Gen6/items/e845787a6ad073a77310
## 作業報告
Qiitaのパスワード設定が必要だとわかる。

パスワードを設定してからメールを読んだ。

有効時間は10分とのこと。

すでに２０分経過していた。

また来週作業しよう。
# いいね
@takubb Qiita の「いいね！」は何件とれば「いいね！」なのか検証してみた！
https://qiita.com/takubb/items/ed774e7b10a771676254

> 10件の「いいね！」がつけば、Qiita内でもTOP10%を占める良記事
# 一覧類(directories)
仮説（195）与件解析(data analysis)入門
https://qiita.com/kaizen_nagoya/items/d9474c3bdb8ea0029bee

「Qiitaのいろいろランキング2019」への感謝と提案
https://qiita.com/kaizen_nagoya/items/40b8557a20e8d75d62b5

Qiita(19)立ち位置記事百(100 position papers)
https://qiita.com/kaizen_nagoya/items/3fcc327f7c77cff0cfec

64bitCPUへの道 and/or 64歳の決意(0)
https://qiita.com/kaizen_nagoya/items/cfb5ffa24ded23ab3f60

データサイエンティストのための分析：Qiita自己記事まとめ2020
https://qiita.com/kaizen_nagoya/items/ff51b03848908d38d7b3

データサイエンティストのための分析：Qiita自己記事まとめ2020 （演習）
https://qiita.com/kaizen_nagoya/items/31a7d9ad7dc514ad72cc

Qiita記事まとめ2021
https://qiita.com/kaizen_nagoya/items/7eeb41de74b30f03e2db

QC検定に落ち「たか」らかける記事。20,000人の方に読んでいただけ「たか」ら書ける記事。「たかたか」分析の勧め。
https://qiita.com/kaizen_nagoya/items/2a371ee8c8f1b78cd5bb

記事を参照して頂いた時にしていること。
https://qiita.com/kaizen_nagoya/items/0e4e92f45c158ef81423

@kazuo_reve の Qiita記事の分析
https://qiita.com/kaizen_nagoya/items/81e3519e3740fa766d6a

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

LaTeX(0) 一覧　
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

Rust(0) 一覧　
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

小川清最終講義、最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Document > version > Scipy lecture notes > 同じEditionのファイルが更新される > 読者側のバージョン管理

### 関連

- [Scipy lecture notes, Edition 2017.1 > typo > 3.1.4 > 2D arrays (such as images)](https://qiita.com/7of9/items/691cac344cc316cb2a79)

### ドキュメントの更新

上記の記事に書いたように、Scipy lecture notesには2D arraysの描画コードに間違いがあった。

その間違いが修正されたとissueへのコメントが入った。
https://github.com/scipy-lectures/scipy-lecture-notes/issues/369#issuecomment-379578367

同じEditionのpdfファイルが更新されている。

### 読者側のバージョン管理

同じEditionのpdfファイルのバージョンが変わっていくと、読者は「どのバージョン？」のファイルを読んでいるか分からなくなる。

ファイル更新日付はpdfファイルへハイライトを追加したときなどに変更されるだろう。
ファイル作成日付は古い情報が残るかもしれない。この情報を見ることになるのだろうか。

読者が「ファイルが最新か」を知るには、pdfファイルの中身でなく、別の情報を管理・参照する必要がある。

ファイルの中身にrevisionが分かるようにドキュメントを用意する方がいいように思う。

### Qiitaなどのドキュメント記載

QiitaなどのドキュメントでEdition 2017.1参照と記載していても、同じPDFファイルを取得できる可能性は低くなる。
sympy で量子テレポーテーション

Sympy の基本的な使い方は、[sympy で量子計算](https://qiita.com/41semicolon/items/8f5d8c6d8b767959ed97) を参考のこと。

victor を2番目、aliceを1番目、bobを0番目とする。始状態を設定。

```python
>>> from sympy.physics.quantum.gate import H, CNOT, CGate, X, Z
>>> from sympy.physics.quantum.qapply import qapply
>>> from sympy.physics.quantum.qubit import Qubit, measure_all, measure_partial

>>> a, b = 3/5, 4/5
>>> state0 = a * Qubit('000') + b * Qubit('100')
>>> state0
0.6*|000> + 0.8*|100>
```

AliceとBobをエンタングルさせる

```python
>>> state1 = qapply(CNOT(1,0)*H(1)*state0)
>>> state1
0.3*sqrt(2)*|000> + 0.3*sqrt(2)*|011> + 0.4*sqrt(2)*|100> + 0.4*sqrt(2)*|111>
```

AliceとVictorをエンタングルさせる

```python
>>> state2 = qapply(H(2) * CNOT(2,1) * state1)
>>> state2
0.3*|000> + 0.4*|001> + 0.4*|010> + 0.3*|011> + 0.3*|100> - 0.4*|101> - 0.4*|110> + 0.3*|111>
```

Recover処理をする（測定とRecoverは交換可能なので先にやっちゃう）

```python
>>> CZ  = CGate((2,),Z(0))
>>> state3 = qapply(CZ * CNOT(1,0) * state2)
>>> state3
0.3*|000> + 0.4*|001> + 0.3*|010> + 0.4*|011> + 0.3*|100> + 0.4*|101> + 0.3*|110> + 0.4*|111>
```

Alice と Victor で測定を行う

```python
>>> for m in measure_partial(state3, (1,2)): print(m)
...
(0.6*|000> + 0.8*|001>, 0.250000000000000)
(0.6*|010> + 0.8*|011>, 0.250000000000000)
(0.6*|100> + 0.8*|101>, 0.250000000000000)
(0.6*|110> + 0.8*|111>, 0.250000000000000)
```

どの測定結果でも、Bobは Victorの始状態に一致している。めでたしめでたし。

参考: https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc2.pdf
Heroku にデプロイしたアプリにタイムゾーンを設定する

# 現状を確認する

以下のコマンドをうって、リモート (Heroku) に接続する。

```
$ heroku run bash
Running bash on ⬢ appname... up, run.3789 (Free)
```

リモートに接続できたら `date` で現状を確認する。
デフォルトは `UTC` で設定されているらしい。

```
$ date
Sun Apr  8 22:08:58 UTC 2018
```

# タイムゾーンを変更する

タイムゾーンを変更するには、一旦ローカルに戻る。
そして、以下を実行する。（ここでは、太平洋標準時間を設定する）

```
$ heroku config:add TZ="America/Los_Angeles"
```

設定できたかを確認するため、先ほどと同じようにリモートに接続して `date` を実行する。
時刻のあとに `PDT` と表示されていれば、正常に設定されている。

```
$ date
Sun Apr  8 15:13:36 PDT 2018
```

# 他のタイムゾーンに変更する

他のタイムゾーンに変更したい場合は、`heroku config:add` のあとに続く `TZ=hoge/fuga` を好きなように変更すれば良い。
`TZ=` に続く部分のフォーマットは、[List of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) を参照すると良い。
例えば、日本標準時なら `Asia/Tokyo` とすれば良いし、世界標準時なら `UTC` とすれば良い。
ZabbixでWeb監視を行う（前編）

# はじめに
Web監視とはその名の通り、WebサーバのURLに対して外部からHTTPでの接続を行い、応答データを収集する監視方法のことです。本記事では監視元をZabbix3.4、監視先をApache Webサーバとして、インターネット越しに監視を行う方法を解説します。

# 設定手順
## 監視データの収集
Host Name = Web monitor
Group = Web monitors
でホストを1つ作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/277fee0b-915f-a447-300b-41d87711d02b.png)
Web監視は最終的な接続先のWebサーバだけではなく、監視元～インターネット～監視先の監視経路ネットワークも含めて問題なく通信が届いているかの監視になります。従ってZabbixでアイテムを作る時は個別のWebサーバの設定としてではなく、「Web monitor」というWeb監視専用の箱を作ってその中に登録することをお勧めします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/0c5cf380-6eac-5363-bac5-b0cd41866eb5.png)
「Web」をクリックして次に進みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/6b85ce74-dc7f-a651-faef-508033215d72.png)
画面右上の「Create web scenario」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/52d0fada-95f4-3683-78ef-f0a7f5a1085e.png)
Nameは必須入力項目です。監視するURLの用途を記載しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/3f338afc-207b-3f38-dc0e-a48694652c11.png)
Agentはデフォルトでは「Zabbix」になっています。適当なブラウザに変更します。

「Steps」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/6ed3c207-348c-f558-e9a4-ff5d37d75d4e.png)
枠内の「Add」をクリック。別ウィンドウが開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/e95055d4-a897-13c6-10a9-46cb38261b78.png)
NameとURLを入力します。ここは図のように、http://~で始まる接続先をそのままNameに書くと分かりやすくてよいと思います。監視が複数ステップに渡る場合（例えばECサイトの監視でログイン、商品検索、買い物かご、...と順番にアクセスして監視をしたい場合）には各ステップの用途をNameに書くのも良いでしょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/6b8194cc-64dd-98ba-93bc-2937c6e5eea5.png)
ウィンドウ一番下にある「Add」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/945f075b-7d75-a949-e553-6a62a1f8e786.png)
Stepsの枠内ではなく、下にある大きな「Add」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/a222e73a-6ee5-e365-f549-62c5ecc8d33c.png)
Web監視のアイテムが1つできました。監視設定は以上です。

## 監視データの確認方法
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/d5d63aaa-0e6f-7589-d793-1b843c502630.png)

「Monitoring」＞「Web」で先ほど作成した監視設定のデータを見ることができます。「My web」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/273d831c-325f-cf68-b640-d49fd1281b74.png)
ダウンロード速度、応答速度が表示されました。

# おわりに
次回はトリガーの設定とアラート通知を行いたいと思います。
swiftで配列から値を指定して削除する

# swiftで配列から値を指定して削除する
Swiftはインデックスを指定して削除する関数しか用意されていません。
extensionでarrayを拡張して値を指定して削除する関数を作成できます。
値を指定して、インデックスを取得し、削除するだけです。

```swift
extension Array where Element: Equatable {
    mutating func remove(value: Element) {
        if let i = self.index(of: value) {
            self.remove(at: i)
        }
    }
}
```

# 補足：Equatable
==演算子で比較できるプロトコルです。
値を指定して削除するためにはEquatableプロトコルを継承したオブジェクトの配列である必要があります。
Haskell Stack のグローバル環境を雑に使う

# [更新] より新しい情報

注意: 今では GHCup でインストールされる Haskell 環境を好きに使えば良い気がしています。くわしくは先ず `ghcup tui` で出てくる環境選択画面を見てみることをおすすめします

また現時点でモダンなIDE環境といえば Intero ではなく VS Code + Haskell拡張 (Haskell Language Server) になると思います．

以下の記事もどうぞ：

https://qiita.com/keigoi/items/11fb25a9f08b9accfb22

## あらまし

* [Stack](https://docs.haskellstack.org/) は、Haskell のビルドツールのひとつ。
  - パッケージ群のバージョンを固定 (snapshot) することで Cabal hell が起こらなくなっている。
  - あくまでもビルドツールなのでプロジェクトを作ってその中で使うのが普通
  - しかしちょっとしたコード片のためにプロジェクトの環境構築するのは面倒。
  - グローバル環境を雑に使ってみたい（そういう使い方はあまり想定されていないかもしれないが）
* [Intero](http://commercialhaskell.github.io/intero/) のようなモダンな IDE 環境を使ってみたい。 
  - Intero は Stack の GHC を見ているようだ。つまり、プロジェクトの外で起動するとグローバルの Stack 環境で起動する。
  - 適当に拾ってきたコードを読む時にも Stack のグローバル環境は使えそうだ

現時点 (2018年4月) で雑に試した内容を書いておく。環境は macOS です。


# 既存の GHC を消す

色々とややこしいので ``ghc`` や ``ghci`` にパスが通っていない状態にする。 ついでに古い cabal や ``~/.cabal`` も消した。

# Stack のインストール

```sh
curl -sSL https://get.haskellstack.org/ | sh
stack upgrade
```

# LTS バージョンの選定と Stack グローバル環境の構築

[Stackage](https://www.stackage.org/) のトップページに新しめの GHC バージョンが揃っているので、適当な GHC を選び、それに対応する LTS のバージョンを控えておく。自分は lts-7.24 (``LTS 7.24 for GHC 8.0.1, published 10 months ago``) というのを選んだ。

Stack の環境は ``~/.stack`` に構築される。ここに何もないことを確認して、 stack setup を起動。すぐに ^C で止める。

```sh
$ stack setup
^C
```

生成された ``~/.stack/global-project/stack.yaml`` を編集し自分の好きな LTS のバージョンに変え、 ``stack setup`` を再実行

```sh
$ cat ~/.stack/global-project/stack.yaml 
packages: []
resolver: lts-7.24
$ stack setup
```

# Intero のインストール

[公式](http://commercialhaskell.github.io/intero/) の通り。 ``~/.emacs/init.el`` に以下を書いた。

```emacs-lisp
;; If you don't have MELPA in your package archives:
(require 'package)
(add-to-list
  'package-archives
  '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
(package-refresh-contents)

;; Install Intero
(package-install 'intero)
(add-hook 'haskell-mode-hook 'intero-mode)
```

# GHC の起動

そのままでは当然 ``ghc`` などのコマンドが通らない。 ``stack ghc`` 等で起動できる。
あるいは、

```sh
stack exec bash -- --login
```

として stack の下で新しいシェルに入れば ``ghc`` にパスが通るようになる。 コマンドへのオプションは ``--`` の後に置くことに注意する。 ``stack exec CMD -- オプション`` のようにする。
ただ、``stack ghci`` が experimental ということなので この bash 環境もどこまで使えるのか？？


# パッケージのインストール？

``stack build`` にパッケージ名を直接指定すればグローバル環境の Stack にパッケージが入る (Intero からも見えるようになる)。

```sh
stack build パッケージ名
```

Stack にはインストールという概念は無い（コマンドとしては存在するが ``stack build --copy-bins`` のエイリアスになっている）。その代わりに ``stack.yaml`` に書かれたパッケージが ``stack build`` 時にビルドされる。
今回は Stack をグローバル環境で使っているので、 ``~/.stack/global-project/stack.yaml`` に書けば良さそうだが、ビルド対象のプロジェクトが無いので素の ``stack build`` は効かない。
上記のようにすればグローバルで ``stack ghc`` した時に使えるパッケージが入る。