OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7.1のminimal構成に入ってる／入ってないリスト

役目を終えて今日解約予定のVPSがあったので後学のために再インストールしてみました。
以前、[GCCが入っていないようで詰まりました](https://qiita.com/worthmine/items/2422222d47fdefd655f4)ので、プリインでどこまで入っているのか調査します。

# 前提
お名前VPSにコンソールからCentOS7.1をminimalでインストールし、sshでrootログイン。`yum upgrade`だけ実行した状態で比較的よく使うソフトを`hoge -v`または`hoge --version`してバージョンが確認できるかチェックします。

# GCCは入ってない

```
# gcc -v
-bash: gcc: command not found 
```

```
# libgcc -v
-bash: libgcc: command not found 
```

先に他のソフトをインストールすると、なぜかlibgccだけインストールされることがあるのでハマりやすい。その前に`# yum install -y gcc`すれば普通に入る模様。

```
# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 
```

# curlは入ってる[^1]

```
# curl --version
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.28.4 zlib/1.2.7 libidn/1.28 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets 
```

# VIMは入ってない？

```
# vim -v
bash: vim: command not found
```

と出ますが、viのバージョン情報を見るとVIMになってます。

```
# vi --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug  2 2017 00:45:54)
（以下略）
```
これは`# yum install -y vim`で解決できる（同時にperl5.16.3がインストールされる）

以降、

```
# vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug  2 2017 00:45:39)
（以下略）
```

と、同じバージョン情報が出るようになり、`vi`でも`vim`でも同じソフトが立ち上がるはず（エイリアスを設定する必要はなさげ）。[^2]

# wgetは入ってない

```
# wget --version
bash: wget: command not found
```

`# yum install -y wget`とすると、以降

```
# wget --version
GNU Wget 1.14 built on linux-gnu.
(以下略)
```

となる

#perlなどは入ってない

全て列挙して調べたわけではないが、python以外はプリインストールされていない模様。

[^1]: ってかこれはソフトではなくコマンドらしい
[^2]: いつからこうなったのかは興味があるけど今回は調べていない
Ruby の FileTest.directory? だけでファイルかディレクトリかを判定してはダメ

# なぜ

Ruby で対象がファイルなのかディレクトリなのかを調べるときに `FileTest.directory?` や `FileTest.file?` を使うと思いますが、これらをこんなふうに使うとバグのもとになります。

```rb
path = '/hoge/fuga'

if FileTest.directory? path
  # ディレクトリのときの処理
else
  # ファイルのときの処理
end
```

なぜなら、これらのメソッドは、**パスが存在しないときやシステムコールに失敗したときも `false` を返す**からです。

この例だと、本来はディレクトリであるのにファイルシステムの不具合等でシステムコールに失敗し、ファイルであるとして設計している else 節の処理が実行され、ファイルサイズの取得などで予期せぬ不具合が起きるといったようなことになってしまいます。

# 対策

対象がファイルなのかディレクトリなのか確実に判定するためには、必ず `FileTest.directory?` と `FileTest.file?` の両方を使用し、万一どちらでもないと判定されてしまった場合は例外を発生させるのがよいと思います。

```rb
path = '/hoge/fuga'

if FileTest.directory? path
  # ディレクトリのときの処理
elsif FileTest.file? path
  # ファイルのときの処理
else
  raise 'ファイルでもディレクトリでもないなんてあり得ない！'
end
```

# 参考

ちゃんとドキュメントを読みましょうっていう話なんですけどね :sweat_smile: 

> そうでない場合、ファイルが存在しない場合、あるいはシステムコールに失敗した場合などには false を返します。

- [module function FileTest.#directory?](https://docs.ruby-lang.org/ja/latest/method/FileTest/m/directory=3f.html)
- [module function FileTest.#file?](https://docs.ruby-lang.org/ja/latest/method/FileTest/m/file=3f.html)
The passed torchLevel 0.000000 is invalid

カメラのライトを使おうとしたら下記エラーに遭遇しました。

```
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVCaptureDevice setTorchModeOnWithLevel:error:] The passed torchLevel 0.000000 is invalid'
```

[ドキュメント](https://developer.apple.com/documentation/avfoundation/avcapturedevice/1624609-settorchmodeon)にはこのメソッドに渡すパラメータの説明が 0.0 ~ 1.0 の浮動小数点数とあるのだが...

```
The new torch mode level. This value must be a floating-point number between 0.0 and 1.0. To set the torch mode level to the currently available maximum, specify the constant AVCaptureMaxAvailableTorchLevel for this parameter.
```

下記のようにして回避しました。

```swift
try? videoDevice.lockForConfiguration()
  if newValue > 0.1 {
    try? videoDevice.setTorchModeOn(level: newValue)
  } else {
    videoDevice.torchMode = .off
  }
videoDevice.unlockForConfiguration()
```
[Redis] データを永続化していないRedisの再起動

ディスクI/Oのパフォーマンスなどの観点から、データの永続化をしていないRedisがあります。
※configで`save ""`を設定。

EC2のメンテナンスなどでRedisノードの再起動が必要になった場合、そのまま再起動をしてしまうとデータが消えてしまいます。
データを残しつつ再起動する手順を紹介します。

# 1. 現在のデータサイズを調べておく
redis-cliの**dbsize**コマンドで、現在のデータサイズをメモしておきます。再起動後の件数確認に利用します。

```bash
$ redis-cli dbsize
```
# 2. saveコマンドでデータをバックアップする
redis-cliの**save**コマンドでデータのバックアップを取得します。

```bash
$ redis-cli save
```
# 3. Redisのノードを再起動する
利用環境にあわせてノードの再起動を行ってください。

# 4. 再起動の完了後、データ件数が正しいか確認する
Redisノードの再起動が完了した後、redis-cliの**dbsize**コマンドで件数の確認を行います。

```bash
$ redis-cli dbsize
```

以上、データを永続化していないRedisの再起動方法の紹介でした。

---
※ブログに記載済みの記事をQiitaに転載しています。元の記事は、[こちら](https://410gone.click/blog/2018/02/28/redis-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%B0%B8%E7%B6%9A%E5%8C%96%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84redis%E3%81%AE%E5%86%8D%E8%B5%B7%E5%8B%95/)
DockerのRedmineにテーマを適用する方法（＋サブディレクトリで動かす）

# 概要

Docker Hubの[library/redmine](https://hub.docker.com/_/redmine/)をテーマが使えるように変更します．また，複数エンドポイントで利用するため，サブディレクトリで動作させます．

ベースのイメージは[library/redmine:3.4.4](https://hub.docker.com/r/library/redmine/tags/3.4.4/)を利用し，新しくイメージを作成することで対応します．

# テーマを適用する

まず，はじめにテーマを適用しましょう．redmineのテーマはredmineのディレクトリ内にある`public/themes`にテーマのディレクトリを配置することで認識されます．テーマは[minimalflat2](https://github.com/akabekobeko/redmine-theme-minimalflat2)を利用させていただきましょう．

Dockerfileで実行する内容としてはこんな感じになります．

1. unzipがないので入れる
2. テーマをダウンロードする
3. `public/themes`ディレクトリを作成する
4. テーマを解凍して移動する
5. 後始末

`redmine:3.4.4`はdebianベースなのでaptを使ってunzipを入れています．

```Dockerfile:Dockerfile
FROM redmine:3.4.4
RUN apt-get update \
 && apt-get install -y --no-install-recommends unzip \
 && rm -rf /var/lib/apt/lists/* \
 && wget -O minimalflat2.zip "https://github.com/akabekobeko/redmine-theme-minimalflat2/releases/download/v1.3.4/minimalflat2-1.3.4.zip" \
 && unzip minimalflat2.zip \
 && mkdir -p public/themes \
 && cp -r ./minimalflat2 ./public/themes \
 && rm -rf minimalflat2.zip \
 && rm -rf minimalflat2
```

# サブディレクトリで動かす

サブディレクトリで動かす方法は[公式Wiki](http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_a_sub-URI)にある方法でやります．サブディレクトリは`/redmine3`としていますが，仕様に応じて変更してください．２行目は`Rails.application.initialize!`よりも前に挿入しなければならないのでsedで挿入しています．これでRailsのルーティングがサブディレクトリに移ります．そして3行目は`Rails.application.initialize!`の後ろでないと名前解決ができないのでファイル末尾に追記しています．これで静的アセットがサブディレクトリでアクセスできるようになりますが，実際に`public`ディレクトリ内でアクセス出来ないとエラーになるので，４行目でシンボリックリンクを貼ります．

```Dockerfile:Dockerfile
FROM redmine:3.4.4
RUN sed -i -e "$ i RedmineApp::Application.routes.default_scope = \"/redmine3\"" config/environment.rb
RUN echo "Redmine::Utils::relative_url_root = \"/redmine3\"" >> config/environment.rb
RUN ln -sf ${PWD}/public ${PWD}/public/redmine3
```

# 最後に

美しい．

一応テーマがGPLなので完全版のDockerfileを上げておきます（この対応でいいかわからないので違反していたら教えてください）．

```Dockerfile:Dockerfile
FROM redmine:3.4.4

RUN sed -i -e "$ i RedmineApp::Application.routes.default_scope = \"/redmine3\"" config/environment.rb
RUN echo "Redmine::Utils::relative_url_root = \"/redmine3\"" >> config/environment.rb
RUN ln -sf ${PWD}/public ${PWD}/public/redmine3

RUN apt-get update \
 && apt-get install -y --no-install-recommends unzip \
 && rm -rf /var/lib/apt/lists/* \
 && wget -O minimalflat2.zip "https://github.com/akabekobeko/redmine-theme-minimalflat2/releases/download/v1.3.4/minimalflat2-1.3.4.zip" \
 && unzip minimalflat2.zip \
 && mkdir -p public/themes \
 && cp -r ./minimalflat2 ./public/themes \
 && rm -rf minimalflat2.zip \
 && rm -rf minimalflat2
```
[レガシーJavaScript] ES3環境のブラウザでObject.create(null)相当のオブジェクトを作る

今となっては存在価値の無いハックだが、面白かったのでメモに残す。

# TL;DR

アイデアの肝の部分のみ載せるとこうなる。（実際はこれだけだと動かない）

```javascript
document.createElement("iframe").contentWindow.Object.prototype
```

# 完全版のコード

```javascript
function getNoProtoObject() {
  var iframe = document.createElement("iframe");
  document.body.appendChild(iframe);
  var obj = iframe.contentWindow.Object.prototype;
  document.body.removeChild(iframe);

  // for-inで列挙可能なプロパティを削除する
  for (var name in obj) {
    delete obj[name];
  }

  // for-inで列挙不可能な既知のプロパティを削除する
  delete obj["constructor"];
  delete obj["hasOwnProperty"];
  delete obj["isPrototypeOf"];
  delete obj["propertyIsEnumerable"];
  delete obj["toLocaleString"];
  delete obj["toString"];
  delete obj["toSource"];
  delete obj["valueOf"];
  delete obj["watch"];
  delete obj["unwatch"];
  delete obj["__defineGetter__"];
  delete obj["__defineSetter__"];
  delete obj["__lookupGetter__"];
  delete obj["__lookupSetter__"];
  delete obj["__proto__"];

  return obj;
}
```

# 説明

ECMAScript 3環境において`[[Prototype]]`内部プロパティが`null`であるオブジェクトは`Object.prototype`だけであるから、これを`Object.create(null)`相当のオブジェクトとして扱うほかない。
ところが、`Object.prototype`は一つのページにただ一つしか存在しないオブジェクトであるから、`Object.create(null)`のように量産することができない。
この問題をいかに解決するかが課題となる。

上記の方法は、`iframe`でページ自体を新しく作ってしまって、そこから`Object.prototype`を持ってくることで課題を解決している。
`Object.prototype`には組み込みのプロパティがいくつか生えているので、最後の仕上げとしてそれらを削除すれば、まっさらなオブジェクトを得ることができる。

# 参考リンク

[Was there a way to create an object without a prototype prior to ES5?](https://stackoverflow.com/questions/36117162/was-there-a-way-to-create-an-object-without-a-prototype-prior-to-es5)

# ところで

言わずもがな、このテクニックはもはや歴史的な意味合いしか持たない。
ECMAScript 3環境のブラウザには、IE 5.5〜8、Netscape 6、Firefox 3.0以前などがあるが、いずれも死んだブラウザである。
IE8ですら、日本標準時で2016年1月13日にサポートが打ち切られている。
AmazonLinux2を導入する際に気をつけること

基本的に１と変わらないのですが、 amazon-linux-extras を使って入れると概念が違うところがあるので気をつけましょう。というお話です。

## Postgresql
psqlしか入りません。理由はRDS前提社会だから。
なおで、もしdevはローカルという方針なら、postgresql-serverをyumで入れましょう。その際、いつもの、develとcontribは忘れずに。

##ruby
railsを使うなら、rpm-buildを忘れずに。

##root
rootは```sudo su -```です。1でもそうです。passwdしましょう。

##rails前提社会からPHP共栄圏へ
色々面倒だったので、Rails前提社会からPHP共栄圏へのエクソダスをすることにしました。Railsは環境構築が面倒です。
Jenkins Pipelineで管理者承認が必要なコードをGitで管理する

[currentBuild.rawBuild](https://qa.nuxeo.org/jenkins/pipeline-syntax/globals#currentBuild)は、認証済ライブラリか管理者に許可されたスクリプトからしか利用できない注釈がある。
> Run with further APIs, only for trusted libraries or administrator-approved scripts outside the sandbox;

JenkinsのWebUI上でスクリプトを書いた場合、問題が起こったときにプログラムを参照しづらいし、そもそも履歴とかないから書き換えるのが恐いので、できればGitで管理したかった。

しかしGitからチェックアウトすると実行前に管理者が承認というフローができなくなり、且つ設定には`Use Groovy Sandbox`に該当する設定がないので、sandbox外で実行することもできない。

## 解決策

Jenkinsの設定はWebUI上で記述するスクリプトにして、次のようなコードでGitから取得して対象のスクリプトファイルを実行するようにする。

```groovy
node {
    git url: 'リポジトリURL', credentialsId: '必要な認証のID'
    load 'path/to/script.groovy'
}
```

Jenkinsの確認フローは壊れるが、Git側の管理で(githubならPRをマージできる人を限定するとか)十分かなと思う。
TeXで論文を書く

2018.02.28 現在：編集中

# はじめに
これは某大学院の修士論文の書き方まとめです。
修士論文の書き方には様々な流派がありますが、参考にしてください。

# 初期設定

## 文字サイズとページ設定

```tex:documentclass.tex
\documentclass[11pt, a4j, ascmac]{jsarticle}
```

## パッケージ

```tex:package_must.tex
\usepackage{amsmath,amssymb} %必要
\usepackage{bm}　%太字
\usepackage[dvipdfmx]{graphicx}　%グラフ挿入
\usepackage{ascmac}　%謎
\usepackage{float}　%謎
\usepackage{url}　%参考文献にurl入れる時
\usepackage{graphicx}　%グラフ挿入(さっきと違うのか？)
\usepackage{comment}　%数行コメントアウトする時に使う
\usepackage{tabularx,theorem} 　%謎
\usepackage{indentfirst}　%謎
\usepackage{algorithmic}　%文中にalgorithmを書く
\usepackage{algorithm}　%文中にalgorithmを書く
\usepackage{geometry} %謎
\usepackage{framed} %謎
```

## 空白の設定

### 修士論文

```tex:blank_paper.tex
\geometry{top=35mm,bottom=30mm}
```

### 修士論文要旨

```tex:blank_abst.tex
\geometry{left=14mm, right=14mm, top=22mm, bottom=22mm}
%40文字50行
```

## 目次の設定
目次にsubsubsectionまで入れる

```tex:table.tex
\setcounter{tocdepth}{3}
```


## 式番号の設定
式(3.1)とかにする (式(3.1.1)にはしない)

```tex:number.tex
\makeatletter
\renewcommand{\theequation}{
\thesection.\arabic{equation}}
\@addtoreset{equation}{section}
\makeatother
```

## ドキュメント部分の構成
この辺で\begin{document}を行なう。最終行に\end{document}を入れておく。

```tex:begin.tex
\begin{document}
本文
\end{document}
```

## 表紙・表題

### 修士論文

```tex:front_paper.tex
\begin{document}
\begin{center}
\vspace{4.5cm}
{\LARGE \bf{日本語タイトル}} \\
\vspace{0.5cm}
{\LARGE \bf{英字タイトル}} \\
\vspace{16cm}
{\LARGE \textrm{所属先}} \\
\vspace{0.5cm}
{\LARGE \textrm{名前}} \\
\end{center}
```

### 修士論文要旨

```tex:front_abst.tex
\begin{center}
\LARGE{日本語タイトル\\
英字タイトル}
\end{center}
\begin{flushright}
所属 \hspace{1zw} 日本語名前  \\ 英語名前 
\end{flushright}
```

名前は苗字と名前の間にスペースを開ける。
英語名前は「Tanaka, Taro」のように書く。
</div></details>

## 節・項・目・付録

- 通常のsection

```tex:section.tex
\section{節}
\subsection{項}
\subsubsection{目}
\section*{節} %目次に載せたくない・番号がつかない
%基本的に*は番号を載せない場合に用いる
```

- 付録のsection

```tex:app.tex
\appendix %付録始め
\renewcommand{\theequation}{A.\arabic{equation}} %タイトルの書き方
\setcounter{equation}{0} %式の書き方
\section{節}
```


# 便利なコマンド

# 論文の基本

# 日本語の基本

# チェックすべき言葉
どちらかに統一すると良い（左側推奨）。

- **1つ** / **一つ**
- **付け** / **づけ**
- **行う** / **行なう**
- 半角ピリオドと半角スペース / 全角ピリオド
- 半角カンマと半角スペース / 半角カンマ
enchant.js クラス同士の衝突判定

連射した弾丸と次々現れる敵といった、多対多で衝突判定をさせたい場合はよくあります。
これをリスト（配列）やグループで管理するとなかなか面倒です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/fd90ff8d-8a93-5e99-1200-195da215f8c4.png)
ここでは、白くまからサッカーボール(Ballクラス）を連射し、スケボーに乗ったくま(Targetクラス)に当たったかどうかを判定するとします。

１つ１つのサッカーボールはどれもBallクラスのインスタンスです。スケボーくまはTargetクラスのインスタンスです。

こういったケースでクラス対クラスの衝突判定を利用すると、とてもシンプルにプログラムが書けました。

#クラス対クラスの衝突判定


```js
    // ゲームの処理
    game.onload = function()
    {
        // （中略）

        kuma = new Sprite(32,32);
        kuma.image = game.assets['chara1.png'];
        kuma.frame = 6;
        kuma.x = 60;
        kuma.y = 230;
        game.rootScene.addChild(kuma);
        
        // 定期処理
        game.rootScene.addEventListener('enterframe', function()
        {
            // （中略）
            
            // スペースキー入力で弾発射
            if(game.input.a)
            {
                var ball = new Ball();
            }
            
            // １秒に１回ターゲット出現
            if(game.frame%game.fps ===0)
            {
                var mato = new Target();
            }
            
            // BallクラスとTargetクラスの衝突判定
            Ball.intersect(Target).forEach(function(pair)
            {
                //pair[0]: Ballのインスタンス
                //pair[1]: Targetのインスタンス
                game.rootScene.removeChild(pair[0]);
                game.rootScene.removeChild(pair[1]);
            });

        });
    };
```
弾丸用Ballクラスと、ターゲット用Targetクラスがあり、それぞれが衝突したかどうかをintersectで判定しているのか下記の部分です。

```js
// BallクラスとTargetクラスの衝突判定
Ball.intersect(Target).forEach(function(pair)
{
    //pair[0]: Ballのインスタンス
    //pair[1]: Targetのインスタンス
    game.rootScene.removeChild(pair[0]);
    game.rootScene.removeChild(pair[1]);
});
```
ここで便利なのが.forEach(function(pair)です。これで衝突した２つのインスタンスを取得できるため、当たったら画面から消すといった処理も行えます。

なお、Ballクラスの記述は以下の通り。

```js
    // ボールクラス
    var Ball = Class.create(Sprite, {initialize:function(){
        Sprite.call(this,16,16);
        
        this.image = game.assets['icon1.png'];
        this.x = kuma.x + Math.floor(kuma.width/3);
        this.y = kuma.y + Math.floor(kuma.height/3);
        game.rootScene.addChild(this);
        
        // 重力
        this.ang = -5;      // 飛び出す勢い（高さ方向）
        this.grav = -10;    // 重力（下にひっぱる力） 
        
        // 定期処理
        this.addEventListener('enterframe', function(){
            //横に常に移動します
            this.x += 2;
            this.y = this.y + this.ang + this.grav;
            this.grav += 1;
            
            // 一定のエリアを出たら消す
            if(this.x > 320 || this.y > 260 || this.x < 0 || this.y < 0)
            {
                game.rootScene.removeChild(this);
            }
        });
    }});
```

##サンプルプロジェクト
得点計算などは行っておらず、衝突判定の処理のデモだけです。
http://code.9leap.net/codes/show/143736
MacにXdebug入れようとしたらSudoでもOperation not permittedになる事案が発生

以下の手順にしたがってXdebugを入れようとしたら

【手順】PHPのデバッグで便利なXdebugをMacに入れてみました | Mobile First Marketing Labo
http://www.aiship.jp/knowhow/archives/25695


Xdebugのウィザードhttps://xdebug.org/wizard.php
で指示される

```terminal

$ cp modules/xdebug.so /usr/lib/php/extensions/no-debug-non-zts-20160303

```
というコマンドを実行しようとしたら権限が無いと言われる。

```terminal

$ sudo cp modules/xdebug.so /usr/lib/php/extensions/no-debug-non-zts-20160303

```
でも無理。
どうも最新のMacOSXでは/usr/以下の編集にロックがかかっているようだ。

ということで以下の記事を参考にロック解除。無事にXdebugを入れられました。

EI Capitanでsudo付けているOperation not permittedが出た時の対処法 - いつかエンジニアになりたい
http://berukann.hatenablog.jp/entry/2015/12/30/123020
6. クラスター計算機で udocker を利用する: プログラムの実行

# udocker でプログラムを実行

[基本コマンド編-3](https://qiita.com/percipere/items/73623b7f658c46356c95)でudockerの利用方法がわかったので、udockerを利用してプログラムを実行してみる

## gcc 7.3 を利用する


c++の新機能をサポートしているコンパイラーとそうでないコンパイラーの動きの違いをみてみよう

ここでは、C++17で利用可能になった[十六進浮動小数点数リテラル](https://cpprefjp.github.io/lang/cpp17/hexadecimal_floating_literals.html)を試してみる

ホストのg++を確認

```shell-session
$ g++ --version
g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

g++の4.8.3は十六進浮動小数点数リテラルをサポートしていない
この事を利用してホスト上のg++とudocker上のg++の動作が比較できる

`udocker`でgccの7.3のコンテナを作成する

```shell-session
$ ./udocker pull gcc:7.3
Downloading layer: sha256:3e731ddb7fc902c6fc10f00cd7f99f11d63914692bd8c2816a29e6d016353932
...
Downloading layer: sha256:3a69201118730762995a17ad62b653b3a0467e7eeaf77ffb893ba09d1c5b8529
$ ./udocker create --name=gcc_7_3 gcc:7.3
c0f4db7f-6d39-3a62-bb8b-197b57d7302e
$ ./udocker -q run gcc_7_3 g++ --version
g++ (GCC) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

`udocker`でgcc 7.3のコンテナが作成された

* gcc:7.3 を指定して GCCのVersion 7.3のイメージをdocker hubから取得
    * 途中の出力は省略
* 先程取得したイメージから、gcc_7_3 という名前のコンテナを作成する
    * ちょっと時間がかかる
* gcc_7_3のコンテナ上のg++のバージョンを確認

十六進浮動小数点数リテラルのサンプルを`hexadecimal_floating_literals.cpp`として保存しておく

```cpp
#include <iostream>

int main()
{
  std::cout << 0xABCp-3f << '\n';
  double dbl_min = 0x1.0p-1'022; // 1 * 2^-1022 (double の正の正規化数の最小値)
  std::cout << dbl_min << '\t' << std::hexfloat << dbl_min << '\n';
  return 0;
}
```


### ホスト上でコンパイルを実行してみる

```c++
$ g++ ./hexadecimal_floating_literals.cpp -o gpp_4.out
./hexadecimal_floating_literals.cpp:6:28: warning: missing terminating ' character [enabled by default]
   double dbl_min = 0x1.0p-1'022; // 1 * 2^-1022 (double の正の正規化数の最小値)
                            ^
./hexadecimal_floating_literals.cpp:6:3: error: missing terminating ' character
   double dbl_min = 0x1.0p-1'022; // 1 * 2^-1022 (double の正の正規化数の最小値)
   ^
./hexadecimal_floating_literals.cpp: In function 'int main()':
./hexadecimal_floating_literals.cpp:7:3: error: expected ',' or ';' before 'std'
   std::cout << dbl_min << '\t' << std::hexfloat << dbl_min << '\n';
   ^
```

サポートされていない形式なのでコンパイルできない

### `udocker`を利用してgcc_7_3のコンテナを利用してコンパイルしてみる

```shell-session
$ ./udocker -q run -v ${PWD}:/work -w /work gcc_7_3 g++ hexadecimal_floating_literals.cpp -o gpp_73.out
$ ./gpp_73.out
343.5
2.22507e-308	2.22507e-308
```

コンパイルは成功し、コンパイル後のオブジェクトの実行も確認できた

* udockerのオプションについて
    * -q: 実行時のバナー等の抑制
    * -v: 指定したホストのディレクトリをコンテナ上のディレクトリにマップ
        * ホストのカレントディレクトリをコンテナ上の/workにマップしている
    * -w: コンテナ上でのカレントディレクトリを指定
        * コンテナ上の/workでコンパイルを実行している

今日はこれまで:smiley:
CSSだけでhover時にdiv要素をふわっと浮き上がらせる

#やりたいこと

マウスオーバー時にdivの要素をふわっと浮きあがらせたい。例えば、カードやボタンなどだ。

#実装方法

```html
<a href="#" class="fly">テスト</a>
```

```css
.fly {
    background-color: #3169d1;
    color: #fff !important;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    -webkit-transition: all .3s;
    transition: all .3s;
    margin: 10px 0 0 0;
}
.fly:hover {
    -webkit-transform: translateY(-5px);
    -ms-transform: translateY(-5px);
    transform: translateY(-5px);
}
```

これだけでふわっとした動きをつけることができる。

参考：http://design.aekana.com/blog/css-mouseover-effect
[APEX]バッチのテストクラス作成

Salesforceのプログラム言語であるAPEXでバッチがあるが、
バッチで即時実行のやり方がよくわからなかったので、それのメモ。
ちなみにトリガーのテストの記事は[こちら](https://qiita.com/naoto_koyama/items/5c1872724ecc52011329)。

# バッチの例
取引先オブジェクトの従業員数を1人加算しているだけです。

```java:AccountBatch
public class AccountBatch implements Database.Batchable<sObject>, Database.Stateful {

    /**
     * コンストラクタ
     */
    public AccountBatch() {
    
    }

    /**
     * Start
     */
    public Database.QueryLocator start(Database.BatchableContext BC) {
        String query = 'SELECT Id,NumberOfEmployees FROM Account';
        return Database.getQueryLocator (query);
    }
    
    /**
     * Execute
     */
    public void execute(Database.BatchableContext BC, List<Account> accountList) {

        List<Account> updAccountList = new List<Account>();
        for (Account acc : accountList) {
            acc.NumberOfEmployees  += 1;
            updAccountList.add(acc);
        }
        update updAccountList;
    }
    
    /**
     * Finish
     */
    public void finish(Database.BatchableContext BC) {
        
    }
}
```

# テストクラスの例
バッチはTest.startTestとTest.stopTestの間に書くことでよいらしいです。

```java:AccountBatchTest
@isTest
private class AccountBatchTest {
    
    /* 
     * 従業員数が1加算されていることをテスト
     */
    @isTest static void test_method_1() {
        
        // テストデータの作成
        List<Account> accList = Test.loadData(Account.sObjectType, 'Test_Account_Data');

        // テストの開始
        Test.startTest();
        AccountBatch batchable = new AccountBatch();
        Database.executeBatch(batchable);
        Test.stopTest();
        
        // 検証
        ist<Account> accResultList = [SELECT Id,NumberOfEmployees FROM Account];
        for (Account accNew : accResultList) {
            for (Account accOld : accList) {
                System.assertEquals(accOld.NumberOfEmployees + 1 , accNew.NumberOfEmployees);
            }
        }
    
    }
}
```

#参考
[SFDC：Apexバッチのサンプルコード](http://tyoshikawa1106.hatenablog.com/entry/2016/03/09/173159)
[fastlane] iOS端末（UDID）を追加してプロビジョニングプロファイルを再生成する

たまにしかiOS端末（UDID）を追加しないので、
そのたびにfastlaneのactionを忘れていて調べる羽目になっていたのでメモ代わりに…

**iOS端末（UDID）の追加**

```
$ fastlane run register_device name:"DEVICE_NAME" udid:udidudidudidudidudidudidudidudidudidudid
```

**プロビジョニングプロファイルの更新**

```
$ fastlane run match force_for_new_devices: true
```
WRF > 後続処理 > 処理の緯度経度が半ピクセル分ずれる

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS、およびWRFの後続処理の`F***T`関連。

`F***T`の処理において緯度経度の処理情報を整理している。

### Case 1

- DX (X方向の緯度増加分): 0.120 度
- DY (Y方向の軽度増加分): 0.120 度
- NUMX (X方向のピクセル数): 82
- NUMY (Y方向のピクセル数): 65

結果として生成されるNetCDFファイルの緯度範囲（経度範囲）は、以下の計算の値と0.06度下側(左側)にずれる。

- 左側経度 + DX + NUMX
- 下側緯度 + DY + NUMY

### Case 2

- DX (X方向の緯度増加分): 0.060 度
- DY (Y方向の軽度増加分): 0.060 度
- NUMX (X方向のピクセル数): 82
- NUMY (Y方向のピクセル数): 65

結果として生成されるNetCDFファイルの緯度範囲（経度範囲）は、以下の計算の値と0.03度下側(左側)にずれる。

### 推測

Case 1, Case 2ともに、DX(DY)の半ピクセル分のずれが発生しているようだ。

格子の計算でピクセルの中心の値を使っているのだろうか。

この症状自体は問題というわけではないだろう。

13年くらい前に[FDTD (Finite Difference Time Domain)メソッド](https://cecas.clemson.edu/cvel/modeling/tutorials/techniques/fdtd/finite_difference_time_domain.html)の2次元コードを実装したときは、格子の中心座標を扱っていたと思う。
貝塚レートを計算する電卓を作ってみた話

#はじめに　
今回は貝塚円(貝塚レート)を計算する電卓を作ってみただで。
ダウンロードがなんとか100を超えたので何をしたかを残していきたいと思いますゥゥゥゥ
>貝塚レート 
シャムの予想される月収1万円と、同世代の平均月収35万円から算出されたシャムの体感する物価（というネタ）。
例：ココア飲料（バンホーテン） 130円(日本円) → 4,550(貝塚)円

>Syamu_game @ ウィキ様より引用

#なぜ作ろうと思ったか
それはある日、近所のドラッグストアから帰る途中
「あー、暇やなぁ。そうや！ひさしぶりにアプリ作ろ！」と言ってパソコンを広げたはいいものの横道にそれて、NicoNicoで再編集無職を見ていました。
すると動画の中に貝塚レートというネタが。早速調べてみると日本円x35であることがわかったので早速作ってみることに。

#ぶつかった点
とりあえずEditTextを使ってそこに入れられた数字を計算する電卓を作ってみることに。
日本円から貝塚円はすぐでしたが、その逆で問題発生！それは...

###1.少数ってどうやるの?!
Javaでの少数の計算はBigDecimalを使えばできることはしっていましたがどう書くのかがわからずに結構困ってました。
ちなみにこう書きます。

```MainActivity.java
  BigDecimal k = new
                    BigDecimal(kaizuka.getText().toString());
            BigDecimal big3 = new BigDecimal("35");
            double j = k.divide(big3, 3, ROUND_HALF_UP).doubleValue();
```
### 2.何も入れなかったときの挙動
何も入力せずに計算ボタンを押すと強制終了してしまったので ~~追加しました~~ 追加してもらいました。
（相変わらず一人じゃ何もできないｗ）ありがとうございますやで、ほんま。

```MainActivity.java
 public void kaizuka(View view) {
 jpy = findViewById(R.id.jpy);
 //ここが何も入力せずに計算ボタンを押したときの動作です。
if(jpy.getText().toString().equals("")){
 Toast.makeText(this,"何か入力するだで。",Toast.LENGTH_SHORT).show();
 }else {
 BigInteger j = new BigInteger(jpy.getText().toString());
 BigInteger big3 = new BigInteger("35");
 double k = j.multiply(big3).doubleValue();
```
#で、リリース後私はどうなったか
大金持ちになったというわけでもなく、有名人になったというわけではありませんがぐぐたすのフォロワー数が20人ほど増えました。
また、ぐぐたすの知り合いが拡散してくれたり自分でもニコニコに紹介動画を上げたりしてやっと100ダウンロードを迎えることができました。ダウンロードしてくれた方に感謝します！
ちなみに紹介動画はニコニコ技術部ランキングで３日ほど8位でしたｗ

#最後に
このアプリを作ったことは私にとって一つの成功だった気がします。このアプリのおかげで話題づくりだけでなく、色んな人とであえたこと、いろんな知識と技術を身につけることができた気がします。
このアプリに関わってくれた多くの人に感謝します！これからもKaizuCalcをよろしくお願いします！

[GitHub Repository](https://github.com/HamaDroid/KaizuCalc.git)
[作者のGoogle+](https://plus.google.com/u/1/+HamaDroid)
[色々と修正を加えてくださった方(ともひろ)のGoogle+](https://plus.google.com/u/0/+%E3%81%8B%E3%81%8A%E3%82%8B%E3%82%93)
[拡散してくださった方(あめまる)のgoogle+](https://plus.google.com/u/0/112360885658232497431)
[インストールはこちらから](https://play.google.com/store/apps/details?id=com.hmdroid.kaizucalc&hl=ja)
AVFoundationのAVPlayerでmp4の動画再生開始が遅い

タイトル通りの問題に遭遇しました。
`AVPlayer`の`automaticallyWaitsToMinimizeStalling = false`に設定し、解決しました。

## automaticallyWaitsToMinimizeStallingについて

- [公式はこちら](https://developer.apple.com/documentation/avfoundation/avplayer/1643482-automaticallywaitstominimizestal)
- iOS10から導入されたプロパティ  
- 動画の失速を最小限に抑えるためにプレイヤーが自動的に再生を遅延させるための設定
- デフォルト値はtrue
- iOS10以前の振る舞いについて
  - HLS：このプロパティがtrueのように振る舞う
  - HLS以外：このプロパティがfalseのように振る舞う

私が対応した状況ではこのプロパティをfalseに設定しても「Network Link Conditioner: LTE」で失速せずに再生されました。
[GCP ]  Cloud Deployment Managerのコマンド

# [GCP ]  Cloud Deployment Managerのコマンド
- 設定ファイルの中身`templates.yaml`に正しく記述されているものとします。
- 今回はコマンドに注目して作業時の忘却録とします。

## 構成のデプロイをプレビューする
- デプロイする前に、内容が本当に良いか設定のみを仮作成したい時には `--preview` をつけて実行します。

```console
gcloud deployment-manager deployments create my-server --config templates.yaml --preview
```
## 構成のデプロイを確認したい時
- デプロイされる内容を確認したい時に使用します。webコンソールで確認しても良いと思います。

```console
gcloud deployment-manager deployments describe my-sever
```

## プレビューをキャンセルしたい時
- プレビューで指定した名前 `my-server`を指定して`cancel-preview`コマンドを使います。

```console
gcloud deployment-manager deployments cancel-preview my-server
```

## プレビューを実行して構成作成する
- プレビューした構成をデプロイしたい場合はプレビューで指定した名前 `my-server`を`update`します。
- このコマンドを実行すると実際にサーバが作成されて、料金が発生します。

```console
gcloud deployment-manager deployments update my-server
```

## プレビューしないで、構成作成する
- もちろんプレビュー無しで、すぐに構成作成する事もできます。`--preview` を付けないで`create`

```console
gcloud deployment-manager deployments create my-server --config templates.yaml
```
## 最後に

   最近[技術ブログ](https://blog-c.cloudlance-motio.work/)も始めましたので、こっちもよろしくです。
Windows（WSL）でAnsibleを実行する

# 概要

　普段Windowsユーザですが、Windows上でAnsibleが実行できないため、Dockerコンテナ内からAnsibleを実行していました。そのため、社内にAnsibleを布教したいのに前段としてDockerの話をしなければならなくなり、Ansibleが使えるまでの足取りが重くなる。（VMのLinuxから実行も同様）
　この悩みを解決してくれるのが「**Windows Subsystem for Linux（WSL）**」です！
もうすでにご存知の方も多いかと思いますが、Windows上でVMやDockerなどをインストールせずに補助的な利用として一部のLinuxが簡単に使えるようになったもの

# 導入条件

- Windows 10(64bit)
- [Fall Creators Update](https://support.microsoft.com/ja-jp/help/4028685/windows-10-get-the-fall-creators-update)が適用されていること（正式版を利用するならば）  
  それ以前のバージョンはベータ版になります

# 導入手順

1. 「プログラムと機能」-「Windowsの機能の有効化または無効化」-「Windows Subsystem for Linux」を選択し、再起動します
    ![windows_functions.png](https://qiita-image-store.s3.amazonaws.com/0/30522/d513ddd6-e197-ab0f-4808-99846fa424bf.png)

2. 「Microsoft Store」の検索で「linux」と検索すると「Ubuntu」、「openSUSE」が選べるようになる
    ![linux.png](https://qiita-image-store.s3.amazonaws.com/0/30522/ea6f1aa5-a82f-16b7-9b8f-e1c4faee8c7c.png)

3. 対象のOSを選択し、「インストール」をすれば完了！
    ![suse.png](https://qiita-image-store.s3.amazonaws.com/0/30522/8bacd76d-3245-04b3-8266-86caed105cf1.png)


## インストール時のエラー対処

「Windowsイベントビューア」-「アプリケーションとサービスログ」-「Microsoft」-「Windows」-「Store」でエラー内容を確認する

私は「Windows プッシュ通知システムサービス」を無効にしていた関係でインストールできませんでしたが、有効にしたら問題なくインストールできました


# Ansibleのインストール

選択したOS内でAnsibleをインストールします
Ubuntuの場合は[ubuntu16.04にansibleをインストールする
](https://qiita.com/azuki19770922/items/b10672d95ba4dac82b97)を参照ください

# Windowsのファイルの参照方法

Linux内の`/mnt/xxxx`にWindowsの各ドライブがマウントされている



以上！
だいぶ簡単に実行環境ができたのではないでしょうか？これで布教活動しても、実行環境構築の心理的ハードルが下がったのではないかと思います
複数の表をjoinして検索

MySQLなどのデータベースでSQLのjoinを使って複数の表からのデータを検索します

#1. 表を準備します
- たとえば下記のようなSQLを使って３つの表を用意します

```sql:3つの表を用意

CREATE TABLE table_main (
    hinban VARCHAR(10) PRIMARY KEY,
    color VARCHAR(10),
    price INT
);

INSERT INTO table_main (hinban, color, price) VALUES('1000', 'blue', 100);
INSERT INTO table_main (hinban, color, price) VALUES('2000', 'red', 200);

CREATE TABLE table_souko (
    hinban VARCHAR(10) PRIMARY KEY,
    zaiko INT
);

INSERT INTO table_souko (hinban, zaiko) VALUES('1000', 10);
INSERT INTO table_souko (hinban, zaiko) VALUES('2000', 20);

CREATE TABLE table_other (
    hinban VARCHAR(10) PRIMARY KEY,
    nickname VARCHAR(10)
);

INSERT INTO table_other (hinban, nickname) VALUES('1000', 'ao');
INSERT INTO table_other (hinban, nickname) VALUES('2000', 'aka');

```

#2. joinを使って複数の表から検索します
- joinで複数の表から検索します
- 下記では`JOIN table_souko AS T2`で`table_souko`を`T2`と呼ぶことを宣言し、
`ON T1.hinban = T2.hinban`で`T1`の`hinban`列と`T2`の`hinban`列を関連付けることを指定しています

```sql:Joinを使って複数の表から検索

SELECT 
	T1.hinban, 
	T1.color,
	T1.price, 
	T2.zaiko,
	T3.nickname
FROM
	table_main AS T1
	JOIN table_souko AS T2
		ON T1.hinban = T2.hinban 
	JOIN table_other AS T3
		ON T2.hinban = T3.hinban 
WHERE
	T1.hinban = 1000;
```

下記の結果が返されます

```

mysql> SELECT  T1.hinban,  T1.color, T1.price,  T2.zaiko, T3.nickname FROM table_main AS T1 JOIN table_souko AS T2 ON T1.hinban = T2.hinban  JOIN table_other AS T3 ON T2.hinban = T3.hinban  WHERE T1.hinban = 2000;
+--------+-------+-------+-------+----------+
| hinban | color | price | zaiko | nickname |
+--------+-------+-------+-------+----------+
| 2000   | red   |   200 |    20 | aka      |
+--------+-------+-------+-------+----------+
1 row in set (0.00 sec)

mysql> 

```
電子回路入門　焦電型赤外線センサー

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614)に沿って引き続き進めていきます。

#**焦電型赤外線センサーとは**
色々ある赤外線センサーの一つで、近くに熱源(人や動物)がある場合にそれを検知するセンサーです。

#**使用部品**
- PSoC 5LP
- LED
- 抵抗100Ω
- [焦電型赤外線センサーモジュール](http://akizukidenshi.com/catalog/g/gM-09627/)

今回はモジュール化されているものを使用します。(簡単なので。)
検知すると3Vを出力するモジュールです。
モジュール化されていない焦電型赤外線センサーを使用する場合は、出力の増幅回路や、フレンネルレンズ(赤外線を集めて精度を上げる)等が必要になるようです。

#**回路図**
同じモジュールがfritzingになかったのでそれに近いものを使用しています。
![センサー_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/4f00281d-47e7-6c84-fbd7-aa941d62c528.png)
![センサー_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/2a520549-8d66-e251-0e17-a34b91018749.png)


#**プログラム**
熱源を検知した場合にLEDを点灯させるプログラムです。

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;
    int sensor = 0;
    for(;;)
    {
     if(sensor != SEN_Read()){
      sensor = SEN_Read();
     }
     if(sensor == 1){
      LED_Write(1);
     }else{
      LED_Write(0);
     }
    }
}
```
VSCodeでHTMLを書くその１

VSCodeでHTMLを書くその１

■ 前提

　前回までのIBM Cloud開発環境を整えるその１～その５までを終えていること。

■ 今回のターゲット

  VSCodeに実装しているemmet機能を利用して、またまた「Hollo World!」をIE(インタネットエクスプローラー)に表示させるところまでやります。
　ちょっとBasicから離れます。
　このテーマでのアプリは下記のような実装を考えています。

　① Webアプリの基本(HTML)の作成
　② Basicプログラムにパラメーターで指定した文字列をIEに出力

■　View In Browserのインストール

　前準備として、htmlファイルをIEにコマンドで表示する拡張機能をインストールします。
拡張機能ボタンを押下して、拡張機能検索に「View In Broser」を入力後Enterで表示される先頭の拡張機能をインストールします。

![EX-31-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/b65cb95d-c37e-c193-98b1-b9a6bae1f6e3.jpeg)

■ Hollo World htmlを作成する。

　ファイル→フォルダーを開くで、前回まで作業した「Hollo World」ディレクトリを選択します。
![EX-32-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/3110264c-60e4-290d-f120-945b0be4f256.jpeg)

<kbd>Ctrl+N</kbd>でファイルの新規作成
<kbd>Ctrl+S</kbd>でファイルの保存
ファイル保存のダイアログボックスが表示されるので、ファイル名に「HolloWorld.html」を入力して保存。
![EX-33-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/9f4e9d4a-194e-a798-7a57-a4655d421cd1.jpeg)

ここで必殺、emmet入力補完。
`!`(びっくりマーク)を入力。
![EX-34-2018022![EX-36-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/00172c97-c808-e084-f246-155912d14c7c.jpeg)
8.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/fa02f5a4-4563-4814-a03e-30885b391a7b.jpeg)

Tabキーで以下が表示されます。
![EX-35-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/d99d0d4e-411a-a311-b90b-1dd161b519fd.jpeg)

一瞬でHTMLの基本コードを入力。
次に、`<body>`以下に、`p>font[size=200]*1` を入力してEnter。
![EX-36-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/998ce8b0-f1bd-d255-82fd-2187f7f7b113.jpeg)

![EX-37-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/370d3a58-a456-07b9-18f4-66f5e4e0530d.jpeg)

`<p><font size=200></font></p>`が入力されます。
emmetの補完機能で変換されます。慣れるとかなり便利です。

この、`<font size="200">`と`</font>`の間に「Hollo World!」を入力します。


![EX-38-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/fcedb205-b393-b785-e655-8c91d7ea6613.jpeg)

HelloWorld.htmlの○ボタンを押下して保存します。
これで、IEに「Hollo World」を表示できる準備が整いました。
エディターにカーソルがある状態で、<kbd>Ctrl+F1</kbd>キーでこのhtmlをデフォルトのブラウザー(IEなど)に表示できます。
※1 View In Browserのインストールが必要


![EX-39-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/a5c8f24c-7522-7e3e-f64f-6c070af802d9.jpeg)

せっかく作成したので、ソース管理に登録します。Commitしましょう。(Ver1.00かな)

![EX-40-20180228.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/a1d40539-a7c7-503b-d6c8-666cee526815.jpeg)

次回は、このhtmlの「Hollo World!」の文字列を書き換えるbasicプログラムをコードします。

以上、おそまつ
Cloud Functions for FirebaseにはDatabaseへの書き込み前イベントハンドラがない？


# Cloud Functions for Firebaseを使ってみた

Cloud Functions for Firebaseって何って方はこちらを参考にしてください
[Cloud Functions for Firebaseとは？](https://qiita.com/koki_cheese/items/013d4e6ab5aefc792388)


## 何がしたかったか

**FirebaseのAuthentication機能を使用したログイン機能、Database機能を使用した暗号化したプロフィール保存およびそれの連携**


メールアドレス、パスワードをAuthenticationに保存し

<img width="938" alt="スクリーンショット 2018-02-28 13.47.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/124611/72b47403-42ca-e44b-baee-983dff9d7c2a.png">

⇒そのユーザーIDをキーに、Databaseに暗号化したプロフィール保存


## Databaseにプロフィールを保存する前に暗号化したいのでCloud functionsを使用する

しかし**Databaseへのデータ保存前に**というイベントハンドラがCloud Functionsにはない・・・？
公式サイト⇒[Firebaseトリガーの記述](https://firebase.google.com/docs/functions/database-events?hl=ja)

*イベントハンドラ一覧*
- onWrite(): Realtime Database でデータが作成、更新、または削除されるとトリガーされます。
- onCreate(): Realtime Database で新しいデータが作成されるとトリガーされます。
- onUpdate(): Realtime Database でデータが更新されるとトリガーされます。
- onDelete(): Realtime Database でデータが削除されるとトリガーされます。


####**イベントハンドラが4つしかない・・・**
しかもonWriteイベントはデータが作成、更新、削除した後にトリガーされるので、**データ保存前に**というイベントハンドラはない模様。

## 自分の場合
一度Databaseに保存したあとonWriteイベントでデータを取り出した後暗号化を行い、保存し直した。


まぁこれでも全く問題ないのだが、少々面倒と感じてしまった。
Firebaseはログインに関する手段が豊富で、手が広い。非常に便利なものだが、やはり万能ではないと思った。


### 参考サイト
[Firebaseの始め方](https://qiita.com/kohashi/items/43ea22f61ade45972881)
[Cloud Functions for Firebaseとは？](https://qiita.com/koki_cheese/items/013d4e6ab5aefc792388)
二分探索とは一味違う指数探索の解説

## はじめに
長さ$n$の昇順にソートされた配列から指定したkeyが格納された位置$i$（もしそのkeyがなければ、その値が格納されるべき位置）を返す問題を考えます。
よく知られた二分探索を使えば、$O(\log n)$時間で解くことが出来ますが、指数探索（exponential search）を使えばより高速に、$O(\log i)$時間で解くことが出来ます（正確に言うと$i$は高々$n$なので指数探索は二分探索よりも同等あるいは高速に動作します）。
オーダー表記では定数項を無視しているので実際には二分探索の方が速い場面も多いですが、特殊なケース、例えばクエリに偏りがあり、配列の前方ばかりを返すような場合には二分探索よりも高速に動作します。

## 指数探索アルゴリズム
アルゴリズムは２つのフェーズに分かれます。

### 第一フェーズ
第一フェーズでは、keyが格納されている範囲を特定します。
ここでは配列の要素は昇順に並んでおり、keyは配列の中に存在するものとして説明します（存在しなくても動作手順は同じです）。

$j=0$を初期値とし、$2^j$番目の値がkeyより小さいか否かを比較します、もし小さければ、keyは$2^j+1$以上の位置に格納されていることが分かり、$j \leftarrow j + 1$として同様に探索を続けます。もし、$2^j$番目の値がkey以上であれば、keyは$2^j$以下に格納されてる事が分かります。またその前ステップで$2^{j-1}$番目の要素はkeyより小さいことが確定しているため、keyが格納されている範囲$[2^{j-1}+1 \ldots 2^j]$を第一フェーズの結果として返します。

このようにkeyが格納されている範囲を計算する際チェックする位置を指数的に大きくしていることから指数探索、exponential searchと呼ばれています。

### 第二フェーズ
第二フェーズでは、第一フェーズで確定した範囲を二分探索し、keyが格納された位置を返します。

### 計算量
第一フェーズのステップ数は$\lceil \log i \rceil$のため、第一フェーズは$O(\log i)$時間で動作します。

第二フェーズの探索範囲は$[2^{\lceil \log i \rceil-1}+1 \ldots 2^{\lceil \log i \rceil}]$となり、この範囲を二分探索するため、第二フェーズも$O(\log i)$時間となります。

以上から、指数探索のアルゴリズムは$O(\log i)$時間で動作します。

## プログラム
C++で実装すると以下のようになります。
二分探索の`lower_bound`と同様のインターフェースで作りました。

```cpp

template <class ForwardIterator, class T>
ForwardIterator esearch(ForwardIterator first, ForwardIterator last, const T& key) {
	auto len = std::distance(first, last);
	auto &prev = first;
	auto cur = first + 1;
	size_t dis = 1;
	for (; dis < len && *cur < key; prev = cur, std::advance(cur, dis), dis *= 2);
	return std::lower_bound(prev, dis < len ? cur : last, key);
};
```

## 速度比較
二分探索と指数探索の速度比較を行いました。
配列の長さが$n=2^{16}$で、keyが$[0, 2n-1]$（keys1）、keyが$[0, n-1]$（keys2）、keyが$[0, n/4-1]$（keys3）、keyが$[0, n/2^{14}-1]$（keys4）を指している場合の平均実行時間を計測しました[^1]。
bsearchが二分探索、esearchが指数探索を意味してます。
[^1]: 追記：hitの過去形はhitです、hittedではありません。皆さん気をつけましょう。

https://wandbox.org/permlink/iELjCkavziiQ7A3v

```text
#### range static (0, 65536)
average range is 65536.00
keys1
bsearch takes 112 msecs
esearch takes 129 msecs
499165/1000000 (0.50) hitted! 
average index is 1.00

keys2
bsearch takes 165 msecs
esearch takes 192 msecs
999981/1000000 (1.00) hitted! 
average index is 0.50

keys3
bsearch takes 137 msecs
esearch takes 152 msecs
1000000/1000000 (1.00) hitted! 
average index is 0.13

keys4
bsearch takes 57 msecs
esearch takes 36 msecs
1000000/1000000 (1.00) hitted! 
average index is 0.00
```

結果から見ると、keyが先頭に極端に片寄っているkeys4の場合は指数探索の方が高速で、それ以外は二分探索の方が高速な結果になりました。
辞書でもsetでも内包表記が使える


##辞書

内包表記を使った辞書の作成

```.py
d = {str(x):x for x in range(10)}

>>>{'0': 0,
 '1': 1,
 '2': 2,
 '3': 3,
 '4': 4,
 '5': 5,
 '6': 6,
 '7': 7,
 '8': 8,
 '9': 9}
```

内包表記を使った条件付き辞書の作成

```.py
#偶数だけ抜き出す条件式
d2 = {str(x):x for x in range(10) if x%2 == 0 }

>>>{'0': 0, '2': 2, '4': 4, '6': 6, '8': 8}
```

既存の辞書から条件付き辞書を作成

```.py
d = {str(x):x for x in range(10)}
d2 = {key:value for key,value in d.items() if value%2==0}
>>>{'0': 0, '2': 2, '4': 4, '6': 6, '8': 8}
```

##set
乱数の集合を作成

```.py
import random
rand_set = {random.randrange(0,10) for i in range(10)}

>>>len(rand_set)
>>>7
```
重複しない10個の乱数が得られるまでループする

```.py
rand_set2 = {}
count = 0
while len(rand_set2) != 10:
    rand_set2 = {random.randrange(0,10) for i in range(10)}
    count += 1
    
print('count={}'.format(count))

>>>count=6185
>>>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
```

以上
WebページからアプリorPlayStoreを開く

## 実現したいこと

- アプリインストールユーザ：アプリを起動
- アプリ未インストールユーザ：アプリのPlayStoreを開く

## 実装

`AndroidManifext.xml`が以下のような場合に、

```
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample.sampleapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="sample.com"
                    android:pathPrefix="/samples"
                    android:scheme="https" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```

以下のURLを使用します。

```
intent://sample.com/samples/1#Intent;package=com.sample.sampleapp;category=android.intent.category.BROWSABLE;action=android.intent.action.VIEW;scheme=https;end;
```

いくつか補足しておきます。

- category/actionにはpackage名を含めた名前を設定する
- schemeにはhttp/httpsが使える
- `intent-filter`で`pathPrefix`などを指定している場合はURLの`host`に続けてパスを指定する

## 参考にしたページ

- [https://ja.stackoverflow.com/questions/32071/intent-%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E6%B8%A1%E3%81%97%E3%81%9F%E3%81%84](https://ja.stackoverflow.com/questions/32071/intent-%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E6%B8%A1%E3%81%97%E3%81%9F%E3%81%84)
tmux > 表示行数を知る > seq 50 -1 1

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

tmuxで上下のペインに分割して作業している。

１つのペインの行数を知り、その中で最適な情報表示をしたい。
行数を知るにはどうするか？

```bash
$seq 50 -1 1
```

```txt:run
19
18
17
...
1
[7of9@xxx] 
```

表示に使えるのは19行。

http://manpages.ubuntu.com/manpages/precise/en/man1/seq.1.html
>  seq [OPTION]... FIRST INCREMENT LAST
IBM Cloud Public の API Connect が製品機能として公開しているAPIを確認する

# API Connectが公開しているAPI
API Connectでは、開発者ポータルのREST APIを提供しています。
これらについては、記事「[API Connectで、公開しているAPIを利用しているアプリケーションの一覧を取得する方法](https://qiita.com/Naomi_Tanaka/items/84511a0b7fae3aeac4c9)」、「[API Connectで、APIキーを変更する方法](https://qiita.com/uedatks/items/d183adc3b89bd14d7048)」で使用方法について記載されています。

IBM Cloud Public で提供されている API Connectにおいても開発者ポータルのREST APIを使用することが可能です。REST APIの仕様は、[Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.devportal.doc/capim_devportal_overview.html)でも確認することができますが、Swagger UIで確認することができます。

この記事ではそのURLをご紹介します。

# 開発者ポータルAPI のSwagger UI

[Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.apirest.doc/view_swagger.html)によると、API Manager のホストがわかると確認することができる記載があります。

https://[APImanagerHost]/v1/docs/swagger-ui/index.html

しかし、IBM Cloud Publicの環境においては、API Managerのホストが詳しく調べないとよくわかりません。以下にリージョンごとのホストを記載します。（変更される可能性もあります。）

| リージョン        |ホスト名             |
|:-----------------|:------------------|
| 米国南部          |us.apiconnect.ibmcloud.com|
| 米国東部          |us-east.apiconnect.ibmcloud.com|
| 英国             |eu.apiconnect.ibmcloud.com|
| シドニー          |au.apiconnect.ibmcloud.com|
| ドイツ            |eu-de.apiconnect.ibmcloud.com|

内容は変わりませんが、ホスト名がわかると、お使いのリージョンのAPI ConnectのREST APIを確認することができます。
以下、米国南部のREST API の画面例です。
![スクリーンショット 2018-02-28 13.42.41.png](https://qiita-image-store.s3.amazonaws.com/0/121209/80c8867b-5251-ab40-b2fa-95ab8955c0f1.png)
環境変数へ重複がないようにパスを追加するシェルスクリプト

# 背景

今までは何も考えずに`bash_profile`内で環境変数`PATH`に

```bash
export PATH="$PATH:$HOME/new/path/to/dir"
```

のようにディレクトリへのパスを追加していました。しかし、このように追加しているとログイン中に何度も`source`した時にパスが重複してしまうため、何とかしようと思ってググり試行錯誤した結果をここへ残します。


# シェルスクリプトと説明

以下のようにして`bash_profile`内で新しいパスを追加、あるいは既存のパスを削除します。

```bash
# パスを追加する関数
pathadd() {
    # 環境変数名を第一引数として受け取る
    envname=$1
    # 環境変数の中に格納されているパスを保存
    eval envpath='$'$envname
    # 第二引数として受け取った追加するパスの末尾から/を除き変数pathtoaddへ保存
    pathtoadd="${2%/}"
    # 最初に環境変数内をきれいにする
    # (1) 連続するコロンがないか探し一つにまとめる
    # (2) 先頭または末尾のコロンを削除する
    eval $envname="$(echo $envpath | sed -r -e 's;:{2,};:;g' -e 's;^:|:$;;g')"
    # ディレクトリが存在し、かつ環境変数内に受け取ったパスが存在しない場合のみ、パスを追加する
    if [[ -d "$pathtoadd" && $(echo $envpath | grep -E -c "(^|:)$pathtoadd($|:)") -eq 0 ]]; then
        # 第三引数としてafterが追加されているときは末尾にパスを追加
        # それ以外のときは先頭に追加
        if [ "$3" = "after" ]; then
            eval $envname="$envpath:$pathtoadd"
        else
            eval $envname="$pathtoadd:$envpath"
        fi
    fi
}

# パスを削除する関数
pathrm() {
    # 環境変数名を第一引数として受け取る
    envname=$1
    # 環境変数の中に格納されているパスを保存
    eval envpath='$'$envname
    # 第二引数として受け取った追加するパスの末尾から/を除き変数pathtormへ保存
    pathtorm="${2%/}"
    # 環境変数内から該当するパスを削除
    # (1) パスが含まれている場合は空白へ変換する
    # (2) 先頭または末尾にコロンがある場合は削除する
    # (3) コロンが二連続する場合は一つ削除する
    eval $envname="$(echo $envpath | sed -r -e "s;(^|:)$pathtorm(:|$);\1\2;g" -e 's;^:|:$;;g' -e 's;::;:;g')"
}

# 使用例

# 先頭へ追加
pathadd PATH "$HOME/.local/bin"
# 末尾へ追加
pathadd PATH "$HOME/MyProject/MySoftware/bin" after
```

パスの区切り文字がスラッシュ（/）なので、sedの文字置換でよく使われるスラッシュ（/）を使うことができません。ですので代わりにセミコロン（;）を使用しています。
BlockChainを学ぶためにHyperledgerを導入したpart1

CouseraのIBM BlockChainを受講。
https://www.coursera.org/learn/ibm-blockchain-essentials-for-developers

こちらも参考にさせていただいた。
npm トラブルシューティング
https://qiita.com/h_digitalhearts/items/ba6eadb758a667345b27

Hyperledger Composer
https://hyperledger.github.io/composer/index.html

VisualStudioでHyperledgerを導入。
npm周りを固めて、
※composerでつまずいたが、pythonをインストールし直したら解決した。
localhostに繋いだら、Hyperledgerが起動した。

簡単に言うと、中間マージンを取っている人たちの「中抜き」を想定している。
例：対象は資産や家　参加者は売り手と買い手　取引は売り買いを行い、ブックキーピング。
HighChartsの散布図に1000個以上のデータをプロットしたいとき

はじめまして、geraldともうします。プログラムを書いていたのは数十年前で、最近はもっぱらマーケティング系のデータ分析をする人になっています。
そんな過程でデータヴィジュアライズとか統計とかなんだとかに携わることが増えてきたので、備忘録を兼ねて、時々書いてみようと思います。

今回は先日困ったHighChartsの散布図に1000個以上のデータをプロットしたいときの設定です。

サンプルデモだと

```html
<script src="https://code.highcharts.com/modules/boost.js"></script>
```
を取り込んで、

```js
    boost: {
        useGPUTranslations: true,
        usePreAllocated: true
    },
```
と書いてあげれば100万個のプロットができるよとあります。

が、いくらこれをやってもできなくて困りました。

それで色々調べたら、上記に加えてこの設定が必要なのだとわかりました。

```js
plotOptions:{
  series:{
    turboThreshold: [ここに表示したいプロット上限値を数字で書く]
  }
}
```
なんで1000個までしか出ないのかなあとおもっていたら、デフォルトが1000個なのだそうです。
https://api.highcharts.com/highcharts/plotOptions.series.turboThreshold

ということで、「HighChartsの散布図、たくさんのデータが表示できなくて使えないなあ」とお困りの方がいたら、お試しください。

では、きょうはこのへんで。
Artisan Console の引数・オプション値を取得したい時


```
php artisan hoge hanako --age=20
```

こういう `hanako` という引数や `--age=20` といったオプションの値を取得するにはどうするの、という話。

## 公式ドキュメントの場所
指定方法 : `Defining Input Expectations`
https://laravel.com/docs/5.6/artisan#defining-input-expectations


値の取得方法 : `Command I/O`
https://laravel.com/docs/5.6/artisan#command-io

## 引数 `Arguments`

### コマンドでの指定方法

引数を指定する時は `{user}` のように `{}` で囲むだけ。

```
protected $signature = 'email:send {user}';
protected $signature = 'email:send {user?}'; //null許容
protected $signature = 'email:send{user=henohenomoheji}'; //デフォルト指定
```

実際に実行するコマンドは

```
php artisan email:send hanako
```

### 引数の取得

引数で落ちてくる `hanako` を取得するには `$this->argument('user')` とする。

```
public function handle()
{
    $user = $this->argument('user');
}
```

## オプション `Options`

### コマンドでの指定方法

オプションに値を渡す時は `{--age=}` というように `--` をprefixして `=` に値を渡す。

```
protected $signature = 'email:send {user} {--age=}';
protected $signature = 'email:send {user} {--age=18}' //デフォルト指定;
protected $signature = 'email:send {user} {--Q|age=}'; //ショートカット記法
```

実際に実行するコマンドは

```
php artisan email:send hanako --age=20
```


あくまでオプションなので、コマンド実行時に `--age=20` がなくてももちろん動く。


### オプション値の取得

オプション値の `20` を取得するには `$this->option('age')` とする。

```
public function handle()
{
	$age = $this->option('age');
}
```
avrでeeprom

#概要

avrでeepromやってみた。
attiny85でアセンブラで書いた。
attiny85には、512byteのeepromがある。

#環境

avr studio 4
attiny85 1mhz
tera term
usb-serial

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/8f5f3897-d617-cb85-510b-c0d98731b48f.png)



#サンプルコード

eepromの先頭から２５５→１まで、書き込んで読んでみる。

```
rom_w:
	sbic	EECR, EEPE
	rjmp	rom_w
	ldi 	r16, (0 << EEPM1) | (0 << EEPM0)
	out 	EECR, r16
	out		EEARH, YH
	out		EEARL, YL
	out		EEDR, r22
	sbi		EECR, EEMPE
	sbi		EECR, EEPE
	ret

rom_r:
	sbic	EECR, EEPE
	rjmp	rom_r
	clr 	r0
	out 	EECR, r0
	out		EEARH, YH
	out		EEARL, YL
	sbi		EECR, EERE
	in		r16, EEDR
	ret

setup:
	ldi 	r16, high(RAMEND)
	out 	SPH, r16
	ldi 	r16, low(RAMEND)
	out 	SPL, r16
	cbi 	DDRB, PB0
	sbi 	DDRB, PB1
	sbi 	PORTB, PB1
loop:
	ldi		YL, 0
	ldi		YH, 0
	ldi 	r22, 255
	inc		YL
	rcall	rom_w
	dec		r22
	brne	PC - 3
	ldi		YL, 0
	ldi		YH, 0
	ldi 	r22, 255
	inc		YL
	rcall	rom_r
	rcall	bin2hex2
	ldi		r19, ' '
	rcall	send
	dec		r22
	brne	PC - 6
	rcall	wait
	rjmp	PC - 1

```

以上。