OmniAICreator/Qiita-1.07M huggingface dataset:
duコマンドでサブディレクトリを含めたディレクトリ容量を表示する。


#はじめに
duコマンドをオプションなしに実行すると、サブディレクトリの容量もすべて表示します。
ざっくりとディレクトリごとの容量を知りたいときはすべて表示されると不便なので、
オプションをつけてサブディレクトリを含めたディレクトリ容量を取得したのですが、
オプションの指定で混乱したのでそのまとめです。

#結論

- `du`でサブディレクトリをまとめて表示するには`-s`オプション
- 複数ディレクトリに対して実行するには`*`で指定するか、`find -maxdepth`の結果を`-exec {} \;`で`du sh`に渡す。

##パターン1:

*OK:*

```sh:du-sh./*
[root@d-new var]# du -sh /var/*
0       /var/adm
80M     /var/cache
0       /var/crash
8.0K    /var/db
```

*NG:*

```sh:du-sh./
[root@d-new var]# du -sh /var/
295M    /var/
```

###du コマンドの-s と -S オプション


`-s` `-h`オプションを指定しています。
`-h`は表示容量の単位を人間が見やすい値するオプションです。

問題はサブディレクトリを含めた容量を表示するオプションをどうするかです。
結論から言うと`-s`オプションを付けて、実行したいディレクトリを指定することで取得可能です。
※上記にも例がありますが、複数ディレクトリの場合は`du -sh /var/*`のように指定します。


`-s`と`-S` オプションの違いで少しはまりました。
`man`コマンドで`du`の説明を確認すると以下のように説明されています。

>-s, --summarize
              display only a total for each argument

> -S, --separate-dirs
              for directories do not include size of subdirectories


`-S`はdo not include size of subdirectories（サブディレクトリのサイズを含めない）とあるので、
いけると思ったのですが、実行結果はオプションなしで実行した時と同様に、
サブディレクトリの容量も表示されてしまうようでした。

後々調べたのですが、`-S`は”サブディレクトリを含めないディレクトリの容量も合わせて表示する”
という意味です。この部分で少し理解に詰まったので別でまとめたいと思います。

ということで今回は、`-s` オプションを使用します。
コマンドの実行対象とされたディレクトリのサブディレクトリを含めた容量を表示します。

`du -sh /var/`だけではvar配下すべての合計量になってしまうので、
実行対象を`du -sh /var/*`でvar配下のすべてのディレクトリにします。

var配下のディレクトリに対して、ディレクトリごとにそのサブディレクトリの容量もまとめて出力するコマンドになりました。



##パターン2

```sh
[root@-new var]# find /var/ -maxdepth 1 -type d -exec du -sh {} \;
295M    /var/
0       /var/tmp
81M     /var/lib
135M    /var/log
0       /var/adm
```


find コマンドを使用するパターンです。
findコマンドはサブディレクトリも検索対象になりますが、
-maxdepth level を使用することで、検索対象となるディレクトリの最大階層を指定可能です。

>-maxdepth levels
              Descend at most levels (a non-negative integer) levels of directories below the command line arguments.  -maxdepth 0
               means only apply the tests and actions to the command line arguments.

`-exec {} \;`で`find`コマンドの結果を別々に渡して、`du -sh`を実行します。
Android, Kotlin初心者が1ヶ月でやったことと、できるようになったこと

