OmniAICreator/Qiita-1.07M huggingface dataset:
centos7 phpinfo.phpが表示されない

#環境

```
cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
```

```
php -v
PHP 7.0.20 (cli) (built: Jun  7 2017 07:50:14) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
```

```
httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 12 2017 21:03:28
```

#事象

今までnginx + phpを使用していたがapache に移行しようとした時に
info.phpにアクセスすると真っ白な画面になる

```info.php
<?php
 phpinfo(); 
?>
```
特にapacheはデフォルトのままでいじっていないので何がいけないのかわからない状況

#助けてgoogoel先生！

早速google先生に助けを求めたのですが以下で解消できるとの情報が多数でした。
[phpinfo()がなぜか表示されず真っ白のページが表示される](http://qiita.com/awesam/items/ba6ba6eaa12761e58401)

/etc/php.ini のshort_open_tag　がオフとなっていることが原因との記載あり！

確かにのちに検証したところこちらも正しい設定でしたが他にも原因があったのか
php.iniの修正だけでは戻らなかった。（今のinfo.phpは<?php~としてるしなぁ）

で色々探していたら以下の回答発見

[phpinfoが表示されない](https://okwave.jp/qa/q9211786.html)

>後はhttpd.confの中（一番下がお勧め）に
～～～～
LoadModule php7_module modules/libphp7.so
AddHandler php7-script .php
DirectoryIndex index.php
～～～～

こちらの記載をhttpd.confに追記したらいけました。

というか
```
AddHandler php7-script .php
```

こちらだけの記載でいけました。
原因は後ほど追求します。

まずは表示できてよかった

end
ブラウザ向けのWeb Pushをトライしてみた

# 概要

Web Pushをトライした時の情報を整理する目的です
ブラウザを立ち上げるとFacebookやGmailからプッシュ通知をよく目にすると思いますが、あれを実装します
基本的な仕組みは以下のエントリでわかりやすく解説されていますので、ご参照ください

- [GCMの登録が不要になったChromeのWeb Pushを試してみる](http://qiita.com/tomoyukilabs/items/9346eb44b5a48b294762)
- [Web Pushでブラウザにプッシュ通知を送ってみる](http://qiita.com/tomoyukilabs/items/217915676603fda73b0a)

# ざっくりとした処理の流れ

- プッシュ通知登録時
ブラウザ（プッシュ通知許可） -> アプリケーションサーバ（ユーザのプッシュ通知キーを保存）

- プッシュ通知する時
アプリケーションサーバ（通知情報）-> Google Firebase Cloud Messaging(FCM) -> ブラウザ（通知内容の表示）

# さっそくコード

以下の説明は[こちらのサンプルコード](https://github.com/comefigo/webpush-sample)で説明します
このコードはGoogleの[ウエブアプリへのプッシュ通知](https://developers.google.com/web/fundamentals/getting-started/codelabs/push-notifications/?hl=ja)をベースに実装したものです

## 構成

```
  - static                 # クライアント
    - js
      - webpush.js         # プッシュ通知の購読是非などの処理
      - webpush-sw.js      # プッシュ通知を許可した際に、対象のブラウザに保存されるスクリプト
    - index.html           # プッシュ通知購読を求めるページ
    - success.html         # プッシュ通知を押下時に遷移するページ
  - subscriptions
    - subscription.json    # ユーザがプッシュ通知を許可した際に購読キーを保存する（ストレージとしての仮置き）
  - .env                   # 環境変数
  - app.js                 # Webアプリケーション(プッシュ通知を送る)
  - subscription.js        # プッシュ通知の購読キーを保存や取り出す処理
```

## 実行手順

1. [Googleのcompanion-site](https://web-push-codelab.appspot.com/?hl=ja)で秘密鍵と公開鍵を生成する
![2.png](https://qiita-image-store.s3.amazonaws.com/0/30522/c450af66-8734-b8d8-57fc-35559b7a028d.png)

2. 手順1で生成した公開鍵と秘密鍵を.envファイルに追加します

    ```
    APP_PUB_KEY=<public-key>
    APP_PRV_KEY=<private-key>
    ```
3. 手順1で生成した公開鍵をwebpush.jsに追加します

    ```
    'use strict';

    const applicationServerPublicKey = '<public key>';
    ```

4. nodejsライブラリのインストール

    ```
    > npm install
    ```

5. サンプルアプリの起動

    ```
    > npm start
    ```

6. [プッシュ通知ページ](http://localhost:3000/static/index.html)にアクセスし、「プッシュ通知を有効」を押下
    ![1.png](https://qiita-image-store.s3.amazonaws.com/0/30522/c99fc8bc-1128-0cbd-3e95-66e57c1b76ae.png)
     ***＊ブラウザがプッシュ通知に対応していない場合は「Push messaging is not supported」が表示されます***

7. プッシュ通知を許可した場合は、手順1で生成した公開鍵をもとに購読キーが生成されます
   許可した時点でsubscription.jsonにこの購読キーが保存されます
   あとは好きなタイミングでサーバサイドでその購読キーを用いてユーザにプッシュ通知を送ることができます
   今回はユーザの識別子としてuseridという文字列を用いていますが、システムに応じて一意のユーザ識別子で保存してください  
   また、それと同時にwebpush-sw.jsがブラウザのserviceworkerに登録されます
   chromeのアドレスバーに```chrome://serviceworker-internals```を入力することで確認できます
   ***＊webpush-sw.jsを更新した場合は、手動で登録済みのserviceworkerを削除するか、更新する処理を追加してください！***
   
    ![3.png](https://qiita-image-store.s3.amazonaws.com/0/30522/89a889dd-9a30-0de8-1252-5f26d3f77db1.png)

8. 「Push Nortification」ボタンを押して、プッシュ通知を送る
    今回はクライアント側にトリガーを置きましたが、システムに応じてサーバ側から送信してください

9. プッシュ通知が表示され、クリックするとsuccess.htmlに遷移します  
    ![4.png](https://qiita-image-store.s3.amazonaws.com/0/30522/143876c2-8cdc-6179-c943-0e44151030fa.png)

# ハマったところ

前述でも書きましたが、webpush-sw.jsを更新したのに反映されないところで少々ハマりました。
それ以外はGoogle公式のチュートリアルで一通り試したので問題なく実装できました
ViewModelからNavigationPageの画面遷移できたのでメモ

ググって出てくるのは大体コードビハインドからNavigation.PushAsyncする方法。
その場合、遷移前にごちゃごちゃした処理がある場合もコードビハインドに書くってことになるの？それってどうなの？
って感じだったのでViewModelから遷移させる方法を考えてみました。

とは言ってもものすごく簡単なので何か落とし穴がありそう。。。

```csharp:MainPageViewModel.cs
public class MainPageViewModel
{
    private INavigation navigation;

    public MainPageViewModel(INavigation nav)
    {
        this.navigation = nav;
        this.ScreenTracitionCommand = new Command(() => ScreenTracition());
    }

    public ICommand ScreenTracitionCommand { get; }
    private void ScreenTracition()
    {
        if(this.navigation != null)
        {
            navigation.PushAsync(new NextPage());
        }
    }
}
```
ViewModelのコンストラクタでNavigationを受け取って変数に保持しておいて画面遷移を実行するイベントでNavigation.PushAsyncするというもの。
この方法で画面遷移と戻るボタンで戻ることはできました。

他のソースはこんな感じになってます。

```csharp:App.xaml.cs
public App ()
{
	InitializeComponent();

	MainPage = new NavigationPage(new XF_NavigationPage.MainPage());
}
```
NavigationPageとして扱うので包んであげます。


```xml:MainPage.xaml
<StackLayout Spacing="20" Padding="15">
    <Button Text="ViewModelから画面遷移" Command="{Binding ScreenTracitionCommand}"/>
    <Button Text="xaml.csから画面遷移" Clicked="Button_Clicked"/>
</StackLayout>
```
ScreenTracitionCommandはViewModel側で画面遷移させるためのイベントです。
参考までにButton_Clickedでコードビハインドからの画面遷移も実装しました。


```csharp:MainPage.xaml.cs
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        this.BindingContext = new MainPageViewModel(Navigation);
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        Navigation.PushAsync(new NextPage());
    }
}
```
BindingContextにMainPageViewModelを設定する際、引数にNavigationを渡してあげます。
Button_Clickedはコードビハインドから画面遷移する場合のイベントです。

NextPageはVisualStudioでContentPageを追加したときのデフォルトの状態なので割愛します。

そういえば「空白のページ」を追加すると「InitializeComponentが見つかりません」のエラーが取れませんでした。（「Content Page」を追加で回避）
このエラーが出るとXamarinのバグなのかコーディングミスか分からなくなるのでMSさんには早く治してほしいです。
ペアレンタルコントロールリンク集

知人に依頼されたので、私が iPhone/iPad に対して適用しているペアレンタルコントロール手法のリンクをまとめました。

## iOS (iPhone/iPad）

- [iPhone、iPad、iPod touch でペアレンタルコントロールを使う](https://support.apple.com/ja-jp/HT201304)

このページに記載されている方法で、iOS 標準アプリ群（Safari，ミュージックなど）に対してはペアレンタルコントロールが可能です。

アプリ内で表示される広告については、以下の通り。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">iPhoneの人はアプリで子供が広告触らないよう物理的な防御策しなくても機能があるよ。<br>機機→一般→アクセシビリティ→アクセスガイドオンで、アプリ画面でホームボタントリプル押し。無効にしたい範囲を選んでパスワード設定して開始。ホームボタン無効になるし赤ちゃんにも安心して渡せるよ。 <a href="https://t.co/tBiBxFwJ89">pic.twitter.com/tBiBxFwJ89</a></p>&mdash; 🐞ミリー🐱 (@disney6942) <a href="https://twitter.com/disney6942/status/830046611543711744?ref_src=twsrc%5Etfw">2017年2月10日</a></blockquote>

## Google

- [セーフサーチを使用して Google で露骨な表現を含む検索結果をブロックする](https://support.google.com/websearch/answer/510/?hl=ja)

## Amazon Prime

- [Amazon Prime ビデオのペアレンタルコントロールコントロール](http://douga-service.com/amazon-prime-video-parental-control/)
 - 少し手順が古くなっているようです。
 - 「アカウントサービス」→「ビデオライブラリ」と選択して、ビデオライブラリの画面に移動。
 - 右上の「設定」をクリックして、「Amazon ビデオの設定」画面に移動。
 - 後は、上記の[Amazon Prime ビデオのペアレンタルコントロールコントロール](http://douga-service.com/amazon-prime-video-parental-control/)に従って設定。
- [Amazon アプリ内課金の制限](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201357720)


## Youtube

- [制限付きモードを有効または無効にする](https://support.google.com/youtube/answer/174084/?hl=ja)

## Netflix

- [Netflixアカウントでペアレンタルコントロールを設定するには](https://help.netflix.com/ja/node/264)
Rubyでif文やwhile文とか言っている入門は非推奨

今日は言葉狩りを行いたいと思います。

## Rubyではifもwhileも式である

生粋のRubyistである皆さんにとっては当たり前のことではありますが、Rubyでは`if`も`while`も**式(expression)**です。決して**文(statement)**ではありません。これはCなど他のプログラミング言語にはないRubyの特徴の一つであり[^1]、この違いは小さいようで大きいです。初心者のうちから、この違いを意識しておく必要があります。

プログラミング初心者にとって式と文の違いなんてどうでもいいのではという暴論もあるかも知れませんが、初心者だからこそ、式と文を意識させるべきです。式と文の違いがわからなければ、プログラミングの構造を理解することは永遠に来ないと思われるからです。

## if文、while文という表現はおかしい

`if`も`while`も式ですから、if式、while式という表現はあっても、if文、while文という表現はおかしくなります。if式が何かの式の一部で無ければ全体が文になるとはいっても、if式はどこまで行っても式であり、その外側に式が無いから、文になっているにすぎません。むしろ、強調すべきは、その部分は式ですので、代入式の右辺やメソッド呼び出しの引数にできると言うことです。

しかし、Rubyの入門を名乗るサイトや書籍等において、if文、while文という表現が見受けられます。これを見た初心者は、そのままそれを信じ、Qiitaの記事においてif文、while文という表現を使ってしまっているものも見受けられます。これは由々しき事態です。式と文の違いが曖昧なまま学んでしまえば、式特有の書き方に出会ったときに戸惑う結果になるでしょう。他言語に移ったときも、文であることによる制限が理解できなくなる可能性もあります。

## Rubyでif文やwhile文と言っているものは駆逐すべし

ということで、私はこの度、このような正確な表現ができていない入門サイトや書籍について、**Rubyについての知識が足りない人が書いた不正確な情報**と断定し、そのような入門サイトや書籍は読んだり、参考にしたりすることを推奨しないことにします。上級者であれば、マサカリを投げる訓練所としての価値はあるかも知れませんが、初心者にとっては害悪以外の何ものでもありません。

## **非**推奨入門サイト

if文やwhile文と表現しているサイトを取り上げます。本当は式であることを記述の上、あえてそのような表現を使っている場合は除外します。また、他では一貫して「if」や「if式」て書いてあるのに一つや二つだけ「if文」と書いてしまっている場合も、誤字であると判断し、除外します。改版等で修正された場合は、お知らせください。

「Ruby 入門」でググって引っかかる日本語のサイトを対象にしています。入門サイト紹介のページについては、紹介されたサイトを取り上げています。書籍等は購入しないと中身の確認が難しいため除外しています。なお、動画等の講座については、目次等でどのように表現しているかで判断しています。その内容を全て見ていませんので、目次に反して、文ではなく式として説明されていたというのであれば、お知らせください。

* [Ruby入門 - RubyLife](http://www.rubylife.jp/ini/)
* [Ruby | プログラミングの入門なら基礎から学べるProgate[プロゲート]](https://prog-8.com/languages/ruby)
* [はじめてのRuby - CODEPREP | プログラムを書いて動かしながら学ぶ実践型のプログラミング学習サービス](https://codeprep.jp/books/24)
* [UNIXプログラミング 「Ruby入門」 by 清川清](http://www.lab.ime.cmc.osaka-u.ac.jp/~kiyo/pub/lecture/unixpro/ruby/)
* [Ruby入門編(8レッスン) | プログラミング学習ならpaizaラーニング](https://paiza.jp/works/ruby/primerfemale)
* [Ruby入門 | Schoo - 参加型のオンライン動画学習サービス](https://schoo.jp/class/3698)

上記サイトの中には、もしかしたら、わかりやすい、よくできている、入門用に勧められたというサイトもあるかもしれません。しかし、if文、while文と表記している段階で、制作者がRubyについてよくわかっていない可能性が非常に高く、全体的に信頼できる内容とは言えません。私はこれらのサイトを**非推奨**とし、初心者が読んだり、参考にしたりすることを一切勧めません。

## 【おまけ】もう一つの判断基準、それはfor

Rubyには`for`がありますが、`each`を使用した場合とほぼ同じ動作になります。ほとんどの場合`for`は不要であり`each`を使うべきとされています[^2]。この`for`と`each`の関係性についてあまり説明していないサイトや書籍が見られます。`for`についてどのように説明しているのか、`each`とどう違うのか、どちらを使うべきなのか、そういった所がどう書いてあるかはサイトや書籍の著者のレベルを判断する一つの基準になると思います。

[^1]: `if`や`while`が式である言語が他に無いわけではありません。Scala、Kotlin(ただし`while`は文)、CoffeeScript等があります。しかし、多くのCライクな文法の言語、C++、Java、C#、JavaScript、Perl、PHP等ではCと同じく文です。これらの言語では文末の`;`が省略できない(JavaScriptを除く)ため、単独の式が単独の文になることができないという事情があると思われます。ただ、Cライクでは無い、Python、Go(ただし`while`はない)、Swiftも文ですので、やはり、全て式とする言語は少数派と言えます。

[^2]: Rubyコミュニティでのデファクトスタンダードである[Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide)においては、[使うべき理由を説明できる人以外は`for`を使うべきでは無い](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#no-for-loops)とされています。
UnityでVR対応のどこでもドア実現を目指す その1 Depth Mask編 の 補足

# 概要
[UnityでVR対応のどこでもドア実現を目指す その1 Depth Mask編](http://qiita.com/tsgcpp/items/37fea2ef7e140c397968)
上記ページにて利用してる知識やテクニックについての解説を記載します

# 備考
- 今回のどこでもドア実装に関してのポイント部分は**太字**で記載します

# Unityにカメラの仕様
※以下は将来的に変更される可能性があるかもしれません

## Target Texture 指定の有無
カメラのTarget Textureの指定の有無で、挙動が一部変更される

|  | 非VR  | VR Support  |
|:---|---|---|
|**指定無し**  | Screenに描画 | 両目用カメラが生成され、両目それぞれのScreenに描画  |
|**指定有り**  | TargetのRender Textureに描画  | 非VRと同様、単体カメラとして動作し、TargetのRender Textureに描画 |

※上記挙動は**MainCameraタグの有無に関わらず**、どのカメラにも適用される

VRでも両目用が生成されることが今回のポイントの１つ

## カメラが複数存在する場合の描画順
カメラが複数存在する場合 カメラの設定項目のDepthの値が 小さい -> 大きい の順番でScreenに描画される

※後述のDepth Bufferと混同する可能性があるため、以降「カメラのDepth」と記載

## Depth Test
あるメッシュの描画時にカメラからの距離を保存し、次のメッシュを描画するときに

1. カメラから見て奥であれば描画しない
2. カメラから見て手前であれば描画する

を行う仕組み。

## Depth Buffer
あるメッシュを描画した際、カメラからの距離をピクセル単位で保存した情報。  
この情報をもとに次のメッシュを描画するときにカメラから見て奥、手前どちらにあるかを比較することができる

## カメラの Clear Flags
Clear Flagsとは自分より前回のカメラ(「カメラのDepth」が自分より小さいカメラ)が描画した情報のうち、どの情報をClearするかを指定するフラグです。  
簡易的に説明を書きますが、詳細は公式ドキュメントを参照してください。

| フラグ名 | 説明 | 備考 |
|:---|---|---|
| Solid color  | 描画開始前にBackground設定色で塗りつぶし、Depth Bufferもクリアする | 前回のカメラの描画を引き継がない |
| Skybox | 描画開始前に**Depth Bufferをクリア**し、不透明メッシュの最後にskyboxメッシュを描画 | 描画開始時、前回のカメラの描画した**メッシュはそのまま** |
| Depth only | 描画開始前に**Depth Bufferをクリア**する。Skyboxは描画しない | 画開始時、前回のカメラの描画した**メッシュはそのまま** |
| Don't Clear | 前回カメラが描画した情報をすべて引き継ぐ | 前回カメラの描画完了後の状態で現在のカメラの描画を開始 |


## Skybox
Skyboxメッシュは以下の特徴があります。

* **不透明メッシュの最後(Render Queue 2500より後)**に描画
* **Depth Bufferが初期値の領域**に描画

※Render Queueについては後述

以下に画像を例にすると、

![multi camera normal.JPG](https://qiita-image-store.s3.amazonaws.com/0/188798/fc3b2c4a-bf4b-5ec7-27f9-dcc00c3fa259.jpeg)

1. 赤カメラ(カメラのDepthは-1)が先に描画
  * Sceneビュー（画像の左上)のプレビューが描画したもの
2. 青カメラ(カメラのDepthは0)が次に描画
  * 前回のカメラの情報を青球、そして**skyboxメッシュで上書き**
  * 青カメラの描画開始時に**Depth Bufferがクリア**されたため

よってSkyboxで上書きされたくない場合は、先にその領域のDepth Bufferを更新すれば良いことになります。

## Depth Mask
 [Depht Mask Material](http://qiita.com/tsgcpp/items/37fea2ef7e140c397968#3-depth-mask%E7%94%A8shader%E3%82%92%E7%94%A8%E6%84%8F) はこのテクニックを利用しています。

Depth Mask Material を利用すると以下のことが実現できます。

* **スクリーン上の色を変更することなく**、そのメッシュの領域の**Depth Bufferを更新**

以下の画像で言えば、明るい部分にDepth Maskをかけています。

![red2.JPG](https://qiita-image-store.s3.amazonaws.com/0/188798/5e55344c-bab6-3cef-052f-c22789e68fe9.jpeg)



※参考：http://wiki.unity3d.com/index.php?title=DepthMask (英語ですが、右部の画像はDepth Maskを使って、船の内部に水面が描画されないようにしています)

## Render Queue
Unity のカメラは描画対象のメッシュ(「Culling Mask」で設定)を描画するとき、
Materialの設定「Render Queue」を参考にして、描順が決められます。

Render Queueの値が 小 -> 大 の順番で描画されます。

[Depth Mask用ShaderをアタッチしたMaterialを作成](http://qiita.com/tsgcpp/items/37fea2ef7e140c397968#4-depth-mask%E7%94%A8shader%E3%82%92%E3%82%A2%E3%82%BF%E3%83%83%E3%83%81%E3%81%97%E3%81%9Fmaterial%E3%82%92%E4%BD%9C%E6%88%90) ではDepth Maskを先にかけるために、他メッシュより小さい値に変更しています。

### SkyboxのRender Queueについて
Unity 5.6.1f1では、Skyboxメッシュの描画はRender Queue 2500より後に実施されました。
よってDepth Mask MaterialのRender Queueを2500より前にすれば、少なくともskyboxには上書きされないということになります。
go-ethereum(geth)でSolidityのコンパイルが出来ない場合

Ethereumの勉強をしていたら参考にしていた手順が古くなっておりちょっと手間取ったので対処法などを記載する。

## gethでのコンパイルが出来ない

Ethereum のコントラクトを勉強する過程で少し前に発行された本やwebの記事([Ethereum入門](https://book.ethereum-jp.net/first_use/contract.html))などを参考にしていると、
go-etereum(geth)にsolcを導入してgeth上でコンパイルする前提で進められている場合が多い。

しかし、gethのバージョン1.6以降ではコンパイラのサポートを辞めてしまったようだ。
https://github.com/ethereum/EIPs/issues/209
そのため、コンパイラの設定関連のコマンドは軒並みエラーになってしまう。
最初は自分の環境構築ミスを疑って色々試行錯誤してしまったためかなり時間をとられてしまった。

```
>  admin.setSolc("path_to_your_solc")
TypeError: 'setSolc' is not a function
    at <anonymous>:1:2

> eth.getCompilers()
Error: The method eth_getCompilers does not exist/is not available
    at web3.js:3104:20
    at web3.js:6191:15
    at web3.js:5004:36
    at <anonymous>:1:1
```

## 代替手段

別の手段でコンパイルしてからデプロイすればよい。
[Browser-Solidity](https://ethereum.github.io/browser-solidity/)を使う場合の手順

1. Browser-Solidity上でコードを書く
2. コードを書き終わったら、右側のメニューにある「Contract details (bytecode, interface etc.)」をクリック

<img src="https://qiita-image-store.s3.amazonaws.com/0/126784/2a44cc07-d7a3-a81b-f4ec-4a5c47e38edd.png" width=50%>
3. 「Web3 deploy」のテキストボックスに出力された内容をコピペ

<img src="https://qiita-image-store.s3.amazonaws.com/0/126784/48b90ce1-c51a-56cf-6194-55e1ade9fd0f.png" width=50%>

4. コンストラクタの引数がある場合は「var _numProposals = /* var of type uint8 here */ ;」などになっているので値の部分を適当に置き換えてgethのコンソールに貼り付ける。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/126784/39c54d4f-c9c0-0425-1430-3448ed6bfa1c.png)

この時点でブロックチェーンへのコントラクトの送信が出来ているので、あとは採掘を実行することでコントラクトを登録してアドレスが付与される。
【メモ】Laravelでcron設定しようとしたけどどこに記述すればいいか分からなかったので調べました

■やりたかったこと
タスクスケジュールの設定を行い自動実行されるように設定したかった。

readoubleを参考に設定しようとしたけど、

```php
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
```

この記述をどこに記述すればいいか分からなかったので調べました。
(Kernel.phpは記述済み)

■結論
crontabというファイル？に設定するみたい。
以下のコマンドでファイルを開ける（場合によってはエディタを選択させられる）

```php
crontab -e
```
あとは、

```php
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
```
このコードを記述して保存するだけ。
ちなみに、```/path-to-your-project/```の部分はLaravelプロジェクトまでのフルパスを記述するみたい。
自分の場合は、```~/Code/Laravel/```のように```~```から記述するとうまく行きました。
(```~```が無いとうまく実行されなかった)


参考
https://readouble.com/laravel/5.4/ja/scheduling.html
https://teratail.com/questions/2170
http://qiita.com/meso_/items/202248ed0123f8e65a17
さくらVPS & GitLabで環境を構築する

ゲームジャム等でBitbacketやGitHubを使うと料金が随時かかるためGitLab環境を構築する。

|プラン|さくらVPS 1G|
---|---
|サーバーOS|CentOS7|
|環境|OSX (MacBookPro)|

GitLabのページからOSにあったものを選択すると使用するコマンドが表示
https://about.gitlab.com/downloads/

# 1. Install and configure the necessary dependencies 
```
sudo yum install curl policycoreutils openssh-server openssh-clients
sudo systemctl enable sshd
sudo systemctl start sshd
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
```

# 2. Add the GitLab package server and install the package 
必要なパッケージは[こちら](https://packages.gitlab.com/gitlab/gitlab-ce)から

```
curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-9.3.3-ce.0.el7.x86_64.rpm/download
rpm -i gitlab-ce-9.3.3-ce.0.el7.x86_64.rpm
```

# 契約メモリ1GBだと反応が重いので設定修正
```
# sudo vim /etc/gitlab/gitlab.rb
```
```/etc/gitlab/gitlab.rb
unicorn["worker_processes"] = 1
postgresql["shared_buffers"] = "128MB"

※これの変更は必要なかった external_url 'http://XXXXXXXX.vs.sakura.ne.jp'
```



# 3. Configure and start GitLab 
```
# sudo gitlab-ctl reconfigure
```

# 表示確認
IPアドレスまたはホスト名(~.sakura.ne.jp)で表示確認

# その他未設定項目
・セキュリティ関連
・ログ出力関連
golangのお勉強11+goa


## 公式の説明を見る（goagen）

goagen：goa のツール · goa :: Design-first API Generation
https://goa.design/ja/implement/goagen/

### bootstrap

> bootstrap: app、main、client、swagger の各ジェネレータを呼び出します。

お、JavascriptAPIとかは生成しないので必要なら別で生成ね。

### regen

> goagen main でサービスを立ち上げて、新しいリソースやアクションがデザインに追加されたら、goagen main --regen を走らせて、既存のコントローラを保持しながら新しい空のコントローラ実装を追加する、というのが典型的なワークフローになるでしょう。
> 注: --regen を機能させるために、コントローラの実装は 必ず コメントの間に置かなければなりません。
再生成コードは、これらのコメントを頼りにして、保持すべき非 Scaffold なコードを見つけます。

なるほど。コメントの間に書くの大事。

### goagen js

mzabriskie/axios: Promise based HTTP client for the browser and node.js
https://github.com/mzabriskie/axios

ブラウザでもNodeJSでも対応で、ブラウザ対応も手厚い、コールバックじゃなくプロミスのAjaxライブラリ。かな。
vue.js界隈でも使われているみたい。

### schema

> goa サービスにマウントして /schema.json の下でそれを提供できるように JSON とコントローラの両方を生成します。

へー。外部サービスとの連携とかにつかうのかしら。隠蔽すべきものは隠蔽されてるかな。

## 公式の説明(goagen以外で気になるところ)

### goa のサービスを実装する · goa :: Design-first API Generation
https://goa.design/ja/implement/overview/

全体的にどういう使い方を想定しているかのイメージが湧いて大事かも。

### エラーハンドリング · goa :: Design-first API Generation
https://goa.design/ja/implement/error_handling/

> コントローラアクションは、デザインで定義された約定を実装する責任があることに注意してください。 つまり、アクション定義にリストされていない HTTP ステータスコードを使用するエラークラスを定義するべきではありません。

### goa プラグインジェネレータ · goa :: Design-first API Generation
https://goa.design/ja/extend/generators/

> アルファベット順にソートされた API リソースの名前を含む names.txt というひとつのファイルを作成するジェネレータを実装してみましょう。

なるほど。そういうことができるのね。

### ロギング · goa :: Design-first API Generation
https://goa.design/ja/implement/logging/

ロギング周りの自由度は高くなっているみたい。
サービスでの使用とミドルウェアでの使用の分類があり、
DBなどからはgoaとの結合を疎にした別の関数経由でロギングしたらいいじゃない的なことが書いてあるけどまだよくわからん。

> インスタンス化されるとすぐに、これらのアダプターの1つを利用して、サービスのロガーを goa に注入する必要があります。 

### セキュリティ · goa :: Design-first API Generation
https://goa.design/ja/design/security/

> goaには、Basic認証、APIキー（共有秘密鍵）、JWT、OAuth2など、複数のセキュリティスキームが組み込まれています。

アクションごとに認証を上書きもできるらしい。

### gorma プラグイン · goa :: Design-first API Generation
https://goa.design/ja/extend/gorma/

gormを使えるプラグインらしい。。使いたいけどまだドキュメントも少ないって書いてるな。。
コントローラーでの独自でのDB操作の邪魔にならないなら使ったらいいのではないか。。

goのgoaでAPIをデザインしよう（Model編） - ぺい
http://tikasan.hatenablog.com/entry/2017/05/15/172535

> カスタマイズ出来る
> gormaってよくわかんないやつ嫌だなーと最初は思ってたんですけど、実はこいつはgormというORMのコードを自動生成してくれてるだけなので、gormの使い方を理解していればカスタマイズはいくらでも出来ます。

読んだところよさげ。

goのgoaでAPIをデザインしよう（Model編②） - ぺい
http://tikasan.hatenablog.com/entry/2017/05/22/214938

> gormaを使えばよくあるクエリへの対応などは問題なく出来ます。ですが、どうしても無理な場面もあるので、やっている案件に発生するクエリの複雑さによって採用するかしないか決めるべきだと思います。

どうしても無理な場面ってどういうときだろう。

#### 実際にモデルを作る

記事にあるサンプルをみないとわからなかった。。
apiのファイルとは別でmodel.goを作った。別名でもできた。

リレーションをしないとヘルパーは空になるので意義がわからない。
とりあえずサンプルを実行するのが良さそう。

tikasan/goa-simple-sample
https://github.com/tikasan/goa-simple-sample
Pug で checked / selected / disabled属性などを動的付与する

# 背景

Pug（旧称Jade）で checked などの真偽型属性を条件に応じて付与したりしなかったりしたい場合、どうすれば良いのか。従業員に質問されて、たしかにちょっとわかりにくいかなと思ったので、今後同じところで迷う人のために書いておく。

# 前提
HTML5では checked 属性のような真偽型の属性に対して許容されている値は空文字から属性値と同じ値（大文字小文字は区別しない）のいずれかのみである（[W3C](https://www.w3.org/TR/2010/WD-html5-20101019/common-microsyntaxes.html#boolean-attribute)）。またそれ以外の文字列（"false"など）が指定された場合は不正値として空文字と同じように処理される。

したがって実際のブラウザの挙動では以下はいずれもチェック状態となる。

```html
<!-- 以下は正しい -->
<input type="checkbox" value="1" checked>
<input type="checkbox" value="1" checked="">
<input type="checkbox" value="1" checked="checked">

<!-- 以下は不正だがチェック状態として処理される -->
<input type="checkbox" value="1" checked="false">
<input type="checkbox" value="1" checked="0">
<input type="checkbox" value="1" checked="null">
```

# Pug で属性の存在自体を条件により切り替えるには？

上記のことから、変数の値を書き換えても属性が存在するだけで必ず真偽型の属性は真扱いとなってしまうので、チェック／非チェックを条件に応じて切り替えたい場合、属性の存在自体を出し分ける必要がある。これは簡単で、属性値として true / false を与えてしまえば良い。引用符では囲まない。

```jade
//- 真
input(type='checkbox' checked=true)
// → <input type="checkbox" checked>

//- 偽
input(type='checkbox' checked=false)
// → <input type="checkbox">
```

したがって特定の条件を満たすときのみ checked 属性を付与したいのであれば以下のように書く。

```jade
//- 5番目にチェックつける
//- checked=(i === 4) のカッコはなくてもOKだが、あったほうが見やすいと思うので付与している
- for (var i = 0; i < 10; i++)
  input(type='checkbox' checked=(i === 4))
```

上記は selected や disabled 属性などでも同様である。

# 余談1 文字列型属性の場合

三項式を使う。

```jade
- for (var i = 0; i < 10; i++)
  input(type='checkbox' value=(i == 4) ? "yes" : "no")
```

# 余談2 Qiita 投稿について
Qiita は未だにシンタックスハイライトの設定で "pug" ではなく "jade" を指定する必要があるらしい。
しかも上の条件式のところシンタックスハイライトがおかしくなっている……。
RailsのmodelにMongoMapper::Documentを使用してdefaultを設定した時にはまったこと

またまた業務中にはまった点についてのメモ。

以下の方法でUser#token == nilのdocumentを取得しようとしたが、何故か取得したtokenがnilではない。

```
pry(main)> User.where(token: nil).all
[
    [0] #<User:0x007fa1a2e966f0> {
                      "_id" => BSON::ObjectId('594915634cfad1a4ac0001ac'),
                    "email" => "foo@example.com"
               "created_at" => Tue, 20 Jun 2017 12:30:27 UTC +00:00,
                    "token" => "4ruqkwkmdf63upayxhxj6as6iblyhawt",
               "updated_at" => Wed, 28 Jun 2017 08:59:42 UTC +00:00,
                    "valid" => false
    }
]
```

元々User#token fieldは途中から追加したfieldのため、tokenがnilのdocumentは確実に存在するはず。
また、他のcollectionで試してみたら普通に取得することができる。

先輩にこの事象について相談し、何度かこのコードを実行しているうちに、先輩がtokenの値が毎回変化していることに気がついた。
User modelの定義を見に行ったら、以下のようにdefaultが設定されていた。

```
key :token, String,
  default: -> {
    SecureRandom.base64(15)
  }
```

このコード自体は自分が追加したものなので、見覚えはあった。

もしかしたらRailsのmodelを介してdocumentを取得したら、Userに設定されているdefaultが動作して、　dbにはちゃんとnilが格納されているdocumentであっても、modelのオブジェクトとして取得した瞬間にtokenに値がセットされているのではないか？という仮説を先輩が立てた。
一瞬言っている意味がわからなかったが、すぐに意味を理解することができた。この発言の前にinitializeとdefaultの挙動について少し話をしていたからだ。
そこで、modelを介さないコードで試してみることになった。
`User.collection.find`のように.Model.collectionを使用するとmongodbのドライバ経由でdbにアクセスできるらしい。
これで想定していたオブジェクトを取得することができる。

```
pry(main)> User.collection.find(token: nil).to_a
[
    [0] #<User:0x007fa1a2e966f0> {
                      "_id" => BSON::ObjectId('594915634cfad1a4ac0001ac'),
                    "email" => "foo@example.com"
               "created_at" => Tue, 20 Jun 2017 12:30:27 UTC +00:00,
                    "token" => nil,
               "updated_at" => Wed, 28 Jun 2017 08:59:42 UTC +00:00,
                    "valid" => false
    }
]
```

よし、問題は解決したので進めることができる！と思ったのだが、またすぐにはまってしまう。

やりたいことはUser#tokenをいじることだったのだが、以下のように書いたらエラーがでる。

```
pry(main)> User.collection.find(token: nil).each do |u|
pry(main)*   puts u.token
pry(main)* end
NoMethodError: undefined method `token' for #<BSON::OrderedHash:0x007fa1a6ae7708>
from (pry):11:in `block in <main>'
```

吐かれているエラーログから`User.collection.find`で取れるオブジェクトは`BSON::OrderedHash`だということがわかっているのでググってみたら、以下のURLがヒットした。
[MongoDB + Ruby. How to access document properties?](https://stackoverflow.com/questions/10163510/mongodb-ruby-how-to-access-document-properties)
この記事によるとどうやら`BSON::OrderedHash`は、`m.token`ではなく`m['token']`のように書く必要があるとのこと。
以下のように書いたらちゃんと取得することができた。

```
pry(main)> User.collection.find(token: nil).each do |u|
pry(main)*   puts u['token']
pry(main)* end
```

MongoとRailsの併用は難しい。。。
pecoやfzfで実行したコマンドを履歴に残す

[peco](https://github.com/peco/peco)や[fzf](https://github.com/junegunn/fzf)などのインタラクティブフィルターCUIツールを使うときに、履歴に残らないのが結構不便な時がある。例えば、fzfを使ってgitのレポジトリのブランチのログを見るとする。

```zsh
git log `git branch | fzf`
```

だが、これだとfzf実行後のコマンドではなく、上記のコマンドがそのまま履歴に残ってしまう。

```zsh
$ history -1

 6439  git log `git branch | fzf`
```

ここで、fzf実行後の`git log (fzf実行後のブランチ名)`の履歴を残して欲しい。なので、履歴に残すようにした。

環境は
Mac OS X Sierra 10.12.5
zsh 5.3.1 (x86_64-apple-darwin14.5.0)

以下のコマンドを実装した。

```zsh
# コマンドを履歴に残す
function save_history(){
  local cmd="$@"
  eval $cmd
  if test $? -ne 0
  then
    # 失敗したらそのまま終了
    return 1
  fi
  # 成功したら履歴に保存
  print -s $cmd
}
```

上記のコマンドをpecoやfzfを使ったコマンドの前で呼ぶだけ。

実行例

```zsh
save_history git log `git branch | fzf`
```

これでfzf後の履歴も残るようになった。

```zsh
$ history -2

 6453  save_history git log `git branch | fzf`
 6454  git log (fzf実行後のブランチ名)
```

（でも、エイリアスとか関数で設定しないで使うのはめんどくさい。もっといい方法あるのかな...？）
Deeplearning4jのKmeansを使うときに気をつけること

## 結論
deeplearning4jのKmeansを使うときに```distanceFunction```に```cosinesimilarity```を使ってはいけない。

## 理由
※deeplearning4jは2017/7/2時点で最新版の```0.8.0```です。

deeplearning4jにはKmeansの関数があります。以下のような形で使います。

```Java
KMeansClustering kmc = KMeansClustering.setup(num, iter, distanceFunction);
ClusterSet cs = kmc.applyTo(pointsLst);
```

ここで、```num```はクラスタ数、```iter```は繰り返し回数（```10```がよく使われる）、```destanceFunction```は距離関数（```euclidean```か```manhattan```か```cosinesimilarity```を指定できる）です。

さて、ここに地雷があります。```destanceFunction```に```cosinesimilarity```を指定すると、思ったような結果は出てきません。
※「普通```euclidean```を指定するだろ」って方は問題なしです。

鋭い方はお気づきでしょうが、```cosinesimilarity```だけ類似度です。残りの2つは距離です。すなわち、**```cosinesimilarity```は値が大きいほど（MAXは1）類似度が高く、残りの2つは値が小さいほど類似度が高い**ということです。

deeplearning4jのプログラム的にはこんな感じになっています。```ClusterSet.class```にて、

```java
    public Pair<Cluster, Double> nearestCluster(Point point) {

        Cluster nearestCluster = null;
        double minDistance = Float.MAX_VALUE;

        double currentDistance;
        for (Cluster cluster : getClusters()) {
            currentDistance = cluster.getDistanceToCenter(point);
            if (currentDistance < minDistance) {
                minDistance = currentDistance;
                nearestCluster = cluster;
            }
        }

        return new Pair<>(nearestCluster, minDistance);

    }
```

この関数で今あるクラスタと自分の距離を計算し、一番距離が短いクラスタに分類するわけです。すごく真当な処理ですが、```cosinesimilarity```だけ値の解釈が逆なので、ここでとんでもないことになります。

## おわりに
どうしても```cosinesimilarity```を使いたい場合は、現状だとextendsクラス作るしかないです。そこだけ例外処理加えてプルリク送ろうかと思いましたが、なんかコード汚いので辞めました。ほっとくのもどうかと思うのですが、どうしましょ。

## 追記
issuesに登録されていました。
https://github.com/deeplearning4j/deeplearning4j/issues/2361

どうやら「正常な動作」ということで片付いてるようです。たしかに・・・正常な動作ですけど「正しい処理」ではないですよね。使えなくするか、無理やり使うなら```cosinesimilarity```を```cosinedistance```として、```s[cosinedistance]=1-s[cosinesimilarity]```のみ受け付けるようにした方が良いと思いますね。
rbenvを使わず、ruby-build単体でRubyをインストールする

※特定バージョンにこだわらない場合、Amazon LinuxにRubyをインストールするならupdate-alternativesを使うのがおすすめです
[alternativesを使ってAmazon LinuxのRubyのバージョンを切り替える - Qiita](
http://qiita.com/aosho235/items/1544dbf1fc82021698fc)


- Amazon Linuxに指定バージョンのRubyをインストールしたい
- rbenvをシステムワイドにインストールするのは面倒くさい
- rbenv、普段は使っているけど詳細な仕様を把握してなくてなんか気持ち悪い

ruby-buildは単体でも使えるようなので、今回はそれを試してみた。

```
sudo yum -y install gcc-c++ openssl-devel git readline-devel
git clone https://github.com/rbenv/ruby-build.git
cd ruby-build
sudo ./install.sh
```

以上で`/usr/local/bin/ruby-build`がインストールされる。

```
# インストール可能なRubyバージョンのリストを表示
/usr/local/bin/ruby-build --definitions

# 2.4.1を/opt/ruby-2.4.1にインストール
/usr/local/bin/ruby-build 2.4.1 /opt/ruby-2.4.1 --verbose
```

あとは$PATHを追加すればよい。下記ファイルを新規作成：

```/etc/profile.d/ruby.sh
export PATH=/opt/ruby-2.4.1/bin:$PATH
export MANPATH=:/opt/ruby-2.4.1/share/man
```

`MANPATH=/opt/ruby-2.4.1/share/man` としてしまうと、それ以外のディレクトリが検索されなくなり、例えば`man ls`などができなくなってしまうので、先頭にコロンをつける。

開発環境でプロジェクトごとにバージョンを切り替えたければdotenvで環境変数を切り替えればいいし（その方が汎用的）、もしかしてrbenvなんて要らないんじゃないだろうか？
（…と思ったけど、`.ruby-version`をVCSに含めて開発者間でバージョンを共有する意味はあるな）

ruby-buildも使わないでtarボールからビルドしても大して変わりないし…
Intellijでsbtファイルが真っ赤になったとき

IntellijでScala-Play2.xプロジェクト作ったときに怒られたのでメモ。
Scalaを始めようとしたらsbtファイルの行がほとんど真っ赤に。

以下のやり方で解決できたので忘れないようにメモ。

1) [File - Project Structure...]を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190119/176251c0-06ac-24a6-d6c3-00bb8171cf1e.png)

2) [Languages & Frameworks - Play2]を選択して[Compiler]タブの[Use Play 2 compiler for this project]にチェックを入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190119/c5ac573f-23a2-a3ef-aa79-1bca78eb78be.png)


Scala始めたばっかりなのに、最初でつまずくとやる気が。
最初のうちだと思って頑張ろう。。

これで解決しなかったら以下のキャッシュ設定もやってみると良いかな。
[File - Invalidate Caches / Restart...]を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190119/c882f926-dc7b-fc83-10e0-b735b42bedb6.png)

[Invalidate and Restart]ボタンを押下すると、Intellijが再起動されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190119/7bcdff2f-83ca-abed-f385-67c07c02048b.png)

これでも解決しなかったら。。ぐぐろう。。
Python上でメモリ食っているリスト・配列を探し出す

[Jupyter(IPython)上でメモリ食っている変数を探し出して削除する - Qiita](http://qiita.com/AnchorBlues/items/883790e43417640140aa)
に続く、「pythonでのメモリ解放」シリーズ第二弾。

リスト・配列にターゲットを絞って、メモリを圧迫している変数を探し出し、削除する。

# コード
以下のような関数を定義しておく。

```py
def print_varsize():
    import types
    print("{}{: >15}{}{: >10}{}".format('|','Variable Name','|','  Size','|'))
    print(" -------------------------- ")
    for k, v in globals().items():
        if hasattr(v, 'size') and not k.startswith('_') and not isinstance(v,types.ModuleType):
            print("{}{: >15}{}{: >10}{}".format('|',k,'|',str(v.size),'|'))
        elif hasattr(v, '__len__') and not k.startswith('_') and not isinstance(v,types.ModuleType):
            print("{}{: >15}{}{: >10}{}".format('|',k,'|',str(len(v)),'|'))
```

していることは単純で、
「グローバル変数の中で、size属性か\_\_len\_\_属性を持っている変数のみを取り出して、その変数の名前とsizeあるいはlenを出力する」
だけである。
(変数のうち、'_'で始まるものやタイプがmoduleであるものはprint対象から除外している。)

# 実行結果

```py
>>> import numpy as np
>>> lst = [3,1,4,1,5]
>>> tpl = (1,5,3)
>>> a=np.zeros((100,100,3))
>>> print_varsize()

|  Variable Name|      Size|
 -------------------------- 
|            lst|         5|
|            tpl|         3|
|            Out|         0|
|              a|     30000|
|             In|         8|
```

このように、サイズの大きいリスト・配列が一目瞭然である。

ここまで出来たらあとは、

```py
del a
```

のように、いらない変数を指定して削除していったらいい。
メモリを開放して、快適にPython上で操作を継続することが出来る。
任意のパターン数のカメラキャリブレーション用ボード画像を作成する

OpenCVのサンプルにあったような記憶があるんだけど、見つけられなかったので書いてしまった。こうやって世の中には車輪の再発明が増えていくのか。

（追記）やっぱりサークルグリッドのほうが精度が良いらしいので、サークルグリッド版も追加

チェッカーボード

```py3
import argparse
import cv2
import numpy as np


def get_args():
    parser = argparse.ArgumentParser(description="This script creates a checkerboard image for calibration")
    parser.add_argument("--width", type=int, default=7)
    parser.add_argument("--height", type=int, default=10)
    parser.add_argument("--margin_size", type=int, default=50)
    parser.add_argument("--block_size", type=int, default=100)
    args = parser.parse_args()
    return args


def main():
    args = get_args()
    w = args.width + 1
    h = args.height + 1
    margin = args.margin_size
    block_size = args.block_size
    chessboard = np.ones((block_size * h + margin * 2, block_size * w + margin * 2), dtype=np.uint8) * 255

    for y in range(h):
        for x in range(w):
            if (x + y) % 2 == 0:
                sx = x * block_size + margin
                sy = y * block_size + margin
                chessboard[sy:sy + block_size, sx:sx + block_size] = 0

    cv2.imwrite("chessboard{}x{}.png".format(args.width, args.height), chessboard)
    cv2.imshow("chessboard", chessboard)
    cv2.waitKey(-1)


if __name__ == '__main__':
    main()
```

サークルグリッド

```py3
import argparse
import cv2
import numpy as np


def get_args():
    parser = argparse.ArgumentParser(description="This script creates a circleboard image for calibration")
    parser.add_argument("--width", type=int, default=7)
    parser.add_argument("--height", type=int, default=10)
    parser.add_argument("--margin_size", type=int, default=50)
    parser.add_argument("--block_size", type=int, default=100)
    parser.add_argument("--radius", type=int, default=30)
    args = parser.parse_args()
    return args


def main():
    args = get_args()
    w = args.width
    h = args.height
    margin = args.margin_size
    block_size = args.block_size
    radius = args.radius
    chessboard = np.ones((block_size * h + margin * 2, block_size * w + margin * 2), dtype=np.uint8) * 255

    for y in range(h):
        for x in range(w):
            cx = int((x + 0.5) * block_size + margin)
            cy = int((y + 0.5) * block_size + margin)
            cv2.circle(chessboard, (cx, cy), radius, 0, thickness=-1)

    cv2.imwrite("circleboard{}x{}.png".format(w, h), chessboard)
    cv2.imshow("circleboard", chessboard)
    cv2.waitKey(-1)


if __name__ == '__main__':
    main()
```

![chessboard7x10.png](https://qiita-image-store.s3.amazonaws.com/0/139809/95ae99df-820e-5c91-8624-d5e45619275e.png)

![circleboard7x10.png](https://qiita-image-store.s3.amazonaws.com/0/139809/f20f4920-d874-c87b-f2a0-1d672894863f.png)
Chainerのチュートリアルで、パッケージをインポートするとエラーが出る 。(mock)

[Introduction to Chainer](https://docs.chainer.org/en/stable/tutorial/basic.html)

chainerをインストールした後、チュートリアルで下記コマンドを実行して、pythonのパッケージを読み込む。

```
import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, report, training, utils, Variable
from chainer import datasets, iterators, optimizers, serializers
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions

```

すると
下記のエラーが出る。

```
>>> from chainer import cuda, Function, gradient_check, report, training, utils, Variable
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/hiroyasu/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/chainer/gradient_check.py", line 9, in <module>
    from chainer import testing
  File "/Users/hiroyasu/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/chainer/testing/__init__.py", line 7, in <module>
    from chainer.testing import training  # NOQA
  File "/Users/hiroyasu/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/chainer/testing/training.py", line 1, in <module>
    import mock
ImportError: No module named 'mock'
```

chainerをインストールしたが、mockというパッケージが無かったらしい。

mockをpipからダウンロードしたら、エラーが出なくなった。

```
pip install
```
Linuxのユーザ作成（useradd）、削除（userdel）と、削除されたユーザが所有していたファイルについて


あまり機会がないので、たまにユーザ作成したくなるとコマンドを忘れている。

## ユーザ作成
`useradd`コマンドを使う。同じ目的で使える`adduser`コマンドもあり、こちらは対話的に実行できる点が便利だ。（オプションをおぼえていなくても使いやすい）

今回は手元の環境がArch Linuxで`adduser`コマンドが入っていなかったので、`useradd`を使う。

```
# useradd -m username
```

`-m`オプションによって、ユーザのホームディレクトリが作られる。ホームディレクトリのパスは、デフォルト設定で`/home/username`になるはずだ。

それ以外に下記の設定が行われる。

 * ユーザ名と同じ名前のグループを作成し、所属させる
 * `/etc/skel`以下に設定されたデフォルトの設定のコピー
    * 例えば、`~/.bash_profile`ファイルのコピー

だいたいのユースケースでは上記のコマンドとオプションで足りると思うが、オプションを追加することで下記の制御も可能。

 * ホームディレクトリの変更
 * 所属させるグループの変更、追加
 * デフォルトで使われるシェルの変更
 * パスワードの変更

#### おまけ
デフォルトの設定を確認する。

```
useradd -D
```

## ユーザ削除
`userdel`コマンドを使う。

```
# userdel -r username
```

`-r`オプションによって、そのユーザのホームディレクトリとホームディレクトリ内のファイル、メールスプールを削除する。

メールスプールの場所は、`/etc/login.defs`のMAIL_DIR変数に設定されている。

`-r`オプションを設定しても、このユーザが保持するすべてのファイルを削除するわけではない。あくまで、ホームディレクトリとメールスプールだけだ。

### 余談：削除されたユーザが所有する（していた）ファイルについて
Linuxのファイルのオーナーやグループはuid, gidで管理されているので、削除されたfooユーザがかつて所有していたファイルが、あとから作成したbarユーザの所有になってしまうことも起こりうる。

たとえば、uidが1000のfooユーザがいたとする。このfooユーザを削除した後で、同じuid(1000)をもつbarユーザを作成したとする。

こうすると、fooユーザがかつて所有していたファイルはbarユーザの所有とシステムによってみなされ、barユーザによって修正や削除などが可能になる。（そのファイルのパーミッション次第だが、通常所有者はなんでもできる）

このことから、uidの変更や使いまわし(削除したユーザのuidの再利用)は、なるべくすべきではない。

（手元のArch Linuxでは、`useradd`コマンドによって割り振られるuidの範囲は1000~60000となっており、これだけあればたいていのケースで十分だろう。この情報は、`/etc/login.defs`から得られる。）

また、ミドルウェアやアプリケーションは専用の実行ユーザを作成し（自動的に作成されるケースが多いが）、uidは`useradd`によって自動的には使われない500~999にしておく。そして、実行に必要なファイルの所有者は、作成した専用ユーザにする。

こうすることで、重要なファイルの所有者が、意図しない一般ユーザに変わってしまうトラブルをある程度防ぐことができる。
何かをapt-get upgrade したら nvidia-smi でエラーを出すようになった

機能まで使えていた nvidia-smi が急にできなくなりました。

※ 追記2018/02/06： nvidia-smi ができなくなる理由の一つに、CUDAのアップデートがあります。CUDAの配布パッケージにはドライバが含まれるのですが、それを普通のGeforceに入れると動かなくなる事があります。なので、必ず、Nvidiaのサイトからダウンロードして、インストールしてください。また、新しいCUDAがでたからといって、それに、手持ちのGeforceが対応しているとは限りません。[CUDAの対応するドライババージョンを確認してください。](https://github.com/NVIDIA/nvidia-docker/wiki/CUDA#requirements)（参考: [Ubuntu16.04を入れて、nvidia-docker2を入れて、Chainerを動かす](https://qiita.com/ikeyasu/items/6e1069be9304f8342074)）

※ 追記2019/02/27： 何かをapt-get upgrade しなくても、このような現象は発生します。理由は本当に分かりませんが、、私はブレーカーが落ちて、突然の電源断となった時に発生することが数回ありました。（冬はブレーカー落ちが多発してまして。。）

```
$ nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.
Make sure that the latest NVIDIA driver is installed and running.
```

`apt-get upgrade`したかも、ということで調べたら、以下のブログが見つかりました。

参考： アップグレードしたらnvidia-smi出来なくなった話
https://blog.sky-net.pw/article/51

私は、`apt-get`ではなく、[Nvidiaのサイトからダウンロードしてインストールしていたので](http://qiita.com/ikeyasu/items/5213b8902098b197f4d7#nvidia%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)、それをやり直すことで解決しました。


#### 1. Nouveau kernel driver がdisableになっているか確認

* /etc/modprobe.d/blacklist-nouveau.conf に以下がかかれているか確認

  ```
blacklist nouveau
options nouveau modeset=0
  ```

書かれていれば、何もしなくて良い。書かれていなければ、[再設定する。](http://qiita.com/ikeyasu/items/5213b8902098b197f4d7#nvidia%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

#### 2. ドライバインストール

以前にダウンロードした、`./NVIDIA-Linux-x86_64-XX.XX.run` を用意する。
無い場合、以下からダウンロード。

http://www.nvidia.com/Download/index.aspx?lang=en-us

GTX1080 の場合は、以下のように設定して検索すれば良い。

![スクリーンショット 2017-07-02 17.32.32.png](https://qiita-image-store.s3.amazonaws.com/0/38555/13892100-afac-518c-be14-b4587d23ed19.png)

以下のようにして、再インストール。

```
$ sudo service lightdm stop # x を止める
$ sudo ./NVIDIA-Linux-x86_64-375.26.run
```

後は画面に従う。
concrete5で使えるタグ

今回使用したconcrete5のバージョン

- 5.7x系

# 分岐タグ

## ログイン状態の分岐

```
<?php
$u = new User();
if($u->isRegistered()) { ?>
ログインしている場合表示されます
<?php } ?>
```

#編集モードの時に表示
```
<?php
if($c->isEditMode()) { ?>
編集モードの時に表示されます
<?php } ?>
```

# 表示タグ
## ページ名を取得
```
<?php print $c->getCollectionName(); ?>
```

## ページの説明を取得
```
<?php print $c->getCollectionName(); ?>
``` 

## ページの作成日時を取得
```
<?php print $c->getCollectionDateAdded(); ?>
```

出力例：

```
2017-06-26 14:57:53
```

## ページの公開日時を取得
```
<?php print $c-> getCollectionDatePublic(); ?>
```

# カスタム属性
## タグを取得

```
<?php
$tags = $c->getAttribute('tags');
print($tags);
 ?>
```


###### 参照
[Getting Data about a Page](https://documentation.concrete5.org/developers/working-with-pages/getting-data-about-a-page)
[ページのデータを取得する :: concrete5 Japan 日本語公式サイト](https://concrete5-japan.org/help/5-7/developer/working-with-pages/getting-data-about-a-page/)
3D touchのボタンアクションを擬似的に表現したHapticButtonライブラリを試してみた（MITライセンス）

##はじめに
3D touchでボタンを押した際のポップアップするアニメーションを擬似的に表現したHapticButtonを試してみました。アニメーションは以下ような感じになります。
![example.gif](https://qiita-image-store.s3.amazonaws.com/0/154099/2aad8d3c-e3b3-532f-c50f-f6064152b16c.gif)
※[github/HapticButton](https://github.com/BalestraPatrick/HapticButton
)から引用

##検証環境
以下の環境を使用しています。

* macOS Sierra Version 10.12.5
* Xcode Version 8.3.3
* iPhone7 iOS10.3.2

##ライセンス・対応iOS/Swift Version
* ライセンス
    * MIT
* 対応iOS
    * iOS 10.0 and Swift 3.2 are required.

##可能なこと
以下のことが可能です。

* ラベルかイメージかを選択してボタンの生成(`.label(text: String)`もしくは`.image(image: UIImage)`)
* lightBlurViewおよびdarkBlurViewの追加（磨りガラスのような効果 動画の２番目と３番目のボタン）
* タッチしている力が一定値を超えた場合に実行するメソッドの指定
    * メソッドの定義方法は以下３種類（複数のメソッドが定義されている場合はどれか一つが実行される。実行の優先順位はdelegate > closure > touchUpInsideアクション）
        * delegate
            * HapticButtonDelegateを使用し、pressed(sender: HapticButton）メソッドに記入
        * closure
            * .onPressプロパティにclosureを定義
        * addTaget
            * HapticButtonにaddTargetでtouchUpInsideのアクションメソッドとして定義
* メソッドを実行する強さの指定（デフォルトは0.25　 0.0 <= threshold <= 1.0）

###具体例
```swift:label指定_blurなし_delegateでメソッド定義
class ViewController: UIViewController {
    @IBOutlet weak var button: HapticButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        button.mode = .label(text: "Hello! 👋")
        button.delegate = self
    }

extension ViewController: HapticButtonDelegate {
    func pressed(sender: HapticButton) {
        print("White button pressed.")
    }
}
```

```swift:image指定_lightBlur_addTagetでメソッド定義
class ViewController: UIViewController {
    @IBOutlet weak var blurButton: HapticButton!

    override func viewDidLoad() {
        blurButton.mode = .image(image: #imageLiteral(resourceName: "imageName"))
        blurButton.addBlurView(style: .light)
        blurButton.addTarget(self, action: #selector(blurButtonPressed(_:)), for: .touchUpInside)
    }

    func blurButtonPressed(_ sender: HapticButton) {
        print("Light blur button pressed.")
    }
}
```

```swift:label指定_darkBlur_closureでメソッド定義
class ViewController: UIViewController {
    @IBOutlet weak var darkBlurButton: HapticButton!

    override func viewDidLoad() {
        darkBlurButton.mode = .label(text: "Hello Blur!")
        darkBlurButton.textLabel.textColor = .white
        darkBlurButton.addBlurView(style: .dark)
        darkBlurButton.onPressed = {
            print("Dark blur button pressed.")
        }
    }
}
```

##補足
* `UIImpactFeedbackGenerator`を使用したフィードバックが実装されているので、iPhone7、iPhone7 plusでは押した際のフィードバックを感じることが可能です。
* ボタンの拡大・縮小は`touchesMoved(_ touches: Set<UITouch>, with event: UIEvent)`から、`touch.force / touch.maximumPossibleForce`より変換するscaleを計算し、`CGAffineTransform`を使用して行なっているようです。

##所感
非常に簡単にボタンに3D touchで押した際のような挙動を加えられるのでなかなか面白いのではないかと感じました。ただ、ボタンを押したあとの挙動を自然にするのは少し大変かもしれません。

##参考文献
[BalestraPatrick/HapticButton](https://github.com/BalestraPatrick/HapticButton)
jiji with tensorflowを使って通貨ごとの損益をグラフ化してみる

http://qiita.com/bushidoyasu/items/c437f3591498977389c5 に記載したバックテストを他の通貨で実施してみた。

# 条件
* バックテスト期間は2007年から2017年。
* 手法は移動平均とMACDの交差。
* 通貨は、ユロ円、ユーロドル、ポンドㇽ、ポン円、ドル円の５通貨。
* グラフの横軸はトレード回数、縦軸は資産推移。横軸はトレード回数で表示させたため、通貨ごとにデータの表示範囲が異なる（トレード回数が各通貨にとって当然異なるため）。

# テスト結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189952/6a7b8559-b324-04a5-b207-9c1ee5582fab.png)

# 傾向
* おもしろいのはポンドㇽだけまったく勝ててないということ（笑）殺人通貨といわれるだけあって、本バックテストで用いている手法では優位性がなかったのか（もしかしたらオペミスか）
* ポンドㇽ以外の通貨は右肩あがり。一応、優位性はあるか。
* ポン円がもっともトレードエントリする回数が多かった。
データ構造の特徴と該当するC#のコレクション

主に[WEB+DB PRESS vol.91](https://www.amazon.co.jp/exec/obidos/ASIN/4774178993/rochefort-22/)を参考に、ポイントだけを抜粋しました。
データ構造の基礎が全然無いと感じる方は、↑を読むのが一番良いと思います。
僕も、初めてデータ構造の基礎をまともに学んだのですが、**非常に**分かりやすかったです。

## 配列
- 構造
     - 連続したメモリ領域を確保
     - 使用しているメモリが連続しており、配列の中身の型が同じため、ランダムアクセスが一発でできる

- 特徴(どんな操作に強くて、どんな操作に弱いか)
     - ○ : ランダムアクセス
     - × : 要素の追加

- C#で該当するコレクション
     - List

## 連結リスト
- 構造
     - メモリに、要素の値と次の要素への参照を持つ

- 特徴
     - ○ : 要素の追加
     - × : ランダムアクセス


- C#で該当するコレクション
     - LinkedList

## ハッシュテーブル
- 構造
     - bin(あるいはバケット)と呼ばれるものを配列で沢山用意し、その各要素に連結リストへの参照を持つ
     - キーのハッシュ値とbinの要素数の剰余を取って、binの該当する要素に値を格納する
     - 要素数が増えたら、rehashを行う。rehashとは、更に要素数の多いbinを用意し、古い要素を移動すること。
          - 連結リストの要素数が増え、探索のコストが大きくなるため

- 特徴
    - ○ : ランダムアクセス・要素の追加・削除
    - × : メモリ効率

- C#で該当するコレクション
     - Dictionary
     - HashSet

- Dictionary・Setのどちらを選択するか
Setは、要素の値を重複させたくない場合に利用

## ツリー
- 構造
     - 親ノードの左のリーフノードに親ノードより大きな値を持った要素、右に小さな値を持った要素など、一定の規則に従って要素を持つ

- 特徴(どんな操作に強くて、どんな操作に弱いか)
     - ○ : ハッシュテーブルよりもメモリ効率が良い
     - × : 運が悪いと探索のコストが大きくなる

- C#で該当するコレクション
     - SortedDictionary
     - SortedSet

## 参考
- WEB+DB PRESS Vol.91
- 未確認飛行、コレクション概要(コレクションとデータ構造の対応表)
     - http://ufcpp.net/study/algorithm/collection.html
- C#コレクションの使い分けのヒント
     - http://qiita.com/takutoy/items/cb1e94c36296108e5fd7
ルートが配列のJSONをCoadableでカスタムモデルにマッピングする

**Swift4**で新しく追加された`Codable`を利用して、ルートが配列のJSONをそのまま`Codable`を適用したモデルの配列にマッピングするのではなく、該当する配列をプロパティとして持つ`Codable`を適用したコンテナ的なモデルにマッピングする方法が見つからず、色々調べた結果、対応方法がわかったので記しておく。

### ルートが配列のJSON

例えばGithub APIの[Get all users](https://developer.github.com/v3/users/#get-all-users)のレスポンスは

```json
[
  {
    "login": "mojombo",
    "id": 1,
    "url": "https://api.github.com/users/mojombo",
    ...
    "site_admin": false
  },
  {
    "login": "defunkt",
    "id": 2,
    "url": "https://api.github.com/users/defunkt",
    ...
    "site_admin": true
  },
  ...
]
```

とJSONのルートが配列になっている。

### モデル

上記のJSONをアプリで利用するために、`Codable`を適用した`User`モデルを以下のように作成する。

```swift
struct User: Codable {
    let id: Int
    let login: String
    let url: String
}
```

### デコード

単純にこのモデルオブジェクトの配列にデコードするのであれば、

```swift
let users: [User] = try JSONDecoder().decode([User].self, from: data)
```

で可能。

### コンテナモデル

上記のように配列にデコードしたモデルをアプリ内で受け渡しながら使いまわすよりも、その配列をプロパティとして持つモデルにマッピングしたいことがある。  
例えば以下のような`UserResponse`というモデル定義する。

```swift
struct UserResponse {
    let users: [User]
}
```

しかし、この`UserResponse`に`Codable`を適用したもうまくいかない。

```swift
struct UserResponse: Codable {
    let users: [User]
}

let response: UserResponse = try JSONDecoder().decode(UserResponse.self, from: data)

// typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead."))
```

### カスタムデコード、エンコードメソッド

そこで`Decodable`や`Encodable`のメソッドを独自に実装する。

```swift
public protocol Decodable {
    public init(from decoder: Decoder) throws
}

public protocol Encodable {
    public func encode(to encoder: Encoder) throws
}
```

* `Decodable`

```swift
extension UserResponse: Decodable {
    init(from decoder: Decoder) throws {
        var users: [User] = []
        var unkeyedContainer = try decoder.unkeyedContainer()
        while !unkeyedContainer.isAtEnd {
            let user = try unkeyedContainer.decode(User.self)
            users.append(user)
        }
        self.init(users: users)
    }
}
```

* `Encodable`

```swift
extension UserResponse: Encodable {
    func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        for user in users {
            try container.encode(user)
        }
    }
}
```

上記のように`Decodable`と`Encodable`を実装すればデコード、エンコードともに期待したように動く。

```swift
// decode
let response: UserResponse = try JSONDecoder().decode(UserResponse.self, from: data)

// encode
let encoded = try JSONEncoder().encode(response)
let json = String(data: encoded, encoding: .utf8)
```

## 参考

* [Ultimate Guide to JSON Parsing With Swift 4](http://benscheirman.com/2017/06/ultimate-guide-to-json-parsing-with-swift-4/)
* [Swift 4 Decodable: Beyond The Basics](https://medium.com/swiftly-swift/swift-4-decodable-beyond-the-basics-990cc48b7375)
php入門の備忘録

なんか変なタイトルですね...

##とりあえずhello,world

```php
<?php
//コメントでーす
echo "Hello,World";
/*これもコメント　ｃ言語と一緒だね*/
?>
```
セミコロンが入りますよー
日頃、pythonを使っているのでセミコロン書くの忘れそう、、、

##変数
変数には「$」マークを付けないといけないみたい
phpは動的型付けなので、型を宣言する必要はないです。

```php
<?php
$hello = "Hello,World";
echo $hello;
?>
```

###使えるデータ型
+ 文字列
+ 数値
+ 論理値
+ 配列
+ オブジェクト
+ null

があるみたい

```php
//これで変数の型を調べる
var_dump(変数名);
```

##定数
c言語の #difineみたいなもんかな？

```php
<?php
define("N",54);
echo N;

?>

>>>54
```
Nは変数ではないので$は付けません

```php
define("N",54);
N=34;
```
変更しようと思ってこんなことをするとエラーになります
defineし直したらエラーが起きないかもと思い試してみました。

```php
define("N",54);
echo N;
define("N",431443);
echo N;

>>>Constant N already defined 
```
はい。エラー起きました。
Nはもう定義されてるよ、的な？（英語全然ダメ...）


##条件分岐
###if文

```php
$score = 44;

if($score >=40){
	echo "great";
}elseif($score==30){
	echo "so so";
}else{
	echo "bad";
}
```

おなじみの書き方ですね
###switch文
```php
switch($a){
	case 1:
		echo "1";
		break;
	case 2:
		echo "2";
		break;
	default:
		echo "0";
		break;
}
```
コチラもおなじみ

##真偽値
falseになる場合
+ 文字列　"0",空文字列
+ 数値　0, 0.0
+ 論理値　false
+ 配列　要素数が0
+ null

##三項演算子
```php
if($a > $b){
	$max=$a;
}else{
	$max=$b;
}
```
このようなコードは下のように書き換えることが出来る

```php
$max =($a>$b)? $a:$b;
```

##繰り返し
for文の繰り返し

```php
for($a=0; $a>10; $a++){
	echo $a;
}

//コロン構文
for($a=0; $a<10; $a++):
	echo $a;
endfor;
```
whileの繰り返し

```php
$a=0
while($a<10){
	echo $a;
	$a++
}

//コロン構文
while($a<10):
	echo $a;
	$a++
endwhile;
```

##配列　
```php
$a = [1,2,3,4,5];
```

pythonの辞書型的な使い方もできる

```php
$a = [
	"rad"=>100;
	"blue"=>200;
	"green"=>10000;
];
```

###foreach
配列の要素はこうやって取り出すことが出来る

```php
$a=[1,2,3,4,5,6,7,8,9,0];

foreach($a as $value):
	echo $value;
endforeach;

>>1234567890
```

##関数
```php
fanction hello($name="kenzi"){
	return "hello".$name;
}

hello("ゴンザレス") //hello ゴンザレス
hello() //hello kenzi
```