こんにちは、アトラエで19卒内定者としてインターンをしている @muttsu-623 (Twitter: [@muttsu_623](https://twitter.com/muttsu_623)です。

インターンをはじめてから1ヶ月半Androidの勉強をしています。

Androidは触ったことがなく、もちろんKotlinの経験もなかったため苦労しましたが、個人的にこんな感じで勉強していけばいい感じだったという方法があったので、その勉強方法を記載します。

# 前提（開発経験）
* TECH::CAMPやUdemy、Rails Tutorialを利用してRailsでの簡単なアプリ開発の経験はあり。
* Javaを [スッキリわかるJava入門 第2版 (スッキリシリーズ)](http://amzn.asia/4oosylw)にて独習経験あり。
* その他、大学にて簡単なC, C++の経験あり。

記載内容からわかるように`ほぼ開発経験がない初心者`で、`多少Javaがわかって、オブジェクト指向もちょっとわかるかな？`程度でした。。。

# 勉強方法
勉強方法は、大きく分けて２つです。

1. 本による学習
2. 内定先サービスのAPIを利用し、クライアントアプリを自作

それぞれ簡単に僕が学習した方法を記載します。

## 1. 本による学習
僕が活用した本は2種類です。

1. [基礎＆応用力をしっかり育成！ Androidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオン ](http://amzn.asia/ccJETIW)
2. [Kotlinスタートブック](http://amzn.asia/iUcZiXH)

それぞれどのように活用したか説明します。

### 基礎＆応用力をしっかり育成！ Androidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオン

こちらは、JavaでAndroid開発の基礎を教えてくれます。
僕は前述の通り簡単なJavaを勉強していたので、まずはJavaでAndroidの開発手順などをキャッチアップしようと思いました。

この本の良さはというと、

1. 説明が丁寧
2. サンプルアプリが多い

個人的に初心者にとって重要だと思うことは、とにかくサンプルアプリを作ることだと思っています。
その上で、この教科書が各章で1つのサンプルアプリを作りながら多くの基礎を学ぶことができるので、初心者にとって作るという達成感を得ながら学習を進めることができると思います。

### Kotlinスタートブック

[基礎＆応用力をしっかり育成！ Androidアプリ開発の教科書 なんちゃって開発者にならないための実践ハンズオン]を読み終え、Javaで簡単なアプリを作れるようになった状態で、次にこちらの本に手をつけました。

この本は、前半でKotlinの文法などの基礎を学習し、後半でKotlinでQiitaのクライアントアプリを作成します。

個人的な感想としては、読みにくかったですw

ただ、僕はこれ以外にKotlinでAndroidアプリを開発する本を見つけることができず、この本が内定先にあったため、これで学習しました。

後半のQiitaクライアントアプリの作成では、ライブラリを多く利用しているため、Android開発初心者には、何がどこでどう動くのかを理解するのは大変でした。

個人的な意見ですが、この本でKotlinでの記述方法を学びつつ、本と同じようなクライアントアプリをライブラリを使用せずに開発してみると色々と勉強になることが多いんじゃないかと思います。

## 2. 内定先サービスのAPIを利用し、クライアントアプリを自作

本での学習を終えた僕は、内定先の[yenta](https://yenta.talentbase.io/yenta)というサービスのメッセージ機能と同じようなものを自作しました。

つけた機能は以下の通りです。

* Facebookへログイン
* yentaへログイン
* マッチングユーザー一覧
* メッセージ一覧
* メッセージの送信

内定先からステージングアプリのAPIを公開してもらい、作成しました。
本で学べなかった内容として、

* Facebookログイン
* ログイン状態の保持
* JSONの解析
* スクロールによるリスト更新
* RecyclerViewを利用したチャットUIの作成

を新しく学べたと思います。（yentaのコードはみたことがないので、同じ方法で開発されているかはわかりませんw）

作成したアプリは公開できませんが、完全に同じとは言えないものの、簡単なメッセージ機能を備えたアプリを自作することはできました。

# 感想

個人的ではありますが、Androidアプリの勉強は

1. Javaの基礎の学習
2. JavaによるAndroidアプリ作成の学習
3. Kotlinの基礎の学習
4. KotlinによるAndroidアプリ作成の学習

の順に行うのが良いと思いました。

僕の場合はいきなりKotlinスタートブックから始めたのですが、Androidアプリの作成方法がわからず、Kotlinで何を書いてあるのかもさっぱりわからずの状態で困りましたw

これが正解だとは思いませんし、もっといい方法もあると思うので、ぜひ模索&コメントしていただけると嬉しいです！

最後にですが、内定先の先輩方のおかげで、自分ではじめてしっかりとした?アプリを作ることができたのは非常に嬉しいです。

今までも自作アプリに挑戦をしてきましたが、なかなかエラーが解決できず、進め方がわからずで挫折をしていました。
今回先輩にサポートしていただいたこともあり、何とかアプリを作りきれました。

これからもAndroidのみならずどんどんいろんな開発にチャレンジして、後輩ができた際にサポートしていけるよう頑張ります！
Qt for Android 画面起動 ～目覚まし #7～

# はじめに
QtでAndroidの目覚ましアプリを作ることを目的にしています。
まだ完成してませんが。
これまでの記事は「Qtで作るAndroid目覚ましもどき」とついているのでそれを見てください。
＃6を書いてからしばらくたったので、気分を変えて今回からは副題は「目覚まし」だけにします。

# 今回の目的
アプリ画面が起動していないor閉じている状態から自動で開いてもらう。

# 結論
インテントを仕掛ければ起こせる。（アプリが閉じているときも）

# 詳細/やったこと
## visibilityの操作
### 概要
QtのWindowオブジェクトにはvisibilityというプロパティがある。詳細は下記。
http://doc.qt.io/qt-5/qml-qtquick-window-window.html#visibility-prop
Windowsとかで使うと画面を最小化したり最大化したりできる。
Androidでも同じように画面を閉じたり開いたりできないかなーと考えた。

### 結果
できなかった。
そしてしかし、試したときに下記に気付いた。

* 画面起動時は```QWindow::Maximized```になってる
* ```QWindow::Minimized```にしても画面は消えない
* ```QWindow::Hidden```にすると画面が動かなくなる（消えはしない）

## インテントの利用
### 概要
この計画でお世話になりっぱなしのKDABに下記のページがある。
https://www.kdab.com/qt-on-android-how-to-restart-your-application/
ペンディングインテントを設定してアプリを一度終了させることで再起動のような動きにしている。
ここでアプリの終了を行わないと、画面が閉じてるときにそのまま開いてくれることがわかった。
（Androidアプリを開発してる人なら常識？）

### 詳細・こまごましたこと・今後の課題

* サービスに対しても同じことができる
    * しかしサービスとでコンテキストを取得する時に、サービスを起動したアクティビティのコンテキストというかクラスが見えるのか、とにかく現状はサービスに到達できていない。
* QMLの画面に対して再起動したことを知らせたい場合は、別途invokeやプロパティのセットで教えてやる必要がある。今回は下記のようにプロパティを書き換えてonChangedのイベントが発生するようにしている。

``` [execute/ice.cpp]
        QQmlProperty::write(Ice::main_obj, ICEDEF_NAME_VISI, (int)QWindow::Maximized);
```
https://github.com/hakua-doublemoon/SummerIce/blob/master/summer_ice/execute/ice.cpp

* Qtの性質？で、画面が起動していない＆アプリも起動していない状態では、アプリの起動に失敗しやすい。
    * Qtのライブラリの起動っぽいところで止まってるっぽい。ネイティブなAndroidのアプリっぽくまずは何か立ちあげられないか検討中。
CocoaPods1.5.0で導入したライブラリで@IBDesignableを指定したViewのStroyBoard上の描画でエラーになる。"IB Designables: Failed to render and update auto layout status for ViewController"

CocoaPods経由で導入したライブラリで、 `@IBDesignableを` を指定したViewクラスをStoryBoard上に配置すると、描画で以下のようなエラーが起こります。（プロジェクトのビルドは通ります）

```
error: 
IB Designables: 
Failed to render and update auto layout status for ViewController (BYZ-38-t0r): 
dlopen(XXXX.framework, 1): 
no suitable image found.  
Did find: XXXX.framework: required code signature missing for 'XXXX.framework'
```

<img width="385" alt="スクリーンショット 2018-05-13 14.13.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/92539/d080fcb1-4823-0aa6-39ff-4de65864df80.png">

1.5.0のまま使用するにいはPodfileに以下を追加することで解決しました。

```ruby
post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings.delete('CODE_SIGNING_ALLOWED')
    config.build_settings.delete('CODE_SIGNING_REQUIRED')
  end
end
```

参考

- https://stackoverflow.com/questions/39732312/xcode-8-ib-designables-failed-to-render-and-update-auto-layout-status-the-a/49872953#49872953
- https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911
CakePHP3でSendGridメールにヘッダーを追加する

SendGridを使ってメールを送りたかった。
SendGridはメールに`X-SMTPAPI`ヘッダーを加えて、値にcategoryを設定するとcategoryごとの数値が取得出来るため、CakePHP3でメールを送る際にヘッダーを追加する必要があった。

```php
// SendGridでの効果測定用ヘッダー
$xSmtpHeader = ['X-SMTPAPI' => json_encode(['category' => 'remaind day'])];

$email = new Email("default");
$email->setTransport('SendGrid');
$email->setTemplate("template_name")
      ->setLayout("")
      ->setEmailFormat('html')
      ->setViewVars([
        'email' => $email,
        'name' => $name
    ])
    ->setTo($email)
    ->setSubject('タイトル')
    ->setFrom(Configure::read('email.support'))
    // SendGridでの効果測定用ヘッダー追加
    ->addHeaders($xSmtpHeader)
    ->send();
```
GitHubでチーム開発

世間はもうSVNからGitに移行しているのにいつまでもSVNしかわからないわけにはいかない（SIはいまだにSVNがほとんどですが）と、Git, GitHub初心者５人でアプリ開発を行なったのですが色々忘れてしまっているのを思い出すために当時のワークフローを書き出します。

git, GitHubについてはこちら
[git - 簡単ガイド 猫でもわかるGit 最初の一歩](http://rogerdudler.github.io/git-guide/index.ja.html)
[GitHub 機能](https://github.co.jp/features)

## 個々の作業
①イシュー（課題や問題点を番号として起こしたもの）をもとにコーディング
②テスト
③リモートリポジトリにプッシュ（SVNではコミット）
④プルリクエスト（イシューを解決してリポジトリにファイルをコミットしたから見てください！という状態にする）
__この①〜④の作業のうち①と④をGitHub上で行います。__


①イシュー
これをもとにそれぞれがコーディングを行う。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3232323236372f61636335306139352d316563312d373564332d333338352d3565323038636363666337392e706e67.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/0d01d9a6-8d8d-233e-462b-ce60d6a91530.jpeg)


④プルリクエスト
どのブランチへ自身の作業を取り込んで欲しいかを設定する。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3232323236372f63313637303733622d323864632d623234632d666231652d3161646631323638316662362e706e67.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/215bc0df-73d6-fa7a-5764-dab9748b87d7.jpeg)

## チーム作業
①進捗報告
②プルリクエストチェック
③コードレビュー
④マージとクローズ または イシュー
⑤新たなイシューを挙げる

__このうちGitHubでは②と④と⑤を行う。③のコードレビューはGitHubを見ながら行う。__

②プルリクエストチェック
 #3というイシューに対して#4という対応がされ、プルリクエストされている状態
![refs__3_by_xkkx_·_Pull_Request__4_·_xkkx_test.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/548f06f6-c5ec-c762-a1e7-17c325289495.jpeg)

③コードレビュー
きれいなdiffが表示されるのでレビューアはここでコードレビューを行う。
![refs__3_by_xkkx_·_Pull_Request__4_·_xkkx_test.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/e5cd42a5-51bd-32cb-c9c8-bc764547f076.jpeg)

④マージ、クローズまたはイシュー。（マージする場合はプルリクエストされたブランチへ（基本的には）自動でマージされます。ここで新たな問題などが発生したら再度イシューを作成する。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3232323236372f30363636326439632d653161322d636261642d633838312d3864653932633538313138372e706e67.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/532acb1a-b6de-604e-321d-4746925c4dd7.jpeg)


イシューの対応がマージされ、クローズした状態
![スクリーンショット 2018-05-13 14.03.43.png](https://qiita-image-store.s3.amazonaws.com/0/222267/6e30db9b-fe8d-4253-69b3-76e17818c65e.png)

## 便利な機能
コンフリクト時にGitHub内で手動マージができます。


コンフリクトが発生している状態。

*__This branch has conflicts that must be resolved（このブランチは解決しなくてならない競合があります）__*

![スクリーンショット 2018-05-13 14.25.49.png](https://qiita-image-store.s3.amazonaws.com/0/222267/e14211f9-be73-fd07-b035-515f51fe6c6d.png)


マージエディタ　ここでコードの取捨選択を行う。
![Resolve_Conflicts_·_Pull_Request__6_·_xkkx_test.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/e42565d5-42a7-fd87-a536-00867ad0f9bc.jpeg)


異なる作業ブランチのマージが完了したらdevelopブランチへpushして作業完了となります。
Delete branchをクリックすればその作業ブランチを削除して、プルリクエストをクローズできます。

__*Pull request successfully merged and closed（プルリクエストが正常にマージされてクローズしました）*__

![文字列を定数化、Javadocを追加_by_xkkx_·_Pull_Request__6_·_xkkx_test.jpg](https://qiita-image-store.s3.amazonaws.com/0/222267/0614f381-3715-4673-acb7-0bdc77e2881c.jpeg)

## 振り返ってみて
レビュー依頼、コードレビュー、マージ、ブランチ管理がGitHub上で一元的に行うことができ、
素晴らしいツールだと再度実感しました。
非公開にするには有料になってしまうので、現場で採用されることはあまりないのかもしれませんが。
joinsでテーブルをつなげる際の２種類のやり方【ハッシュ】

#テーブル構造
中間テーブルを利用して、自分がいいねした、booksを一覧で見れるようにしたい。
テーブル構造は下みたいな感じです。

![スクリーンショット 2018-05-13 14.12.52.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/b9035dc5-1c5f-8eb9-370b-6b61cd09ac17.gif)


これで自分がいいねしたbook一覧を取りたいと思った時に、やり方がわからずハマったので、覚書です。


#sqlの数を少なくするため、全テーブルを繋げたい

joinsしないままviewの画面とかでeachすると、sqlが大量発行されて操作が重くなります。
なるべく発行はしたくありませんので、joinsします。自分がしたいテーブル合体は以下のようなイメージです。
![スクリーンショット 2018-05-13 14.13.49.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/9f8605e3-c673-5415-69a7-7ddb45de4749.gif)


上のようにしたいと考えて書いてみたのですが。。。。。

##繋げ方１

最初自分が書いていたコードはこうでした。

```
Book.joins(:likes, :user).where(user_id: current_user.id)

```

みたいな。。。。
ただこうすると、

![スクリーンショット 2018-05-13 14.22.39.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/ac750576-be12-459f-182f-893baa94c15c.gif)

このように別々に合体します笑

こうなってしまうと、このbookをlikeしたuserという流れで、データを取りに行くことができません。

ではどうすれば良いかというと。。。。。

##繋げ方２

```
Book.joins({:likes => :user}).where(user_id: current_user.id)

```
このようにjoinsの中にハッシュを書きます。
そうすると、３つのテーブルを全て連結することができます。
CakePHP、MySQL登録日から○時間以上、◯時間以内のユーザーを取得

## ORM・SQLでフィルタ

登録から12時間以上、24時間未満のユーザーを取得

```php
namespace App\Model\Table;

use App\Model\Entity\User;

$users = $this->find('all', [
            'conditions' => [
                 'TIMESTAMPDIFF(SECOND, created_at,NOW()) <' => 24 * 60 * 60,
                 'TIMESTAMPDIFF(SECOND, created_at,NOW()) >=' => 12 * 60 * 60
            ]
        ])->toArray();
```

## PHPのDateTimeを使ってフィルタ場合

変数名がわかりづらくてすみません。。

```php
namespace App\Model\Table;

use App\Model\Entity\User;

$now = new \DateTime();

// 現在時刻から$endTime($startTime)前の時刻を算出
$endDateTime = clone $now;
$endDateTime = $endDateTime->sub(new \DateInterval('PT86400S')); // 今から24h前
$startDateTime = clone $now;
$startDateTime = $startDateTime->sub(new \DateInterval('PT43200S')); // 今から12h前

$users = $this->find('all', [
            'conditions' => [
                 'created_at <' => $startDateTime,
                 'created_at >=' => $endDateTime
            ]
        ])->toArray();
```
[中小企業診断士の手習い＃2]AWS Lambdaが勝手にリラン(再起動)するのはAPIレスポンスタイムの揺らぎ!?

**中小企業診断士(登録予定)兼黄昏開発者のヨシダ**です。いかがお過ごしですか。
自己紹介は最下部で。
今日は前回投稿した[「データの可視化とAWS Lambda + AWS CloudWatch + Pythonの５つの注意点」](https://qiita.com/siraasagi/items/2d8a7d2d36df9df0f101)で作ったopenWeatherMapからの４都市分１時間毎天気データが、上手く取れない場合があるので、その調査の経過です。


#1.outputファイル：天気データの記録が想定外
![Qiita20180513_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/10574/96435df7-d24b-25f9-cf19-7febf1ad951c.png)
これは2018/5/12の天気情報ログを失敗/成功に纏めた図です。
結論として赤枠で囲ったYYYYMMHHMMの下１桁が**「１秒」**になっている固まり(マルで囲った２)の手前、定時実行した行が２行しか返っていませんね。本来は4行取れるのが仕様です。

#2.Call側：CloudWatchの動きもイマイチだが想定内
次にLambdaの呼び出し側、CloudWatchEventの2018/05/12ログを調べていました。
![Qiita20180513_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/10574/7ac92c61-ae74-5493-d2b3-d1667f0fabdc.png)
**「01:01」**とイマイチな起動イベントが存在しますが、１時間に１回イベントを発行しているのであれば、今回は許容します。また次回。

#3.対策：Lambdaのタイムアウト秒を「3秒」「30秒」に変更
openWeatherMapのAPI ResponseTime基準が不明なので、一先ずタイムアウト秒を10倍にして対応をして様子をみています。テストは正常動作しましたが、しばらく様子見です。
![Qiita20180513_03.PNG](https://qiita-image-store.s3.amazonaws.com/0/10574/2899b7bf-b161-590f-4bf0-4d71fc272413.png)

-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-
ヨシダ：中小企業診断士(2018年登録予定) 兼 黄昏開発者
![アイコン.PNG](https://qiita-image-store.s3.amazonaws.com/0/10574/b3a55d0d-79b8-83ab-7411-a6ed171a93e2.png)

ブログもやっています。見てやって下さい！
空飛ぶITコンサルタント(http://yoshidaagri.hatenablog.com/)
-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-
【Ethereum】PHP LaravelからEthereum(Geth)へのRPC接続方法

# 1．前提
- [Laravel](https://readouble.com/laravel/5.5/ja/installation.html)をインストールしている
- [Ethereum(Geth)](https://github.com/ethereum/go-ethereum/wiki/Installing-Geth)を起動している

# 2．環境
- 使用OS
    - Ubuntu 16.04.4
- 使用言語
    - PHP v7.2.4
        - Laravel 5.5.40
    - geth v1.8.2


# 3．ライブラリのダウンロード
PHPからEthereumへRPC接続を行うため、今回は`ethereum-php`というライブラリを使用していきます。
→ https://github.com/btelle/ethereum-php

Laravelのディレクトリから以下のコマンドを叩いていきます。

```bash:download
$ cd <laravel project>
$ mkdir app/Libs
$ mkdir app/Libs/Eth
$ cd app/Libs/Eth

# ethereum.php のダウンロード
$ wget -O Ethereum.php https://raw.githubusercontent.com/btelle/ethereum-php/master/ethereum.php
$ vim Ethereum.php
# namespace を記載
# namespace App¥Libs¥Eth

# json-rpc.php のダウンロード
$ wget -O JSON-RPC.php https://raw.githubusercontent.com/btelle/ethereum-php/master/json-rpc.php
$ vim JSON-RPC.php
# namespace App¥Libs¥Eth
```


# 4．PHP LaravelからEthereum（Geth）への接続
今回はGethをプライベートネットワークで起動している前提で進めていきます。

```php:.env
### 上記省略 ###
ETH_NODE_HOST=localhost
ETH_NODE_PORT=8545
```

```php:config/eth.php
<?php

return [
    'node_host' => env('ETH_NODE_HOST', 'localhost'),
    'node_port' => env('ETH_NODE_PORT', '8545'),
];
```

```php:routes/web.php
<?php

Route::get('/', 'IndexController@index');
```

```php:app/Http/Controllers/IndexController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Config;

# 先ほどダウンロードしたライブラリをuseする
use App\Libs\Eth\Ethereum;

class IndexController extends Controller
{
    public function index()
    {
        $eth = new Ethereum(Config::get('eth.node_host'), Config::get('eth.node_port'));

        dd($eth->eth_accounts());
    }
}
```

これでPHP側からGethのコマンドを叩くことができるようになりました。
あとはGethのコマンドラインから叩くのと同じような形で使っていけばOKです。

# 5．参考文献
- [ethereum-php](https://github.com/btelle/ethereum-php)
- [EthereumにPHPから接続してみた（追記あり）](http://denen.hatenablog.com/entry/2017/04/24/Ethereum%E3%81%ABPHP%E3%81%8B%E3%82%89%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)
dockerのdriver、Hyper-Vの記述方法は？

## tl;dr
答えは「hyperv」

## 経緯

DockerがKubernetesを統合したらしい、という話を聞いて、じゃあ一丁やってみようか、と思った。
（Kubernetesを統合しているのは現在のところ、Edgeチャンネルのみ。[参照：Edgeチャンネルのリリースノート](https://docs.docker.com/docker-for-windows/edge-release-notes/)）

いやー、検索かけても「Hyper-V」に関する情報が出てこない。

VirtualBoxは割と長く使っていて、でもHyper-Vには何か良いところがあるんじゃないか、と思ってHyper-Vで挑戦してみたんですが。

```
docker-machine create default --driver ？？？
```

なんて書けば良いんだろうか。教えてヘルプ！

```
> docker-machine create --help
Usage: docker-machine create [OPTIONS] [arg...]

Create a machine

Description:
   Run 'docker-machine create --driver name --help' to include the create flags for that driver in the help text.

Options:

   --driver, -d "virtualbox"                                                                            Driver to create machine with. [$MACHINE_DRIVER]
```

**virtualbox** としか書いてねぇ…… orz

そんな訳で。

```
> docker-machine create default --driver Hyper-V
Driver "Hyper-V" not found. Do you have the plugin binary "docker-machine-driver-Hyper-V" accessible in your PATH?
```

```
> docker-machine create default --driver hyperv
Docker machine "default" already exists
```

**hyperv** 、すべて小文字が正解のようです。

これで出来るかなー、と思ったんですが。

```
> docker-machine create default --driver hyperv
Running pre-create checks...
Error with pre-create check: "Hyper-V PowerShell Module is not available"
```

なんかエラーが出ます。
調べてみても、なんか面倒くさそう、というか。[0.14.1でfixされてるけどまだリリースされてない](https://github.com/docker/machine/issues/4452) とかも書いてありました。でも、もっと昔のバージョンまでデグレードしたら云々、とかもあったので過去分を試してみることに。

|バージョン|docker-machine|日付|結果|
|---|---|---|---|
|18.05.0-ce-rc1-win63|0.14.0|2018-04-26|×|
|18.04.0-ce-rc2-win61|0.14.0|2018-04-09|×|
|18.03.0-ce-win58|0.14.0|2018-03-26|×|
|18.02.0-ce-win52|0.13.0|2018-02-08|△|

△のところで、エラーメッセージが変わりました。

```
> docker-machine create default --driver hyperv
Running pre-create checks...
Error with pre-create check: "Hyper-v commands have to be run as an Administrator"
```

管理者権限でDOSプロンプトを起動し直せば行けるのか……？
わー、行けた！と思ったのも束の間。

```
> docker-machine create default --driver hyperv
Running pre-create checks...
(default) Image cache directory does not exist, creating it at C:\Users\takeuchi\.docker\machine\cache...
(default) No default Boot2Docker ISO found locally, downloading the latest release...
(default) Latest release for github.com/boot2docker/boot2docker is v18.05.0-ce
(default) Downloading C:\Users\takeuchi\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v18.05.0-ce/boot2docker.iso...
(default) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(default) Copying C:\Users\takeuchi\.docker\machine\cache\boot2docker.iso to C:\Users\takeuchi\.docker\machine\machines\default\boot2docker.iso...
(default) Creating SSH key...
(default) Creating VM...
(default) Using switch "\x8a\xf9\x92\xe8\x82̃X\x83C\x83b\x83`"
(default) Creating VHD
Error creating machine: Error in driver during machine creation: exit status 1
```

なんかエラーが出ました。仮想マシンはできたけど、なんかオカシイ…… orz

そんな訳で、**VirtualBoxの世界に戻ります。**
imagick php 画像を丸く 切り抜く

画像を丸く切り抜きたい。

# 考え方

・四角い画像を用意しよう
・その上に丸いマスク画像を合成しよう
・マスク画像で切り抜こう

```

public function createImg()
{
    $icon = WWW_ROOT . "img/usericon.png";   //ユーザーアイコン
    $mask = WWW_ROOT . "img/mask.png";   //マスク 丸い黒い画像を用意


    /* 画像の読み込み */
    $icon = new \Imagick($icon);
    $mask = new \Imagick($mask);

    $icon->compositeImage($mask, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);


    /* 画像を出力 */
    header("Content-Type: image/jpeg");     //表示する画像ヘッダー
    echo $icon;

    die;

}

```

以上です。
さくっとredmine+slack連携してチーム作業を始めたい

#自宅サーバにredmineを立てて、プチプロジェクトを始めたいときの覚書

##環境
OS: macOS High Sierra
Docker : 18.03.1-ce
Redmine : 3.4

Dockerを使うのでOSは、なんでも構いません。

##プロジェクト管理ツール Redmine
下記のコマンドでRedmineをhttps://github.com/docker-library/redmineから取得

```
git clone https://github.com/docker-library/redmine.git
cd redmine/3.4
```


Redmineコンテナの起動

```
docker-compose up -d

```

この際、下記エラーが発生したため、文字コード指定をdocker-compose.xmlにて行った

```
charset: utf8, collation: utf8_general_ci (if you set the charset manually, make sure you have a matching collation)
```

```docker-compose.xml一部抜粋
 db:
    image: mysql:5.7
    restart: always
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci ←この行を追加
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine
```


#チームコミュニケーションツール Slack
プロジェクトについての連絡および、redmineの更新通知に使用

下記サイトよりslackにログインし、適当なワークスペースを作成
https://slack.com/intl/ja-jp

下記画像中の中段左のAppより、incoming webhooksをインストール

<img width="1257" alt="Screen Shot 2018-05-13 at 13.01.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/94861/fc16a991-0115-493d-6d79-425c237c4dfc.png">

設定を追加を選択し、チャンネルを#generalに選択(他のチャンネルも選択可能)

<img width="1261" alt="Screen Shot 2018-05-13 at 13.05.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/94861/e98dda07-e5ce-1783-e124-9680648f8c7e.png">

着信Webフックインテグレーションの追加押下後の、Webhook URLを控えておく


#redmine-slack連携ツールの導入
redmineのdockerコンテナに入り、ツールをgit経由で取得
```
docker exec -it 34_redmine_1 bash
cd redmine/3.4/plugins
git clone https://github.com/sciyoshi/redmine-slack.git redmine_slack
cd redmine_slack
bundle install
```

ブラウザを用いて、localhost:8080にアクセスし、redmineを表示
管理＞プラグインより、Redmine Slackの設定を開く
Slack URLの欄に、先ほど控えたWebhook URLを入れ、Post Issue Updateにチェックを
入れて適用ボタン押す


#以上で設定は完了です
あとは、redmineでIssue登録してみると、プロジェクトメンバーにSlack通知が飛ぶはずです。
※redmineの設定をはしょっているので、プロジェクト・メンバーの追加等の必要はあります
さくらVPSでFTPが繋がらない問題

# 結論
iptablesが原因でした。

systemctl stop iptables
systemctl disable iptables
で解決。

# 解決手順
 # systemctl status iptables
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: active (exited) since 日 2018-05-13 12:40:48 JST; 2s ago ★動作中

 # systemctl stop iptables
  ・・・

 # systemctl status iptables
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 日 2018-05-13 12:41:23 JST; 5s ago ★停止中


## 恒久対策として、起動しない設定にする。
確認
systemctl is-enabled iptables

起動しない設定
systemctl disable iptables


#現象
FTPできてたのに、できなくなった！！

#推定原因
無効にしていたけど、スケールアップの時にサーバ再起動で、再度有効になったのかな？

#環境
さくらVPS、Centos7

#調査経緯
Mac FileZillaでエラー。
状態:          ******.com のアドレスを解決中
状態:          ***.***.***.***:*** に接続中...
状態:          接続の試行が失敗しました: "ECONNREFUSED - Connection refused by server".
エラー:       サーバに接続できませんでした

WireSharkで見ると、TCP:SYNに
ICMP 106 Destination unreachable (Host administratively prohibited)
で返る。

WinのFileZillaでもNG。
FTPコマンドでもNG。
ポート接続確認サイトでもNG。

##FireWallか？
systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
停止済みだった。

##SE Linuxか？
getenforce
または
/usr/sbin/getenforce (最小構成Linuxは/usr/sbinに入るのかな？)
Disabled

停止済みだった。
ローカル環境でLaravelをインストール（Homebrew）


※ローカル環境にPHPの環境は整った状態での作業になります。

とりあえず必要なものがインストールされているかバージョン確認

php -v

```phpバージョン確認
$ php -v

PHP 7.2.5 (cli) (built: Apr 26 2018 12:07:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.5, Copyright (c) 1999-2018, by Zend Technologies
```
composer -v

```composerバージョン確認
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.6.5 2018-05-04 11:44:59

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
```

httpd -v

```
$ httpd -v
Server version: Apache/2.4.33 (Unix)
Server built:   Mar 22 2018 01:24:46
```
Mysql

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.22, for osx10.13 (x86_64) using  EditLine wrapper
```
こんな表示になっていればOK
Laravelをインストールしていく

##Laravelをインストールする準備
もしcomposerがない場合はインストール

```ターミナル
$ brew install composer
```
.bash_profilenにpathを追加

```.bash_profile
export PATH=$PATH:~/.composer/vendor/bin:/usr/local/sbin
```
```ターミナル
#bash_profile更新
source ~/.bash_profile
```
composerのバージョン確認

```ターミナル
$ composer --version
Composer version 1.6.5 2018-05-04 11:44:59
```

##Laravel Valitインストール

Composerを用いてLaravel Valitをインストール

```ターミナル
$ composer global require laravel/valet
```
インストール完了したらバージョン確認！

```ターミナル
valet --version
```
ここでインストールされているのにnot commandの様なメッセージが表示されている場合は、.bash_profileにpathが通ってない可能性があるので、pathを通してみてください。

valetインストールしてみる

```ターミナル
$ valet install 実行

/
/
/
	Restarting nginx.

	Valet installed successfully! ←インストール完了！
```
次にLaravel Valetの設定を行います。
開発を行うディレクトリに移動し、valet parkコマンドを実行。

```開発ディレクトリに移動
valet park
```
自分の場合は、/workspace/php/laravel/ディレクトリを作成してそこにvalet parkを実行

ちなみにvalet parkが実行されたディレクトリ以下は、全てvaletの管理下に置かれるようです。

####※ 逆に開発ディレクトリの解除をしたい場合はvalet forgetで解除

##実際にプロジェクト作成してみる
プロジェクト作成もComposerを用いての作成

```
$ composer create-project laravel/laravel <プロジェクト名> <Laravelバージョン>
```

```
例：$ composer create-project laravel/laravel TestProject "5.5.*" 実行
```

処理が終わったらプロジェクトのディレクトリに移動し、storage/とbootstrap/cache/の権限を適切なものに変更

```
$ cd TestProject #移動
$ chmod -R 777 bootstrap/cache/ #権限付与
$ chmod -R 777 storage/ #権限付与
```

※bootstrapとcachaの権限はプロジェクト毎に付与した方が良さそう

##TLS通信の準備
valet openコマンドでデフォルトで開くChromeさんが最近のバージョンから可能であればhttps通信を試みるようになり，そのままの状態だと開けないためTLS暗号化の準備をします。

ということみたいなので下記実行

```
$ valet secure
```


作成したプロジェクトへ移動

```
$ valet open
```
Laravelのページが表示されていれば完了


##参考：

https://qiita.com/zeriyoshi/items/f995668d435d3c7a7d9d
https://qiita.com/nkumag/items/3ba39749e5ad59ede1f5
https://qiita.com/33yuki/items/ae8182d6024ea0657df2

この辺り参考にさせていただきました。
Droolsを試した（Java, InputStream）

# 諸事情でおっさん達向けにBRMSとは？という説明をすることになった

といいつつ自分もおっさんなのだが、会社のおっさん達向けにBRMSとは？というのを説明する羽目になった。ちょっと触ったことがあるのが10年くらいまえなので、最新版7.7を触ってみた。
だいぶアーキテクチャーが変わっているので、とりあえず簡単な内容に留めるのと、Qiitaの他の方々の記事を大いに参考にさせていただいた。

# 参考にした記事
この辺です。
[DroolsにInputStreamでExcelディシジョンテーブルを食わせる、他](https://qiita.com/madilloar/items/0de75c433bfde5d3baeb)
[KotlinでDroolsを動かす](https://qiita.com/keitaro_1020/items/0e052456d738983428ad)

とちらかというと、下のKotlinで動かすのまんまでも良かったのですが、Kotlinとはなんぞや？をおっさん達に説明するのが面倒くさいので、Javaに書き下ろした感じです。
Appleとかをまんま使うのも気が引けつつ、Orangeに変えるのも小賢しいのであえてそのままにしました。
本当にありがとうございます。

# 多少考えた点

mainにBRMS臭があまり漂わないように、BRMSに関する知識はUtilに全部集めました。
全般的にコードに適当感が漂うので、明らかに変な使い方をしていたらゴメンナサイ。

# コードの全量

一応GitHubに上げておきました。
https://github.com/akiraabe/drools_demo
iTerm2 チートシート

備忘録として，iTerm2のコマンドをまとめました.(2018年5月13日更新)
タブ&ウィンドウの操作系
================
**機能** | **ショートカット**
-------- | --------
新しいタブの作成 |  `⌘`+ `t`
新しいウィンドウの作成 |  `⌘`+ `n`
フルスクリーン | `⌘`+ `Enter`
左のタブに移動 | `⌘`+ `Left Arrow`
右のタブに移動 | `⌘`+ `Right Arrow`
指定した番号のタブに移動 | `⌘` + `Number`
指定した番号のウィンドウに移動 | `⌘` + `Option` + `Number`
指定した方向のペインに移動 | `⌘` + `Option` + `Arrow`
別のペインに移動(順番に) | `⌘` + `]` , `⌘` + `[`
ウィンドウを水平に分割(同じプロファイル) | `⌘` + `D`
ウィンドウを垂直に分割(同じプロファイル)  | `⌘` + `d`
ウィンドウを水平に分割(新しいプロファイル) | `Option` + `⌘` + `H`
ウィンドウを水平に分割(新しいプロファイル)  | `Option` + `⌘` + `V`
マークをセット| `⌘` + `M`
マークに移動 | `⌘` + `J`

移動系
===========
**機能** | **ショートカット**
-------- | --------
行の冒頭に移動 | `Ctrl` + `a`
行末に移動 | `Ctrl` + `e`
一文字分戻る | `Ctrl` + `b`
一文字分進む | `Ctrl` + `f`
今の位置の文字を削除 | `Ctrl` + `d`

その他(検索,補完など)
==========================
**機能** | **ショートカット**
-------- | --------
検索 |  `⌘`+ `f`
全てのタブを検索・表示| `⌘ `+ `opt`+`e `
透明度切り替え| `⌘ `+ `u`
クリップボード機能(時系列で表示) | `⌘ `+ `shift`+`h`
入力補完機能| `⌘ `+ `;`
スクリーンをクリア | `⌘` + `k`

参考サイト
https://gist.github.com/squarism/ae3613daf5c01a98ba3a

https://qiita.com/kenju/items/3bcd9707266a0b427da3

間違いのご指摘等ありましたら,お願いいたします.
DockerでApache Solr 7系を作ってみる

## 概要
公式コンテナを使って簡単にApache Solr7を構築してみる。

## ファイル構成
下記のようなファイル構成となります。

```:ファイル一覧
└ docker-compose.yml
```

## docker-compose.yml
コンテナを作成する設定ファイルを作成します。

```yml:docker-compse.yml
version: '3'
services:
  solr:
    restart: always
    image: solr:7
    container_name: 'solr7'
    ports:
     - "8007:8983"
    volumes:
      - solr7-data:/opt/solr/server/solr/mycores
    entrypoint:
      - docker-entrypoint.sh
      - solr-precreate
      - mycore
volumes:
  solr7-data:
    driver: local
```

## コンテナ起動
下記コマンドでコンテナを起動します。

```shell:ターミナル
$ docker-compose up -d
```

## 状況確認
コンテナへ接続して、バージョンや起動状況を確認する。

```shell:ターミナル
$ docker exec -it solr7 bash
```
```shell:ターミナル(solrコンテナ)
$ java -version
openjdk version "9.0.4"
OpenJDK Runtime Environment (build 9.0.4+12-Debian-4)
OpenJDK 64-Bit Server VM (build 9.0.4+12-Debian-4, mixed mode)
```
```shell:ターミナル(solrコンテナ)
$ which solr
/opt/solr/bin/solr
$ solr -version
7.3.0
```

## 管理画面
Apache Solrが起動していれば、下記のURLで確認できると思います。

```
# localhostの場合
http://localhost:8007/solr/

# vagrant(192.168.33.10)の場合
http://192.168.33.10:8007/solr/
```

ブラウザで上記URLへアクセスして管理画面が閲覧できればOK。
![solr7.png](https://qiita-image-store.s3.amazonaws.com/0/142279/791ad591-dd56-e120-36f1-85696a2bd020.png)

以上

## 参考サイト
* [Docker Hub - library/solr](https://hub.docker.com/_/solr/)
DockerでApache Solr 6系を作ってみる

## 概要
Apache Solrのコンテナは公式のものがありますが、
java:8コンテナをベースにして独自で作ってみたかったので試してみる。
※ あくまで学習用です(公式コンテナがあるので実際に使う場合はそちらを利用)。

* [Docker-hub - library/solr](https://hub.docker.com/_/solr/)

## ファイル構成
下記のようなファイル構成となります。

```:ファイル一覧
├ Dockerfile
└ solr-6.6.3.tgz
```

## ApacheSolrのダウンロード
下記サイトからダウンロードします。
※ 今回は、「solr-6.6.3.tgz」をダウンロードしました

* [Apache Archives](http://archive.apache.org/dist/lucene/solr/)

## Dockerfile
コンテナを作成するための設定を作成します。

```:Dockerfile
FROM java:8

# system update
RUN apt-get -y update && apt-get -y upgrade

# locale
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

# timezone (Asia/Tokyo)
ENV TZ JST-9

# etc
ENV TERM xterm

# tools
RUN apt-get -y install less vim

# apache solr
COPY solr-6.6.3.tgz /tmp/solr-6.6.3.tgz
RUN mkdir -p /usr/solr/ \
    && tar xzvf /tmp/solr-6.6.3.tgz -C /usr/solr/ \
    && rm /tmp/solr-6.6.3.tgz
ENV PATH="/usr/solr/solr-6.6.3/bin:$PATH"

WORKDIR /root
EXPOSE 8983
ENTRYPOINT /bin/sh -c "solr start -force && tail -f /dev/null"
```

## コンテナ作成
下記コマンドでビルドします。

```bash:ターミナル
$ docker build -t reflet/solr6 .
```

## コンテナ起動
下記コマンドでsolr4コンテナを起動(8006ポート)します。

```bash:ターミナル
$ docker run -p 8006:8983 -d --name solr6 reflet/solr6
```

## 状況確認
コンテナへ接続して、バージョンや起動状況を確認する。

```bash:ターミナル
$ docker exec -it solr6 bash
```

```bash:ターミナル(solrコンテナ)
$ java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2~bpo8+1-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)
```

```bash:ターミナル(solrコンテナ)
$ ps -aux | grep solr
root         5  0.0  0.1   4328   580 ?        S    11:02   0:00 /bin/sh -c /usr/solr/solr-6.6.3/bin/solr start -force && tail -f /dev/null

$ solr -version
6.6.3
```

## 管理画面
Apache Solrが起動していれば、下記のURLで確認できると思います。

```
# localhostの場合
http://localhost:8006/solr/

# vagrant(192.168.33.10)の場合
http://192.168.33.10:8006/solr/
```

ブラウザで上記URLへアクセスして管理画面が閲覧できればOK。
![solr6.png](https://qiita-image-store.s3.amazonaws.com/0/142279/5476983f-24f4-d342-29bf-7358cc3a21ce.png)

以上

## 参考サイト
* [Docker-hub - library/solr](https://hub.docker.com/_/solr/)
* [Github - docker-solr/docker-solr](https://github.com/docker-solr/docker-solr/tree/4b980ef6a0b997dd0d32be6aca1115d0099e1391)
* [solrをdockerで導入](https://qiita.com/junk1400/items/ba2add84fc650c02c1d8)
OctoberCMSのページライフサイクル（描画までのメソッドの実行順）

ページライフサイクルについて、ドキュメントがどこにあるのかよく忘れるのでメモ。

以下、[OctoberCMSのドキュメント](https://octobercms.com/docs/cms/layouts#layout-life-cycle)から抜粋。

1. Layout `onInit()` function.
2. Page `onInit()` function.
3. Layout `onStart()` function.
4. Layout components `onRun()` method.
5. Layout `onBeforePageStart()` function.
6. Page `onStart()` function.
7. Page components `onRun()` method.
8. Page `onEnd()` function.
9. Layout `onEnd()` function.
Homebrewのエラー


Homebrewでローカル環境にPHPを設定しようとするとerrorが発生

```
$ brew doctor
```

```実行結果
Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  python@2

```

brew doctorすると 'brew link'しろと書いてあって
these: python@2 となっているのでbrewで管理しているpython@2のリンクがおかしくなっているみたい…
とりあえずエラーに従う

```
brew link python@2 実行
```
またしてもエラー

```エラー内容
Linking /usr/local/Cellar/python@2/2.7.14_3... Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks

```
permission deniedエラーで/usr/local/Frameworksが無いと言われてる。（dir_s_mkdir - /usr/local/Frameworks）
実際のパスを見にいくとFrameworksディレクトリがないので言われた通り作成する

```
#Frameworksディレクトリを作成
sudo mkdir /usr/local/Frameworks

#パスワード入力
Password:XXXXXXXX
```

再びbrew link実行

```
brew link python@2

#同じエラーになった
Linking /usr/local/Cellar/python@2/2.7.14_3... Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks/Python.framework
```

どうやら権限をつける必要性があるみたい

```権限付与
sudo chown $(whoami):admin /usr/local/Frameworks
```
```
brew link python@2実行

#結果
Linking /usr/local/Cellar/python@2/2.7.14_3... 5 symlinks created
```
お、brew link出来たみたい？

```
brew doctor

#結果
Your system is ready to brew.
```
とりあえずエラーは消えた!
下層ディレクトリのファイル名を正規表現で一括置換したときのメモ

下層ディレクトリのファイル名を正規表現で抽出して一括置換したときのメモです。

こういう単純な置換ですが、正規表現でのやり方がわからなかったので試行錯誤しました。

```rename.sh
mv ./Bambuu/s1.jpg ./Bambuu/1s.jpg
mv ./Bambuu/m2.jpg ./Bambuu/2m.jpg
mv ./Bambuu/f3.jpg ./Bambuu/3f.jpg
```


### 確認
```rename_confirm.sh
find . -regex .*[smf][123]\.jpg | sed -e 's/\(.*\)\([smf]\)\([123]\)\.jpg/mv \1\2\3\.jpg \1\3\2.jpg/'
```


### 実行
```rename.sh
find . -regex .*[smf][123]\.jpg | sed -e 's/\(.*\)\([smf]\)\([123]\)\.jpg/mv \1\2\3\.jpg \1\3\2.jpg/' | sh
```


### 分解
|コマンド |目的 |
|:---|:---|
|find -regex |正規表現で探索 | 
|sed -e　 |置換しコマンドを追加|
|sed 's/<置換前>/<置換後>/'|<置換前>を<置換後>に置換|
|sed 's/\\(\\)//'|()は\でエスケープしなければならない|
|\1| 1番目の()を挿入|
LaTeX作成環境（TeX Live + Atom）を構築する（Ubuntu編）

# 謝辞
`LaTeX` の書き方が手抜きですが、ご了承お願い致します。


# 環境
Ubuntu MATE 18.04

```shell-session:Ubuntu_version
$ cat /etc/issue
Ubuntu 18.04 LTS \n \l
```


# TeX live のインストール

```shell-session:texliveのインストール
$ sudo apt install texlive-full
```

# Atom
## Atom のインストール
[Atom.io](https://atom.io/) から `atom-***.deb`をダウンロードし、インストールする。
（`***` は `amd64` など）

```shell-session:atomのインストール
$ sudo dpkg -i atom-***.deb
```

# Atom の拡張機能のインストール
```shell-session:apm
$ apm install latex language-latex latexer pdf-view
```

**sudo をつけない点と、aptと打ち間違えないようする点に注意**

なお、Packageの詳細な説明は以下のサイトから引用する。
[AtomエディタにLaTeXの日本語環境を構築することによる文書作成の効率化【Windows】](https://qiita.com/tomochiii/items/152160a9915fb7b2146c)

> latex: AtomからLaTeXの文書スクリプトをコンパイルするのに必要
> language-latex: Atom内でLaTeXのシンタックスハイライトのために必要
> latexer: AtomでLaTeX周りの自動補完を行うために必要
> pdf-view: pdf-view: AtomのためのPDFビューアー

## Atom package の LaTeX のセッティング
- `Settings - Install` から `latex` を検索し、 `Settings` をクリックする
![AtomSetting.png](https://qiita-image-store.s3.amazonaws.com/0/232491/99efc231-57a2-7c2f-1f3b-d4d13e4fb16e.png)

- pLaTeXでコンパイルするようにする。
    - `Engine` にて `pLaTeX` を選択
- コンパイル時、PDFファイルを自動で開かないようにする
    - `Open Results after Successful Build` と `Open Results in Background` のチェックを外す

# Input method 関連の設定
Input method として Fcitx を使用する場合の追加の設定

## Virtual Keyboard を無効にする
TeXファイルのコンパイルのショートカットキーである `Ctrl + Alt + b` により、Virtual Keyboard が表示されてしまう。これを防ぐため、Virtual Keyboardを無効にする。

### 方法
`Input Method Configration - Addon` で、Advancedにチェックを入れた後、Virtual Keyboard のチェックを外す。
![InputMethodConfig.png](https://qiita-image-store.s3.amazonaws.com/0/232491/26369601-3572-83b9-0eea-267b3bf36f4e.png)

## Fcitx-mozc
日本語入力時、`空白文字` と `#` を半角入力されるようにする。

### 空白文字
- `Mozc Setting - General` で `Space input style` を `Halfwidth` にする。
    - なお、この設定をすると、 `Shift + Space` 時には全角の空白文字が入力されるようになる。

![MozcGeneral.png](https://qiita-image-store.s3.amazonaws.com/0/232491/c5c819cc-79cd-b9dc-d5c4-36ad5d60e78a.png)

### *#*（シャープ）
- `Mozc Setting - Advanced` で ```#%&@$^_|`\```  の `Compention` を `Halfwidth` にする。
    - なお、日本語入力時でも、数字やアルファベットを半角で入力したい場合も、この項目（`Advanced`）で設定すればよい。

![MozcAdvanced.png](https://qiita-image-store.s3.amazonaws.com/0/232491/185db78e-bc24-ab2b-c33f-a010d9324a61.png)



# 参考文献
[UbuntuにTeX環境をインストールするための覚書](https://qiita.com/kentarosasaki/items/358134a1092864ff7625)
[AtomエディタにLaTeXの日本語環境を構築することによる文書作成の効率化【Windows】](https://qiita.com/tomochiii/items/152160a9915fb7b2146c)
奥村晴彦・黒木祐介 (2018)『[改訂第7版] LaTeX2e 美文書作成入門』技術評論社
OctoberCMSテーマ作成：ページPHPコードからPage Not Found (404)を返す

OctoberCMSでは今のところ残念なことにLaravelの`abort(404)`が使えません。
404エラーページを表示せずに500エラーとして処理されてしまいます。

フロントエンドのページで404エラーページを表示するには下記の方法が考えられます。
1. `/404` へリダイレクトさせる
2. [コンポーネントで404のレスポンスを返させる](https://qiita.com/pikanji/items/f72ac4c36520152f67e8)
3. ページのPHPセクションで404のレスポンスを返させる

ここでは3について説明します。

ページテンプレートのPHPセクションで `return Response::make($this->controller->run('404'), 404);` を記述することでできます。

下記実装例では、URLで指定したプロダクトが存在しない場合Page not foundを表示させています。

```
url = "/product/:product_key"

[product]
product_key = "{{ :product_key }}"
==
<?php
function onInit()
{
    if (!$this->product->exist()) {
        return Response::make($this->controller->run('404'), 404);
    }
}
?>
==
{# テンプレートコード #}
```
PHPの日付まとめ

memo

date() ローカルの日付、時刻を書式化する
strftime() ロケール設定に基づいた日付、時刻を書式化する

|strftime()|date()|出力        |2018年5月1日<br>15時5分20秒（火）での例|
|---       |---   |---         |---|
|%d        |d     |日付（２桁）  |01|
|%a        |D     |曜日（３文字） |Tue|
|%m        |m　　　|月（２桁）    |05|
|%b        |M     |月（３文字）  |May|
|%y        |y     |年（２桁）    |18|
|%Y        |Y     |年（４桁）    |2018|
|%D        |m/d/y |月/日/年     |05/01/18|
|%H        |H     |２４時間      |15|
|%I        |h     |１２時間      |03|
|%M        |i     |分（２桁）    |05|
|%S        |s     |秒（２桁）    |20|

iってなんなんだ…
Linux tar.gz tar 圧縮 解凍

いつも思い出せないtar.gzのメモ。
Windowsでtar.gzを扱うのが面倒なときのためにtarも追加。

# tar gz

## 圧縮

### tar.gzの場合

```
tar -zcvf filename.tar.gz directoryname
```

### tarの場合

```
tar -cvf filename.tar directoryname
```

## 解凍

### tar.gzの場合

```
tar -zxvf filename.tar.gz
```

### tarの場合

```
tar -xvf filename.tar
```

## オプション

| option | full name | mean |
|:--:|:--|:--|
|-z|--gzip|gzip形式であることを指定|
|-c|--create|新しく圧縮ファイルをつくる|
|-v|--verbose|処理結果を出力|
|-f|--file|圧縮ファイルの名前|
|-x|--extract|圧縮ファイルからファイルを取り出す|

詳しくはこの辺↓を参考に。
http://www.atmarkit.co.jp/ait/articles/1608/15/news015.html
math > vector > 2つのベクトルの大きさ比較 > ノルムを使う > numpy.linalg.norm()

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### やりたいこと

- 2つのベクトルがある
- ベクトルの大きさの比較を行う

ユークリッドノルムを使うことになるだろうか。
https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%AB%E3%83%A0

### numpy.linalg.norm

https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.linalg.norm.html

試してみた。

```test_vector_norm_180513.py
import numpy as np

avec = [1, 2, 3]
res = np.linalg.norm(avec)
print(res)

res = np.sqrt(1*1 + 2*2 + 3*3)
print(res)

```

```txt:run
$ python3 test_vector_norm_180513.py 
3.7416573867739413
3.7416573867739413
```

期待の式の結果と同じになった。

### 始点と終点の座標に対する計算

numpy arrayにて始点と終点の座標が与えられている場合、下記のような計算をする。

```test_compare_vector_180513.py
import numpy as np

ray0 = np.array([0, 0, 1])  # start point
ray1 = np.array([1, 2, 4])  # end point
aray1 = [ray0, ray1]
ray2 = np.array([2, 4, 7])  # end point
aray2 = [ray0, ray2]

print(aray1)
wrk = aray1[1] - aray1[0]
res = np.linalg.norm(wrk)
print(res)

print(aray2)
wrk = aray2[1] - aray2[0]
res = np.linalg.norm(wrk)
print(res)

```

```txt:run
$ python3 test_compare_vector_180513.py 
[array([0, 0, 1]), array([1, 2, 4])]
3.7416573867739413
[array([0, 0, 1]), array([2, 4, 7])]
7.483314773547883
```
Xcode 9.3でプロビジョニング・プロファイルの中身が簡単に確認できるようになっていた件

# プロビジョニング・プロファイルって何よ？

初学者用に記載しておきます。ご存知の方は読み飛ばしてください。

iOSアプリでは、コード署名とプロビジョニングによって、怪しい「野良アプリ」を配布できないように抑止しています。

少し前の記事になりますが、以下の記事中のイメージ図がわかりやすいと思います。
（参考リンク）[iOSアプリのプロビジョニング周りを図にしてみる](https://qiita.com/fujisan3/items/d037e3c40a0acc46f618)

- こちらの記事にある通り、プロビジョニング・プロファイルには「App ID（Bundle ID）」「開発者の証明書」「実機テスト用端末のUDID」が含まれています。
- プロビジョニング・プロファイルに、これらの情報が正しく（開発者の想定通りに）設定されていないと、「アプリがビルドできない」「実機にアプリがインストールできない」などのトラブルに見舞われます。

# Xcode 9.3時代のプロビジョニング・プロファイルの中身の確認方法

- Xcode 9.3のバージョンアップに伴い、Finderの「クイックルック」にて、こんな感じで確認できるようになりました。

<img width="815" alt="スクリーンショット 2018-05-13 9.00.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/a14c704f-b00e-f705-cb22-b80da179d53f.png">

- Macに登録されているプロビジョニング・プロファイルは以下の手順で見つかります。
    1. Finderにて、[Shift] + [Command] + [.] で隠しファイルを表示するように切り替える。
    - (ユーザー) > ライブラリ > MobileDevice > Provisioning Profiles を開く。

以前は専用のツールが必要でしたが、簡単に確認できるようになりました。:clap:
何年か前から比べたら、プロビジョニング周りは徐々に改善されている気がします。
kintone 詳細画面にjQuery UI のダイアログを表示するサンプル

kintoneの詳細画面にダイアログを表示するサンプルです。

# サンプルアプリ画面
<img width="624" alt="スクリーンショット 2018-05-13 8.59.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/dfe9675a-5c51-773a-93f1-73f6da8449a6.png">

# 実装方法
1. 詳細画面にダイアログ表示用のボタンを設置（詳細画面のメニュー右の空白を利用）
2. ダイアログ画面のHTMLを準備（変数にダイアログ用のHTMLをセットする）
3. ダイアログ画面を表示する関数を作成（$( "ダイアログ用のHTML" ).dialog().dialog('open');）
4. ボタンクリックイベントに3.のダイアログ表示関数の実行を設定

# 動作説明
1. 文字列１行のフィールドを１つ設置したアプリを作成します。
2. フィールドコードは sline とします。
3. レコードを登録します。
4. 詳細画面に表示されたclickボタンを押下します。
5. ダイアログが表示されて、フィールドに入力された文字列が Hello,の後に繋げて表示されます。

# 注意
jQueryを使いますので、アプリの設定画面で読み込んでおいて下さい。
- https://js.cybozu.com/jquery/2.2.4/jquery.min.js
- https://js.cybozu.com/jqueryui/1.12.0/jquery-ui.min.js
- https://js.cybozu.com/jqueryui/1.12.1/themes/smoothness/jquery-ui.css
また、今回のサンプルではUnderscore.jsも利用していますので、そちらも読み込みをお願いします。
- https://js.cybozu.com/underscore/1.9.0/underscore-min.js

# ソースコード

```javascript
jQuery.noConflict();
(function($) {
    "use strict";
    kintone.events.on("app.record.detail.show", function(e) {
        var elfield = kintone.app.record.getFieldElement('sline');
        var compiled = _.template('<div id="dialog" title="Hello"> Hello,<%= echo %></div>')({echo: $(elfield).text()});

        var elMyBt = _.template('<button id="myBt">click</button>');
        $(kintone.app.record.getHeaderMenuSpaceElement()).append(elMyBt);

        $('#myBt').on('click', function() {
            console.log("on click");
            viewDialog();
        });
        
        function viewDialog() {
            console.log("viewDialog");
            $(compiled).dialog({autoOpen: false, modal: true}).dialog('open');
        }
    });
})(jQuery);
```

# 参考文献
- jQuery UI Dialog https://jqueryui.com/dialog/
UICollectionViewのセルを操作した時の更新

様々な情報を追い求めたけど、下記の書き方で更新できた。
メインスレッドでやらんとあかんのね。非同期な処理の中から更新してた場合に有効かと。

```
DispatchQueue.main.async{
    self.collectionView.reloadData()
}
```

ちなみにこれでも更新は出来たのだけども2〜3秒待たされた。

```
    self.collectionView.reloadData()
```

あとはViewを消して追加とか、invalidateLayoutも、あかんかった。

```
collectionView.collectionViewLayout.invalidateLayout()
```
iOSアプリ開発チームビルディングのTODOリスト

# はじめに

私ごとですが、現在、iOSアプリ開発チームの立ち上げを行なっております。
その中で、実施したこと、実施予定のこと、をまとめてみました。

「こんなこともやっといた方が良いよ！」というアドバイスをコメントいただけると大変助かります。:pray:

**＜ご注意＞**

- 執筆時点の開発環境はXcode9.3 + Swift4.1です。
- 本稿の内容は私個人の見解であり、所属企業における立場、戦略、意見を代表するものではありません。

# 学習

## Swiftの基礎

入門として、以下のような事項を学習しました。

- 変数と定数
- Optional
- 制御構文
- 関数とクロージャ
- クラス
- Protocol
- Extension
- エラー処理

## Xcode と iOS Framework

- iOSシミュレーターの使い方
- View周りの基本
- アラートダイアログとアクションシート
- 画面遷移
- Auto Layout
- URLRequestによるWeb API連携
- UserDefaultsへの保存と読み出し
- Core Dataによるデータ永続化

# ライブラリの評価

## HTTPクライアント

- 標準のURLRequestと、[Alamofire](https://github.com/Alamofire/Alamofire)と、[APIKit](https://github.com/ishkawa/APIKit)を評価しました。
- 最小限の手間でコードが簡潔になることから、ライブラリを使うこととしました。
- AlamofireとAPIKitでは、それぞれ一長一短あるかと思いますが、機能の豊富さとアップデート頻度が決め手となってAlamofireを選択しました。

## ローカルデータベース

- 標準のCore Dataと、[Realm Swift](https://www.realm.io/docs/swift/latest/)を評価しました。
- Realm Swiftは、学習コストが低いこと、コードが簡潔に書けること、アップデート頻度が決め手となって採用を決めました。

# ユニットテストの利用方針

- ロジック部分は標準のXCTestを使い、UI周りはテスト仕様書を書いて実動作で確認することにしました。
- XCUITestは、テストコードの保守が大変そう（負債になりそう）な感じなので採用を見送ろうと思っています。実際どうなんでしょう…:rolling_eyes:

# Storyboardの利用方針

- 最近は『1Storyboard-1ViewControllerが良いよ』というWeb記事を良く目にしますので、それを原則にしました。

（参考リンク）
[StoryboardのBestPracticeについて考える(1) 〜Storyboardの分割〜](https://qiita.com/UJIPOID/items/06284fc1d9ec8c49f8a1)

# コーディング規約

- Swiftの静的解析ツール[SwiftLint](https://github.com/realm/SwiftLint)を導入することにしました。
    - 設定ファイル（.swiftlint.yml）は、ほぼデフォルト設定ですが、１行の文字数を制限する「line_length」は無効化しました。Xcodeが自動生成するコードもエラーになってしまい、煩わしいため…
- XCTestのテストメソッドに関しては、『ソースコメントに「テスト条件」「期待結果」を記載すること』と規約として定めました。
    - その他の規約を文書化するのは、書くのも読むのもメンテするのも大変なのでやめました。（多分Swiftのバージョンアップに追従できない…）

# ローカライズ方針

- 原則として、利用場面（画面ごとなど）によって言語リソーステーブルを分けることとしました。
- そうしないと、Localizable.stringsが肥大化して分かりにくくなりますし、キー名の命名規約等を決めなければならなくなりますので…

（参考リンク）
[iOSアプリの国際化対応の勘所とTips集(Swift版) - 文脈によって言語リソーステーブルを分割する](https://qiita.com/mono0926/items/c41c1ce18b90b765a8f2#%E6%96%87%E8%84%88%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E8%A8%80%E8%AA%9E%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B)

# バージョン管理

- 全社的に[GitHub Enterprise](https://enterprise.github.com/home)を利用していますので、それに乗っかります。
- 小規模チームですし、GitHub Flowをベースに、簡素なブランチモデルで運用しようと思っています。
- .gitignoreの定義については、[GitHubのサンプル](https://github.com/github/gitignore/blob/master/Swift.gitignore)が公開されているので、ほぼそのまま採用しました。

# これから実施したいこと

- MBaaSの調査
    - どのサービスを使うのかは案件次第になりそうなのでちょっと後ろ倒しになっておりますが、必須ですよね。
- Continuous Integration(CI)環境構築
- コードレビュー観点の整理
    - 漫然と実施しても時間を浪費するだけなので、整理してガイドを作りたいと考えています。
    - しかし、コードレビューを実施する目的（検出したい課題は何か）まで立ち戻って考えると、結構難しいですね…
- 実機テスト
    - 全機種/OSへの対応

その他は案件の特性によって、立ち上がり時期に調査する感じですかね…
何かアドバイスがありましたらコメントをいただけますよう、重ねてお願いします！:bow:
デモグラフィック属性を推定する

## About
２０１８年４月まで所属していた会社でdemographicを予測する手法を考案、実装し、プロダクション環境へ組み込んだので紹介する。

## Overview
webページを訪問したweb browserのcookieを使用し、年齢と性別の推定をした。

## Details
http://developers.microad.co.jp/entry/2018/05/11/120151

Thank you for your reading!
Jupyter Notebookでpython3 Kernelを追加するのにはまったメモ

Jupyter Notebookでpython3 Kernelを追加するのにはまったメモ

##anacondaでpython2.Xをセットアップした環境で、python3も利用したい場合
※自分の環境はWindows10です。

Anaconda promptで以下を実行

```
conda create -n python3 python=3.6
activate python3 
conda install notebook ipykernel
ipython kernel install --user
```
`ipython kernel install` コマンドで、カーネル追加となる

参考：
https://stackoverflow.com/questions/30492623/using-both-python-2-x-and-python-3-x-in-ipython-notebook

これで、Jupyter Notebookでpython3のカーネルが選択できるようになった。

![jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/112537/dd1046db-62c1-6fc9-41ef-fe876ddd0cc1.png)


##次は、kernelを切り替えて処理を実行すると、2系では使えていたモジュールが使えないというエラー

```
ModuleNotFoundError: No module named pandas
```

python3環境用に別途installする必要があるらしい
anaconda promptからcondaでinstall

```
activate python3
conda install pandas
```

これで利用できるようになった。

作成した環境一覧確認コマンドはこちら
```
conda info -e
```

##今度は、matplotlibで　name '_converter' is not defined というエラー

基本的にはmatplotlibのインストールが正しく完了していない場合に起こる模様。

```
conda install matplotlib
```

anaconda promptでインストールは正常に完了したはずなのに上記エラーとなった。

Jupyter Notebookを再起動すればOKとのことで試したら成功した。

![matplot.png](https://qiita-image-store.s3.amazonaws.com/0/112537/6f0b8874-216f-ed4f-14a6-e56b9a89d41b.png)

参考：
https://github.com/pandas-dev/pandas/issues/19810