OmniAICreator/Qiita-1.07M huggingface dataset:
Firebase を使った Web 通知をオリジナルにカスタマイズする方法

Firebaseを使ってWeb通知を送ろうとしたのですが、web通知初心者の私は思ったよりも苦戦したので共有します。

基本は[こちら](https://github.com/firebase/functions-samples/tree/master/fcm-notifications)にあるCloud functionを使ったweb通知の送り方の例通りなのですが、オリジナルのアイコンやバイブレーションパターンなどを実装したい時にはこの例を少しいじる必要があるので、そこを説明していきます。
#FCMには２種類の通知がある
FCMには

- Notification Message
アイコンを変更したり、バイブレーションパターンを変更したりはできないが、実装が手軽な通知

- Data Message
通知をフルカスタマイズできるが、実装が少し面倒な通知

の２種類の通知があります。
上のfirebase公式の例で使われているのはNotification Messageなので、まずはそれをData Messageに変えましょう。

変更方法は54行目くらいにあるこれ

```
// Notification details.
    const payload = {
      notification: {
        title: 'You have a new follower!',
        body: `${follower.displayName} is now following you.`,
        icon: follower.photoURL
      }
    }
```

の notification という key を data 変えるだけです

```
// Notification details.
    const payload = {
      data: {
        title: 'You have a new follower!',
        body: `${follower.displayName} is now following you.`,
        icon: follower.photoURL
      }
    }
```

これで Cloud function 側の変更は終了です。
#Service worker への記述
FCMのWeb版を使うには Root directory に firebase-messaging-sw.js というファイルを作り、[公式ドキュメンテーション](https://firebase.google.com/docs/cloud-messaging/js/receive)から以下のコードをコピペしておく必要があります。

```
importScripts('https://www.gstatic.com/firebasejs/3.9.0/firebase-app.js')
importScripts('https://www.gstatic.com/firebasejs/3.9.0/firebase-messaging.js')

firebase.initializeApp({
  'messagingSenderId': 'YOUR-SENDER-ID'
})

const messaging = firebase.messaging();
```

ここまでは documentation 通りです。このコードの下にこんな感じのコードを追加します。

```
messaging.setBackgroundMessageHandler(function(payload) {
  console.log('[firebase-messaging-sw.js] Received background message ', payload)

  // Customize notification here
  const notification = payload.data

  const notificationTitle = notification.title

  const notificationOptions = {
  	body: notification.body,
    icon: notification.icon,
  	badge: '/images/notification/badge.png',
  	tag: 'exampleTag',
  	vibrate: [150,100,150,100,200]
  }

  return self.registration.showNotification(notificationTitle,
      notificationOptions)
})
```

上のコードの notification という variable にFCMで送られて来たデータが入っています。
そのデータを使い、 notificationTitle と notificationOptions のオブジェクトを作って、 showNotification を call すればそれで通知が表示されます。
#Notification Options の説明
Notification Options とは、通知のアイコンやらバイブレーションパターンやら様々なものを指定できるオブジェクトなのですが、具体的に何を指定できるのか書きます。
ここに書かれているものは全部[ここ](https://web-push-book.gauntface.com/demos/notification-examples/)から持って来ました。

- icon
通知のアイコンを指定できる

- badge
通知のバッジを指定できる。バッジとはモノクロの小さな画像で、通知が来た時にスマホの上部に表示されます。これが指定されていないとブラウザのマークが表示されます。

- image
大きな画像付きの通知を送れる。

- tag
通知にタグを設定できる。タグを設定することで、同一のタグの通知を一つにまとめたりできる。

- renotify
タグを設定した時に、同一のタグの通知がくるとデフォルトでは通知は音も鳴らさないし、バイブもしないが、renotifyがtrueになっていると新着通知のように音を鳴らし、バイブもする。

- Silent
通知を表示しても音も鳴らさなければバイブもしなくなる。

- vibration
オリジナルのバイブレーションパターンを指定できる。指定の仕方は数字のarrayで、[200,150,300,100,200]例えばこうすると200msバイブがなり、150ms静か、また300msなり、100ms静か、最後に200msなって終了といった具合で指定できる。

- sound
音声ファイルへのpathを指定することでオリジナルの音声を再生することができる

これが全てではないですけれど、大方使うのはこれくらいかと思われます。

以上がFCMを使って通知をオリジナルにカスタマイズする方法でした。
SQLでカラムの合計値がある値を超えるまで出力するには

SQLで、テーブルをあるカラムの値でソートし、別のカラムの合計値が閾値を超えるまでのエントリを取り出す方法を書く。whileとかカーソルとかのループを使わずにやれないかと検索したらStack Overflowに一発で答えがあったけど、一応自分用のメモ書きで残しておく。

### 参考リンク
- Stack Overflowのスレッド(SQL Server版): https://stackoverflow.com/questions/23479161/getting-sum-of-an-sql-table-column-until-the-sum-reaches-5000

- MySQL版:
https://stackoverflow.com/questions/7097413/a-sql-query-to-select-until-sumusers-count-reaches-1000

### テーブル例

```sql
create table Items
(
    ID int NOT NULL primary key clustered,
    Name nvarchar(255) not null,
    Price int not null,
    LastUpdated datetime2(7) not null
)
```

### サンプルデータ

```sql
insert into Items (ID, Name, Price, LastUpdated) values
    (1, 'Tomato', 5, '2017-06-01'),
    (2, 'Banana', 4, '2017-05-30'),
    (3, 'Apple', 3, '2017-07-05'),
    (4, 'Potato', 3, '2017-04-01'),
    (5, 'Orange', 5, '2017-07-01'),
    (6, 'Broccoli', 4, '2017-07-04')
```

### SQL構文

上記のデータからLastUpdated順に、Priceの合計が10を超えるまで表示するには以下のSQLクエリを使う。

```sql
WITH q AS (
    SELECT *, SUM(Price) OVER (ORDER BY LastUpdated) AS TotalPrice
    FROM Items
)
SELECT * FROM q
WHERE TotalPrice <= 10
ORDER BY LastUpdated
```

### 複数テーブルでもOK

上記のサンプルは正規化されてないテーブルだったが、より実用的に正規化されたテーブルを使って同じことをする。さらにWHERE句も追加し、ある条件に合致するエントリ(InStockが1のもの)だけを取り出す。

```sql
create table Items
(
    ID int NOT NULL primary key clustered,
    Name nvarchar(255) not null
)
GO

create table Prices
(
    ItemId int FOREIGN KEY REFERENCES Items(ID),
    Price int not null,
    InStock BIT not null,
    LastUpdated datetime2(7) not null
)
GO
```

### サンプルデータ

```sql
insert into Items (ID, Name) values
    (1, 'Tomato'),
    (2, 'Banana'),
    (3, 'Apple'),
    (4, 'Potato'),
    (5, 'Orange'),
    (6, 'Broccoli')
GO

insert into Prices (ItemId, Price, InStock, LastUpdated) values
    (1, 5, 1, '2017-06-01'),
    (2, 4, 0, '2017-05-30'),
    (3, 3, 0, '2017-07-05'),
    (4, 3, 1, '2017-04-01'),
    (5, 5, 1, '2017-07-01'),
    (6, 4, 1, '2017-07-04')
GO
```

### SQL構文
```sql
WITH q AS (
  SELECT SUM(P.Price) OVER (ORDER BY P.LastUpdated) AS TotalPrice
      ,I.*
      ,P.*
  FROM Items AS I
  JOIN Prices AS P ON I.ID = P.ItemId
  WHERE P.InStock = 1
)
SELECT * FROM q
WHERE TotalPrice <= 10
ORDER BY LastUpdated
```

IFとか変数とかカーソルとか一切不要。

### おまけ
上記の例のExecution Planを見るとPriceテーブルに対してテーブルスキャンがかかっている。なのでインデックスを追加する。

```sql
create nonclustered index ix_price_lastupdated on Prices (LastUpdated)
```

これでテーブルスキャンがインデックススキャンに置き換わった。
bogoで表示中の言語ごとに別のテンプレートを使う

見出しテキスト程度であれば言語ファイルを使ったりbogoのウィジェットが使えるようですが、コーポレートサイト案件等でそもそも日英でコンテンツ内容自体かわかる場合などに`get_locale()`での振り分けを都度都度入れていくとメンテナンスが残念になりそうなのでテンプレートごと変更する方法。

英語の時だけ_enというpostfixのついたテンプレートファイルを探し、存在する場合はそっちを使うコード。

```functions.php
function select_locale_template($template){
	if(get_locale() == 'en_US'){
		$locale_template = dirname( __FILE__ ) . '/' . basename($template, '.php') . '_en.php';
		if(file_exists($locale_template)){
			$template = $locale_template;
		}
	}
	return $template;
}
add_filter('index_template', 'select_locale_template');
add_filter('404_template', 'select_locale_template');
add_filter('archive_template', 'select_locale_template');
add_filter('author_template', 'select_locale_template');
add_filter('category_template', 'select_locale_template');
add_filter('tag_template', 'select_locale_template');
add_filter('taxonomy_template', 'select_locale_template');
add_filter('date_template', 'select_locale_template');
add_filter('home_template', 'select_locale_template');
add_filter('front_page_template', 'select_locale_template');
add_filter('page_template', 'select_locale_template');
add_filter('paged_template', 'select_locale_template');
add_filter('search_template', 'select_locale_template');
add_filter('single_template', 'select_locale_template');
add_filter('text_template', 'select_locale_template');
add_filter('plain_template', 'select_locale_template');
add_filter('text_plain_template', 'select_locale_template');
add_filter('attachment_template', 'select_locale_template');
add_filter('comments_popup', 'select_locale_template');
add_filter('home_template', 'select_locale_template');
```

ずらっと並んだadd_filterは階層のフィルターとのことで必要なもののみで問題ないかと思います、詳細は以下。
> WordPress テンプレートシステムでは階層にフィルターを適用できます。get_query_template() /en 関数内にあるフィルターはファイル名 "{\$type}_template" です。このとき $type は階層内の拡張子 .php なしのファイル名。
[テンプレート階層 - WordPress Codex 日本語版 ](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%9A%8E%E5%B1%A4#.E9.9A.8E.E5.B1.A4.E3.81.AE.E3.83.95.E3.82.A3.E3.83.AB.E3.82.BF.E3.83.BC)

カスタム投稿の場合の対応については未着手。

そもそも[ファイル:wp-template-hierarchy.jpg](https://wpdocs.osdn.jp/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:wp-template-hierarchy.jpg)で振り分けできても良さそうなんですが見つかりませんでした。
あと別途ページテンプレートとして_en.phpというファイルを作ったりしてしまうと動かないような気がしなくもないですが試していません。
Angular をやるのに欠かせない VSCode Extension

- 2017/07/11(Tue) 時点の情報に基づいています

Angular をやるのに Visual Studio Code (以降 VSCode) は相性ばっちりで、デフォルト設定でもほぼストレスなくプログラミングできるのが素晴らしいですが、以下の VSCode Extension をインストールすれば、さらに効率アップが図れます。

# Angular Language Service
https://marketplace.visualstudio.com/items?itemName=Angular.ng-template

Angular 本家が開発している Extension で template に対してプロパティ補完をしてくれる強力な Extension です。存在しないプロパティを指定すればエラーチェックがかかって教えてくれます。

# Path Intellisense
https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense

ファイルパスを補完してくれる Extension です。例えば Component の templateUrl や styleUrls に外部の HTML ファイルや CSS/SCSS ファイルのファイルパスを記述する際に `./` までタイプすればすぐに候補が表示され入力の手間が省けます。

この Extension 自体は Angular に限った話ではなく、`<script src="">` や `<link href="">`, `<img src="">` などファイルパスを入力する様々な個所で使用することができます。

# Angular 2 TypeScript Emmet
https://marketplace.visualstudio.com/items?itemName=jakethashi.vscode-angular2-emmet

通常 Component でインライン template を記述する際 Emmet が効きません。この Extension を使えば template の中でも Emmet の恩恵を受けることができるようになります。

# angular2-inline
https://marketplace.visualstudio.com/items?itemName=natewallace.angular2-inline

通常 Component でインライン template を記述した際、全て文字列のため HTML タグや CSS クラスのハイライトが行われません。この Extension をインストールすると、template 内を通常の HTML ファイルのようにハイライト表示させることができるようになります。

- - -
これらの VSCode Extension をインストールして快適な Angular ライフを！

他にも便利 Extension をご存知の方ぜひ教えてください！

- - -
# 追記
[Angular入門者向けLT会 #4](https://ngjapan.connpass.com/event/58507/) で LT してきました。

全部入りが欲しい人は [Angular Essentials](http://slides.com/tkiryu/essential-vscode-extensions-for-angular) を入れましょう。

# 2018-05-25追記

## Angular Switch
https://marketplace.visualstudio.com/items?itemName=shinriyo.ionic-switch
.html <-> .ts をショートカットで切り替えてくれます。頻繁に切り替える方はぜひ。
@shinriyo@github さんの自作 Extension だそうです。ご紹介ありがとうございます。
https://qiita.com/shinriyo@github/items/e87888a3e99050e30f49

## Angular Files
https://marketplace.visualstudio.com/items?itemName=alexiv.vscode-angular2-files
右クリックで `Angular CLI`　の `generate` コマンドが使えるようになります。これを探していた気がします。
Google Cloud Functionsについて初心者視点で調べてみた

公式URL
https://cloud.google.com/functions/?hl=ja

## ざっくりどんなものか
* サーバーレスと呼ばれるもの
* クラウド上で、関数を呼び出したときのみ起動され、処理が終われば停止する
* 処理停止時には料金が発生しない
* 一定回数まで無料利用枠有り
    * ファイル置き場として使われるGoogle Cloud Storageも、一応無料枠有り（参考:
 [Google Cloud Platform の無料階層](https://cloud.google.com/free/?hl=ja)）
* 起動しっぱなしのサーバーに比べて、処理が遅い（参考: [Serverless環境は600倍以上遅い？](http://qiita.com/kotauchisunsun/items/54cba63de9d464a9a036)）
    * 常時アクセスされるサーバーでは低コスパっぽい？
* スケールが容易
    * デフォルトでオートスケーリングに対応（参考: [【翻訳記事】Google Cloud Functions 対 AWS...](http://qiita.com/bump_of_kiharu/items/355a73412445c5ff59a0)）
* β版ではNode.jsのみサポート
    * 頑張ればpython実行可能そう（参考: [Google Cloud FunctionsでPythonを使ってみる](http://qiita.com/hayatoy/items/67406fb1b30db0d21c12)）


## 他に覚える必要があるもの
クイックスタートによると
https://cloud.google.com/functions/docs/quickstart

###### 以下が必要
* Google Cloud Platform (言わずもがな)
* Google Cloud SDK
    * ローカル上で関数を作成したり、デプロイしたりするものらしい
    * 取り合えず簡単に試してみるなら不要だった
* Google Cloud Storage (このストレージ上に保存されるので理解必要）
    * 公式URL https://cloud.google.com/storage/?hl=ja
    * 複雑に見える料金設定（参考: [Google Cloud Storage の料金体系](https://cloud.google.com/storage/pricing?hl=ja)）
    * バケットという独自概念（参考: [バケット](https://cloud.google.com/storage/docs/key-terms?hl=ja#buckets)）


## 取り合えず動かせたところまでメモ
1. Google Cloud Platformにアクセス
2. 新規プロジェクト作成
3. Google Cloud Storage をプロジェクトに追加
    4. バケットを作成
    4. 無料枠が良いならUSリージョンで
3. Cloud Functions をプロジェクトに追加
4. 関数を作成
    5. トリガー: HTTPトリガー
    6. ソースコード: インラインエディタ（デフォルトのコードのまま）
    7. ステージバケット: 3で作成したバケット指定
8. デプロイ
9. トリガ用の指定されたURLにてアクセス(index.jsで指定したrequest bodyメッセージを送信)
10. 無事レスポンスが返る


## 今後の課題
* ローカルでのエミュレート
* レポジトリからソースコードをアップロードする方法検討
* 攻撃対策
LaradockでMySQL5.5を使う(Docker + Laravel)

## 環境
* macOS Sierra
* Docker 17.06.0-ce-mac18
* Apache 2.4
* CentOS 7.0
* MySQL 5.5
* Laravel 5.0

## 前提条件
Lardockの基本的な導入手順を踏み、`docker-compose up -d`コマンドで**コンテナを起動する直前まで**の工程が終了していること

すでに起動してしまっている場合、Laradockで使用するMySQLのコンテナとイメージを一度削除してください。

コンテナを停止、ネットワークとともに削除するコマンドは下記のとおりです。

```
$ docker-compose down
```

イメージは削除されないので、

```
$ docker ls -a
```
で全てのイメージを表示し、laradockを導入してビルドしたMySQLのイメージを削除します。
laradock_mysqlとmysql 5.7があります。

## 導入手順
### Dockerfileを書き換える

laradock/mysql配下のDockerfileを書き換え、DockerHubからpullしてくるMySQLイメージのバージョンを変更します。

```diff

-  FROM mysql:5.7
+  FROM mysql:5.5
```

これだけです。

### イメージをbuildしてコンテナを起動する

`docker-compose up` コマンドでlaradock/mysql/配下のDockerfileからMySQLのイメージをbuildし、コンテナを起動します。

オプションに-dをつけて実行すると、コンテナをバックグラウンドで起動し(デタッチドモード)、実行したままにできます。

また、今回はMySQLののみイメージをビルドするように指定します。

```
$ docker-compose up -d mysql
```
5.5-fpmのタグがついたphpのイメージと、それをもとにしたlaradock_php-fpmというイメージがビルドされていることを確認します。

```
$ docker image ls

laradock_mysql       latest              6104906b149d        31 hours ago        256MB

mysql                5.5                 17e9a1fe381e        2 weeks ago         256MB
```
laradock_mysql コンテナ内のPHPのバージョンが5.5になっていることを確認します。

オプションで--rmをつけると、対象のコンテナを実行後に削除してくれます。停止しているコンテナに入ることなくバージョン確認などができるので便利です。

コンテナがデタッチドモードで起動されている場合は無視されるので、--rmオプションはなくても同じ挙動になります。

```
$ docker-compose run --rm mysql mysql --version 

mysql  Ver 14.14 Distrib 5.5.56, for linux-glibc2.5 (x86_64) using readline 5.1
```
### Laradock Tips
デフォルトではストレージシステムのファイル群が~/.laradock/dataになっているので、ローカル環境のlaradockディレクトリ内に同期しておくと便利です。

```
$ cd laradock

$ mkdir .laradock/data

$ docker-compose up -d // コンテナ内のファイルがローカル環境に同期される
```
東芝の画像認識チップ　Visconti はどうなる

東芝のメモリ事業の売却が連日のニュースになっている。

東芝について言えば、次のプロセッサについて関心を持っている。画像認識に特化したCPUだからだ。複数のカメラでのオブジェクト検出を同時にこなしたり、撮影した画像の見え方をリアルタイムで変換する機能を持っている。「東芝レビュー」などで調べてみると情報が得られます。

### 東芝レビュー

pdf [画像認識プロセッサVisconti4による車両周辺の高精度認識技術](https://www.toshiba.co.jp/tech/review/2016/02/71_02pdf/a03.pdf)


pdf [画像新式機能を搭載した小型車載カメラモジュール](https://www.toshiba.co.jp/tech/review/2016/02/71_02pdf/a04.pdf)


### HotChips というカンファレンスでも発表されています。
pdf [Visconti2 - A Heterogeneous Multi-Core SoC for ImageRecognition Applications]
(https://www.hotchips.org/wp-content/uploads/hc_archives/hc24/HC24-4-Multimedia-Imaging/HC24.28.425-Visconti2-Uchiyama-Toshiba.pdf)



> １１年に投入した「ビスコンティ２」は、デンソーの前方監視カメラシステムに採用された。(2015年10月29日)
http://newswitch.jp/p/2497


車載向け画像認識用プロセッサ「Visconti™4」の発売について
http://toshiba.semicon-storage.com/jp/product/automotive/image-recognition/tmpv7608.html

車載向け画像認識用プロセッサ「ViscontiTM2」がデンソーの前方監視カメラシステムに採用
https://www.toshiba.co.jp/about/press/2015_10/pr_j0602.htm

[画像認識プロセッサ Visconti™ ソフトウエア開発環境](https://toshiba.semicon-storage.com/jp/product/automotive/image-recognition/software.html)


###  Youtube
YouTube [東芝画像認識プロセッサVisconti™ ～2017車載篇](https://www.youtube.com/watch?v=oNQONUVAtug)

YouTube [東芝画像認識プロセッサVisconti™ ～2017スマコミ篇](https://www.youtube.com/watch?v=IfvNA1cysZU)

YouTube [Toshiba Visconti™ for ADAS Applications in 2017](https://www.youtube.com/watch?v=wLYO7obv19o)


### ハードウェアの特徴
- 画像処理アクセラレータの存在
    - アフィン変換
    - ピラミッド
    - フィルタ
    - Enhanced CoHOG
    - マッチング
    - HOG
    - ヒストグラム
    - SfM
 

### ソフトウェアユーザーの多くは次のようなハードウェアに慣れています。

- OpenCVがそのまま使える。
- OpenMP やGPUのような並列計算の枠組みを期待している。
- Deep Learning などで既存の枠組みが使えること。

そのような中で、Viscontiは苦戦を強いられるのではないかと思えます。

しかし、実行時のOSが通常のLinuxとはだいぶ異なるらしい。ハードウェアによる演算性能の向上部分が、GPUのような汎用的なアプローチになっていないという点である。
そのために、どれだけ開発案件が進むのかが気になるところです。

Viscontiがユーザーを獲得するには、ソフトウェア技術者に対してどれだけ魅力のあるボードと開発環境とを提供できるかにかかっていると私は思います。
Rustに挑戦！新しいプログラミング言語を学ぶ15のエクササイズを解いてみた

世の中には、Prashant N Mhatreさんによる、[15 Exercises for learning new programming languages](http://www.articlecity.com/articles/computers_and_internet/article_2686.shtml)というものがあるようです。邦訳すると、新しいプログラミング言語を学ぶための15のエクササイズ。この記事ではこれを解いていきます。

## Rustに挑戦してみることにしました

最近注目度の高いRustにちょうど挑戦したかったので、このエクササイズにRustでチャレンジします。

## 第一回

> Display series of numbers (1,2,3,4, 5....etc) in an infinite loop. The program should quit if someone hits a specific key (Say ESCAPE key).

## 解答例

さっそく私の解答から出しますと、こんな感じになりました。今回はxをエスケープ用のキーとしています。

```rust:main.rs
extern crate getch;

use getch::Getch;
use std::sync::mpsc::channel;
use std::thread::spawn;
use std::result::Result;
use std::io::Error;

fn main() {
    println!("If you want to stop, please press x key!");
    let (sender, receiver) = channel();

    spawn(move || {
        loop{
            let g: Result<Getch, Error> = Getch::new();
            let key: Result<u8, Error> = Getch::getch(&g.ok().unwrap());
            const KEY_X: u8 = 120;

            let input_key = key.ok().unwrap();
            if input_key == KEY_X {
                sender.send(true).unwrap();
                break;
            }
        }
    });
    let mut i = 0;
    loop {
        println!("{}", i);
        i = i + 1;
        if receiver.try_recv().ok() != None {
            break;
        }
    }
}
```

## 解説

### インポート文
```rust:import.rs
extern crate getch;

use getch::Getch;
use std::sync::mpsc::channel;
use std::thread::spawn;
use std::result::Result;
use std::io::Error;
```
長い。

もう少しスマートな書き方があるのではないかと調べているけれど見つからず、と言った感じです。

今回は、keyが押されたかどうかを知るためにGetchを利用しました。

### チャネル定義

```rust:channel.rs
    println!("If you want to stop, please press x key!");
    let (sender, receiver) = channel();
```

一文目は普通のprintlnです。止めたかったらxボタン押してねと。

二文目は、スレッド間で通信するためのチャネルを定義しています。結構雑な理解なので私は説明できる水準ではありません。

### ループ部分１：キー入力を受け取る
```rust:loop1.rs
    spawn(move || {
        loop{
            let g: Result<Getch, Error> = Getch::new();
            let key: Result<u8, Error> = Getch::getch(&g.ok().unwrap());
            const KEY_X: u8 = 120;

            let input_key = key.ok().unwrap();
            if input_key == KEY_X {
                sender.send(true).unwrap();
                break;
            }
        }
    });
```
spawnやらmoveやらでスレッドを立てています。

Getchの処理は非常に苦労したのですが、とりあえずこれで動きます。（ベストプラクティスからは程遠いです）
Rustでは、Result型というものがあり、これがなかなか面倒くさいです。

条件を満たしたら、sender.sendでtrueを送信

### ループ２

```rust:loop2.rs
    let mut i = 0;
    loop {
        println!("{}", i);
        i = i + 1;
        if receiver.try_recv().ok() != None {
            break;
        }
    }
```
普通にループしているだけですね。先ほどのsenderから送られた信号を受信したらループをbreakします。

## まとめ

* Rustはとても楽しい
* Result型難しい
* インポート文を簡潔にする方法がよくわからない。

以上！
AmazonLinuxでpumaの自動起動設定を行う


[AmazonLinuxにNginxとRailsをインストールして80番ポートからrailsに繋げる](http://qiita.com/kyo_nanba/items/ebe1ca322c2bb1406be8)でnginxとrailsを立ち上げたのですが、nginxは自動起動設定したもののpumaは自動で起動しないので、サーバが再起動した場合にrailsアプリケーションが立ち上がりません。

今回はpumaの自動起動設定を行います。

## `/etc/init.d/puma` の作成

以下の内容で`/etc/init.d/puma`に実行ファイルを作成しました。NAMEやAPP_PATHは適宜自分の環境に合わせて変更してください。

```
#!/bin/bash
#
# railsapp

# chkconfig: 2345 82 55
# processname: railsapp
# description: Runs railsapp for nginx integration.

# Include RedHat function library
. /etc/rc.d/init.d/functions

# The name of the service
NAME=railsapp

# The username and path to the myapp source
USER=webapp
APP_PATH=/home/$USER/$NAME

# The PID and LOCK files used by puma and sidekiq
UPID=$APP_PATH/tmp/pids/puma.pid
ULOCK=/var/lock/subsys/$NAME

# The options to use when running puma
#OPTS="-F $APP_PATH/config/puma.rb"

# Ruby related path update
RUBY_PATH_PATCH="PATH=$PATH:/usr/local/bin:/usr/local/lib && export PATH && "
BUNDLE_CMD=bundle
PUMA_CMD=pumactl
. /etc/profile.d/rbenv.sh

start() {
  cd $APP_PATH
  # Start puma
  echo -n $"Starting $NAME: "
  daemon --pidfile=$UPID --user=$USER $BUNDLE_CMD exec $PUMA_CMD $OPTS start
  puma=$?
  [ $puma -eq 0 ] && touch $ULOCK
  echo

  return $puma
}

stop() {
  cd $APP_PATH

  # Stop puma
  echo -n $"Stopping $NAME: "
  killproc -p $UPID
  puma=$?
  [ $puma -eq 0 ] && rm -f $ULOCK
  echo

  return $puma
}

restart() {
  stop
  start
}

get_status() {
  status -p $UPID $NAME
}

query_status() {
  get_status >/dev/null 2>&1
}

case "$1" in
  start)
    query_status && exit 0
    start
    ;;
  stop)
    query_status || exit 0
    stop
    ;;
  restart)
    restart
    ;;
  status)
    get_status
    exit $?
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|status}" >&2
    exit 1
    ;;
esac

exit 0
```

作成し終わったら実行権限を付与しておきます。

```
$ ls -l /etc/init.d/puma
-rw-r--r-- 1 root root 1359 Jul  5 10:51 /etc/init.d/puma
$ sudo chmod +x /etc/init.d/puma
$ ls -l /etc/init.d/puma
-rwxr-xr-x 1 root root 1359 Jul  5 10:51 /etc/init.d/puma
```

## 自動起動設定

まずinitスクリプトを使ってpumaが起動することを確認しておきます。

```
$ sudo /etc/init.d/puma start
Starting railsapp: Puma starting in single mode...
* Version 3.9.1 (ruby 2.4.1-p111), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Daemonizing...
                                                           [  OK  ]
```

起動したようなので `chkconfig` でシステム起動時に起動するようにしておきます。

```
$ sudo chkconfig puma on
$ sudo chkconfig | grep puma
puma           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

これで再起動してpumaが起動してたら完了です。

## 参考

- [CentOSでrbenv + Rails4 + puma + Nginxを使う - Qiita](http://qiita.com/takakiku/items/cb173520aba2099de19b)
- [CentOS6.4でRuby2.0+Rails4+pumaデーモン+Nginx - Qiita](http://qiita.com/haracane/items/a7821e5f8707db28595b)
Windows標準機能でファイルハッシュ値を調べる

# 目的
何番煎じかは分かりませんが…
一昔前はWindows(XPの頃)でファイルハッシュ値を調べるのに何かしらフリーソフトが必要でした。で、今もそうなのかどうか、ふと調べてみたらいつの間にか出来るようになってました。そこで自分の備忘のため。

# 実際のコマンド
```bat
CertUtil -hashfile <ファイル名> <ハッシュアルゴリズム>
```
<ハッシュアルゴリズム>には、
`MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512`
が使えます。

# おまけ：いつからこのコマンドは存在するか
下記の通り調べてみました。(コマンドラインでそのままヘルプを表示させただけ)
* Windows 10：存在を確認
* Windows 8：未確認(7が使えるので多分使える)
* Windows 7：存在を確認(~~どのアルゴリズムが使えるかは不明~~Win10と同じものが使える)
* Windows Vista：未確認
* Windows XP：存在しない

# 参考文献
【windowsでcertutilと叩くと】ハッシュ値の確認―実践編(Windows#2)【実は簡単】
http://tech.pjin.jp/blog/2016/02/09/security_tips_hash_4/
Unityでキャラのステータスのクラスを関連付けて記憶する

UnityのMonoBehaviourを継承したクラスでは、publicで各種変数を設定すれば、Inspectorから編集・保存できるので様々な初期状態や途中状態の保存に有効なのは基本的なお話。

でもこの変数には独自のクラスを設定できない。
例えば以下のような画面に表示するユニット(Unit)のステータスのクラスである基底クラスUnitDataを作って、ユニット個別に特化したクラスを作っている。

``` C#:UnitData.cs
// 略
public abstract class UnitData
{
    public string UnitName { get; protected set; } 
    public string SpriteName { get; protected set; }
    // Ability
    public int Strength { get; protected set; }
    public int Constitution { get; protected set; }
    public int Intelligent { get; protected set; }
    public int Wisdom { get; protected set; }
    public int Quickness { get; protected set; }
    public int Precision { get; protected set; }
    public int Social { get; protected set; }
    // コンストラクタ
    public UnitData() {
        Init();
    }
    //
    public abstract void Init();
}
public class ElfsanUnitData : UnitData
{
    public override void Init() {
        UnitName = "elfsan";
        SpriteName = "elfsan";
        //
        Strength = 80;
        Constitution = 85;
        Intelligent = 120;
        Wisdom = 110;
        Quickness = 100;
        Precision = 100;
        Social = 100;
    }
}
```

これをUnitに関連付ける。
早い話が、UnitDataクラスのtypeをstringで取り出して記憶してしまおうというアプローチ。
UnitData -> string はGetTypeで。
string -> UnitData はActivator.CreateInstanceとType.GetTypeで。

``` C#:Unit.cs
public class Unit : MonoBehaviour {
    public string UnitType;
    public UnitData UnitData { get; private set; } 
    //
    void Start () {
        // インスタンス化して初期化関数に入力する
        SetUnitData((UnitData)Activator.CreateInstance(Type.GetType(UnitType)));
    }
    //
    public void SetUnitData(UnitData data) {
        UnitData = data;
        UnitType = data.GetType().ToString();
        // もろもろ初期化処理
    }
}
```

これの長所は、EditorからSetUnitDataを呼んでもOKなところ。
つまり、ある状態に持っていくために外部から設定できるし、かつそれが記憶される。

なお、シリアライズするとか他の方法も考えられるが、今は実装がらくちんなこれでとりあえずOKってことで。
Spark streaming でファイル名を取得する

Spark streaming で取得するファイルの名前をデバッグ用と思われるメソッドを使用して、やや強引に？取得してみます。

### StreamingContext の生成
```java:StreamingGetFileName.java
// create StreamingContext
SparkConf conf = new SparkConf().setAppName("StreamingGetFileName");
JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(10));
```
とりあえず、対象ディレクトリをチェックする間隔を 10 秒にしています。

### JavaDStream(RDDのまとまり) の取得
```java:StreamingGetFileName.java
// create DStream from text file
String logDir = "/tmp/logs";
JavaDStream<String> logData = jssc.textFileStream(logDir);
```
ストリーミングで取得するファイルが格納されるディレクトリを指定します。

### ファイル名の取得
```java:StreamingGetFileName.java
// try to get file name		
logData.foreachRDD(rdd -> {
    Pattern p = Pattern.compile("file:.*?\\s+");
    Matcher m = p.matcher(rdd.toDebugString());
    if (m.find()){
        System.out.println(m.group());
    }
    return null;
});
```
toDebugString() は↓みたいな文字列を返してくれるので、適当に必要な文字列だけを取り出しています。
file:/tmp/logs/20170707000324 NewHadoopRDD[0] at textFileStream at StreamingGetFileName.java:24

### 結果
こんな感じで取得することが出来ました。

```shell-session:result
file:/tmp/logs/20170710235536 
file:/tmp/logs/20170710235546 
file:/tmp/logs/20170710235556 
file:/tmp/logs/20170710235606 
file:/tmp/logs/20170710235616
```

[ソース](https://github.com/blueskyarea/spark-streaming/blob/master/src/main/java/com/blueskyarea/StreamingGetFileName.java)
【WPF】ListBoxのItemの幅がListBoxの幅にならない件について

# 本記事のについて

　WPF初心者が~~必ず~~疑問に思い調べるであろうListBoxのItemの幅をきっちりあわせる方法について書いていこうと思います。

# HorizontalContentAlignment
>取得またはコントロールの内容の水平方向の配置を設定します。(MSDN)

 答えを先に書くと

```
  <ListBox
       HorizontalContentAlignment="Stretch"
       VerticalContentAlignment="Stretch"/>
```

と書くと自動的にItemの幅をきっちりと合わせてくれます。

button等のコントロールの場合はVerticalContentAlignmentは設定する必要はないです。


# VerticalContentAlignment
>取得またはコントロールの内容の垂直方向の配置を設定します。(MSDN)

画像やBindingした情報等の幅を設定するにはこちらを設定しなければなりません。


# メンバー一覧

| メンバー名      |       説明 |  
|:-----------------:|:------------------|
|Fill         |         	割り当てられた広さを埋めるようにコンテンツのサイズを変更します。 縦横比は維持されません。| 
| None          |    コンテンツの現在のサイズを維持します。 | 
|Uniform        |割り当てられた広さに収まるようにコンテンツのサイズを変更しますが、元の縦横比が維持されます。| 
|UniformToFill             |  割り当てられた広さを埋めるようにコンテンツのサイズを変更しますが、元の縦横比が維持されます。 ソース コンテンツの縦横比が対象の四角形の縦横比と異なる場合は、ソース コンテンツが対象の四角形に収まるように切り取られます。|


# まとめ

ListBoxのItemの幅をListBoxの幅にしようと思ったらHorizontalContentAlignmentとVerticalContentAlignmentをStretchにすれば解決します。できない場合は何かwidthやHeigthを設定している可能性があります。


#参考

- [Stretch 列挙型](https://msdn.microsoft.com/ja-jp/library/system.windows.media.stretch(v=vs.110).aspx)
- [ListBox 内 StackPanel の幅を Stretch する](http://d.hatena.ne.jp/yotukat/20130407/1365316413)
Firefox の使い方

当たり前の使い方を毎回調べるので、まとめておくことにしました。
※. [Internet Explorer 11 の使い方はこちら](http://qiita.com/ponsuke0531/items/0551a7528da3b8cb376e)

**環境**

- OS : Windows10

# HTMLのタグをまるっと削除する方法
- [ブラウザの開発ツールでHTMLのタグをまるっと削除する方法](https://qiita.com/ponsuke0531/items/8e1be502e9c016c6280a)

# 印刷プレビューの表示方法
1. Altキーを押下するとメニューが上部に表示されます。<img width="384" alt="WS000003.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/8b86419f-db04-455d-a83b-e48ecb0b17db.jpeg">
2. [ファイル] > [印刷プレビュー]を押下します。<img width="210" alt="WS000004.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/5e06db71-ee40-0351-f625-30d3e4a1a9fe.jpeg">

# 背景と色とイメージを印刷する方法
1. 印刷プレビュー画面の[ページ設定]ボタンを押下します。<img width="263" alt="WS000005.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/dadef5d2-86ac-4276-106d-ea0b79ed1777.jpeg">
2. [背景色と背景画像も印刷]をONにして[OK]ボタンを押下します。<img width="271" alt="WS000006.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/715167f0-fdb2-323b-03c4-e403ffa449a6.jpeg">

# ブラウザのスタイルを表示する方法
1. 開発ツールの歯車マークを押下します。
2. [調査]にある[ブラウザのCSSを表示]をONにします。<img width="340" alt="WS000003.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/3dcdcb37-22da-2ccb-bb4b-864eb576105f.jpeg">
<img width="312" alt="WS000004.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/b27ac701-3a4c-23e5-3536-7a949e3acf77.jpeg">

# 印刷用のCSS(@media print)で表示する方法
1. Shft + F2 キーで開発ツールバー(画面の下に表示されます)を表示します。
2. 'media emulate print'を入力してEnterキーを押下します。<img width="304" alt="WS000005.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/bbbdfe05-5cf1-d69b-d7ac-1dedcb6e3eee.jpeg">

- [印刷用CSS（@media print）を確認・デバッグする方法 | 編集長ブログ―安田英久 | Web担当者Forum](http://web-tan.forum.impressrd.jp/e/2015/07/28/20508)
CakePHP 3.4.10リリースされました

CakePHPの最新バージョンをもっとよく知るためにリリースノートの翻訳と関連のPRを紹介しています。

## 本家リリース

twitter: https://twitter.com/cakephp/status/884309677814820864
release: https://bakery.cakephp.org/2017/07/09/cakephp_3410_released.html
githug: https://github.com/cakephp/cakephp/releases/tag/3.4.10

## リリース内容 

CakePHP開発チームは、CakePHP 3.4.10 を発表しました。今回のリリースは、いくつかのコミュニティ報告された問題を修正する3.4ブランチのメンテナンスリリースです。


- セッションが、trans_sidが有効な状態で動作するようになりました。[#10828](https://github.com/cakephp/cakephp/pull/10828)
- Xdebugでクエリを調べても、lastInsertId（）は不正な結果を返さなくなりました。
- 電子メールアドレスの無効な場合のバリデーションエラーメッセージがより役立つものに改善しました。[#10856](https://github.com/cakephp/cakephp/pull/10856)
- `FormHelper`は、ArrayAccess実装するエンティティプロパティから値を読み取ることができるようになりました。[#10859](https://github.com/cakephp/cakephp/pull/10859)
- `ConsoleIo::overwrite（）`は長いコンテンツを短いコンテンツで正しく上書きできるようになりました。[#10860](https://github.com/cakephp/cakephp/pull/10860)
- PHP 7.2のいくつかの互換性の問題が修正されました。[#10864](https://github.com/cakephp/cakephp/pull/10864), [#10878](https://github.com/cakephp/cakephp/pull/10878)
- ダイジェスト認証で、フィールドがエンティティ内に隠れている場合でもダイジェストハッシュを比較できるようになりました。[#10867](https://github.com/cakephp/cakephp/pull/10867)
- `beforeFind`イベントに含まれるアソシエーションは、複製されたクエリで保持されるようになりました。[#10868](https://github.com/cakephp/cakephp/pull/10868)
- `MoFileParser`が`Plural-Formsの：nplurals = 1;複数= 0;`を正しく扱うようになりました[#10872](https://github.com/cakephp/cakephp/pull/10872)
- `Http\Client`は`Stream adapter`の代わりにリダイレクトを扱うようになりました。これにより、仲介応答で送信されたCookieが後続の要求で転送されないという問題が解決されます。[#10876](https://github.com/cakephp/cakephp/pull/10876)
- バリデーションパッケージは、`cakephp/i18n`に対する依存性がなくなりました。[#10884](https://github.com/cakephp/cakephp/pull/10884)
Lua のパターンマッチングの文字クラスは何を表しているのか


Lua のパターンマッチングの文字クラスが具体的に何を指してるのか、マニュアルに記載されてないおかげか、はたまた、脳に Stop-The-World を起こさせるジメジメした暑さのおかげかなのか、調べては忘れ調べてはまた忘れなんて事を毎度毎度繰り返してるので、いい加減まとめておこうと思ったのでメモ。


> [Lua 5.1 Reference Manual - 5.4.1 Patterns](https://www.lua.org/manual/5.1/manual.html#5.4.1)
>
> - %a: represents all letters.
> - %c: represents all control characters.
> - %d: represents all digits.
> - %l: represents all lowercase letters.
> - %p: represents all punctuation characters.
> - %s: represents all space characters.
> - %u: represents all uppercase letters.
> - %w: represents all alphanumeric characters.
> - %x: represents all hexadecimal digits.

マニュアルに書いてない事はググるよりソースにあたる方が良いので、ソースあさると [lstrlib.c](https://github.com/lua/lua/blob/98194db4295726069137d13b8d24fca8cbf892b6/lstrlib.c#L225) にそれっぽい箇所を発見。

```c:lstrlib.c
static int match_class (int c, int cl) {
  int res;
  switch (tolower(cl)) {
    case 'a' : res = isalpha(c); break;
    case 'c' : res = iscntrl(c); break;
    case 'd' : res = isdigit(c); break;
    case 'l' : res = islower(c); break;
    case 'p' : res = ispunct(c); break;
    case 's' : res = isspace(c); break;
    case 'u' : res = isupper(c); break;
    case 'w' : res = isalnum(c); break;
    case 'x' : res = isxdigit(c); break;
    case 'z' : res = (c == 0); break;
    default: return (cl == c);
  }
  return (islower(cl) ? res : !res);
}
```

コード内に明確に記載されているように標準Cライブラリ関数で実装されているので、具体的に指しているものは以下の文字集合になる；

- `%a`: `man isalpha` -> *A-Za-z*
- `%c`: `man iscntrl` -> *0x00-0x1F*
- `%d`: `man isdigit` -> *0-9*
- `%l`: `man islower` -> *a-z*
- `%p`: `man ispunct` -> *!"#$%&'()\*+,-./:;<=>?@[\\]^_`{|}~*
- `%s`: `man isspace` -> *\t\n\v\f\r* and *0x20:whitespace*
- `%u`: `man isupper` -> *A-Z*
- `%w`: `man isalnum` -> *A-Za-z0-9*
- `%x`: `man isxdigit` -> *0-9A-Fa-f*

ついでに、Lua 5.2 と 5.3 系を見ると文字クラス `%g` が追加されている。

> [Lua 5.2 Reference Manual - 6.4.1 – Patterns](https://www.lua.org/manual/5.2/manual.html#6.4.1)
>
> ---snip---
> - %g: represents all printable characters except space.

こちらも同様に調べて見ると [`case 'g' : res = isgraph(c); break;`](https://github.com/lua/lua/blob/78d986590060b615334ac214b6cc5b7d951b1d58/lstrlib.c#L260) てな感じで標準ライブラリ関数で実装されているので、具体的に指しているものは以下の文字集合になる。

- `%g`: `man isgraph` -> *0-9a-zA-Z* and *!"#$%&'()\*+,-./:;<=>?@[\\]^_`{|}~*


***


２年くらい前から「調べてメモっとこ。」なんて思いつつもコードから離れると瞬間的に忘れてく鳥頭なのでなかなか書けなかったのだけれど、Kobito の試用ついでに書いてみた。

やっぱりこう、メモ的な Tips をサクッと書いてアップできるツールってのは便利。でも、プレビュー画面が書いてる箇所にスクロールしてくれないので、エディタとしては VSCode の方が楽かなぁ。
ActionMailerを使ってメールを送信する


既に実装されていたメールの一部を別のメイラーに移す機会があったので、全体的に学び直した（主にRails Guide）ので備忘録的にメモ。
なお、メールを送るための設定はすでにされていたので割愛。

## ActionMailerの特徴
- ActionMailer::Baseを継承している
- app/mailersに配置される
- app/viewsにあるビューと結びつく

## メイラーの作成
コマンドでメイラーを作成する
`rails g`コマンドでメイラーに必要なファイルを作成する。

```bash
$ rails g mailer UserMailer
```


## メイラーの編集
メイラーを編集することで、送信するメールを設定できる。また、誰にメールを送るかや、メールの送信元のアドレス、メールの題も設定できる。

send_mailというメソッドでメールを送るようにしてみる。
使っているものは以下。

- default
	- ハッシュを渡すことができ、全メールで適用されるデフォルト値を決める。`:form`は送信元のメールアドレスを設定している。
- mail
	- メソッド内それぞれの設定。メールの題や誰に送るかを設定している。

インスタンス変数を定義することで、メールの文面内で使用できるようなる。

```ruby
class UserMailer < ApplicationMailer::Base
  default from: 'sender@mail.com'  # デフォルトの送信元のメールアドレス

  def send_mail(user)
    @user = user
    mail(to: @user.email, subject: 'メールのタイトル')
  end
end
```


## メイラービューを作成
app/views/user_mailer/ディレクトリでメソッド名と同じsend_mail.html.erbというファイルを作成する。
HTMLでフォーマットされたメールテンプレートになる。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1><%= @user.name %>様、example.comへようこそ。</h1>
      <p>
      example.comへのサインアップが成功しました。
      your username is: <%= @user.login %>.<br>
    </p>
    <p>ご入会ありがとうございます。どうぞお楽しみくださいませ。</p>
  </body>
</html>
```

HTMLフォーマットのメールを受け取らない人のために、テキストメールも作成しておく。
app/views/user_mailer/ディレクトリでsend_mail.text.erbというファイルを作成する。

```txt
<%= @user.name %>様、example.comへようこそ。
===============================================
 
example.comへのサインアップが成功しました。ユーザー名は「<%= @user.login %>」です。
 
本サイトにユーザー登録いただきありがとうございます。
```


## メイラーを呼び出す
コントローラやモデルなどからメイラーを呼び出す。

```ruby
UserMailer.send_mail(@user).deliver_later
```

ActionMailerはActive Jobと統合されているので、Webのリクエスト/レスポンスサイクルの外で非同期にメールを送信できる。

### メイラーの呼び出し
メイラーのメソッドはActionMailer::MessageDeliveryオブジェクトを返り値として返す。
ActionMailer::MessageDeliveryオブジェクトは、そのメール自身が送信対象であることをdeliver_nowやdeliver_laterに伝える。
ActionMailer::MessageDeliveryオブジェクトは、Mail::Messageをラップしている。
内部のMail::Messageオブジェクトの表示や変更を行いたい場合は、ActionMailler::MessageDeliveryオブジェクトのmessageメソッドにアクセスする。
[CodeIgniter]TOPページを設定する

#CodeIgniterはじめました。

とりあえず、Welcome.phpの出力に成功。ただし、参考にした資料はここまで。
ここから一応Webアプリとして動かせるようにしたいが、流石にTopページがWelcome.phpのままはイケてない。では、どうやって変えるんだろう。

#とりあえずGrep

```
C:\CI\CodeIgniter-3.0.6\application\config\routes.php(30,35)  [SJIS]: |	$route['default_controller'] = 'welcome';
C:\CI\CodeIgniter-3.0.6\application\config\routes.php(33,52)  [SJIS]: | URI contains no data. In the above example, the "welcome" class
C:\CI\CodeIgniter-3.0.6\application\config\routes.php(52,33)  [SJIS]: $route['default_controller'] = 'welcome';
C:\CI\CodeIgniter-3.0.6\application\controllers\Welcome.php(4,7)  [SJIS]: class Welcome extends CI_Controller {

・
・
・
362 個が検索されました。
```
$route['default_controller'] = 'welcome';
すごくそれっぽい。

#application\config\routes.php！貴様か！
正解かどうか、編集してみよう。

```php:application\config\routes.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/*
| -------------------------------------------------------------------------
| URI ROUTING
| -------------------------------------------------------------------------
| This file lets you re-map URI requests to specific controller functions.
|
**********************************コメント省略**********************************
| Examples:	my-controller/index	-> my_controller/index
|		my-controller/my-method	-> my_controller/my_method
*/
$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
```

'welcome'を'wel'に。Welcome.phpと同じディレクトリにWel.phpを設置。

```php:application/controllers/Wel.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Wel extends CI_Controller {

        public function index()
        {
                echo "AAAAAAAAAAAAAAAAAAA";
        }
}
```
#結果
想定通り！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185285/d1fd82dd-5ed2-c7cd-f4d2-e6469b8259d3.png)

これからもうちょっといじっていきます。
開いているActivityを一発で表示するコマンド

# コマンド
``` :command
$ adb shell dumpsys activity | grep mFocusedActivity | cut -d ' ' -f6 | rev | cut -d '.' -f1 | rev
```
注)追記のコマンドのほうがシンプルです。

# 解説
Chromeアプリで任意のページを開いている状態で検証

## Activityの情報を出力する
``` :command
$ adb shell dumpsys activity
```
``` :出力
なんかぐわーっていっぱい
```

## mFocusedActivityを含む行のみを取得する
``` :command
$adb shell dumpsys activity | grep mFocusedActivity
```

``` :出力
  mFocusedActivity: ActivityRecord{be4ff93 u0 com.android.chrome/org.chromium.chrome.browser.ChromeTabbedActivity t240}
```

## 半角スペース区切りでの六番目を取得
``` :command
$ adb shell dumpsys activityty | grep mFocusedActivity | cut -d ' ' -f6
```
``` :出力
com.android.chrome/org.chromium.chrome.browser.ChromeTabbedActivity
```

## ひっくり返す
一番うしろの文字列がほしい為、ひっくり返す

``` :command
$ adb shell dumpsys activity | grep mFocusedActivity | rev
```

``` :出力
ytivitcAdebbaTemorhC.resworb.emorhc.muimorhc.gro/emorhc.diordna.moc
```

## ピリオド区切りの先頭を取得
``` :command
$ adb shell dumpsys activity | grep mFocusedActivity | cut -d ' ' -f6 | rev | cut -d '.' -f1
```

``` :出力
ytivitcAdebbaTemorhC
```

## 再度ひっくり返す
``` :command
$ adb shell dumpsys activity | grep mFocusedActivity | cut -d ' ' -f6 | rev | cut -d '.' -f1 | rev
```

``` :出力
ChromeTabbedActivity
```

# 補足
一応どのアプリを見てもmFocusedActivityの六番目がActivity場所になっていたから、どのアプリでもAcitivityが取得できるはず・・・

# 追記
別の方法も教えて貰いました

``` :command
$ adb shell dumpsys activity | grep mFocusedActivity | awk -F ' ' '{print $4}' | awk -F '.' '{print $NF}'
```

こっちのがシンプルでおしゃれ！
WekanのREST APIを使ってみる

## Wekanについて
オープンソースのかんばんツールの1つです。
かんばんツールはいろいろありますが、
シンプルな機能なところがとても気に入っています。

## シンプルすぎてちょっと困ることも...
操作性とか気軽にカードを作れるところはすごく良いのですが
ユーザ管理や検索機能といったものがありません。
（そのうち追加されるかもしれませんが）

特に検索機能がないのは、使ってるメンバーには不便みたいです

## REST APIで作っちゃおう
V0.19以降からwekanにはREST APIが追加されていますので
これをうまく使えば、検索機能を作ることができます。

v0.27時点では、以下のAPIが実装されているようです
- ``/api/user`` 
- ``/api/users/:userid/boards``
- ``/api/boards``
- ``/api/boards/:boardid/lists``
- ``/api/boards/:boardid/lists/:listid/cards``
- ``/api/boards/:boardid/lists/:listid/cards/:cardid``

※他にもあるようですが、割愛します...

ちょっとハマったのが、認証についてです。

良く良く読むと
https://github.com/wekan/wekan/pull/1033

このページに
「Just add your token to your reauest header like Authorization: Bearer tokenid」
と書いてありますので、headerにAuthorization:Bearer (tokenid)を付けることで
うまく行きました

ちなみにtokenidの取り方も同じページに書いてありまして
POST ``/user/login``で取得できます。

```
{
  "username": "ユーザ名",
  "password": "パスワード"
}
```



同じことで困っている方がいましたら
ぜひ使ってみてください！
時間のかかっている処理を抜き出す

###時間のかかっている処理を抜き出す
デバッグで、ソースコードのなかで時間のかかっている処理を抜き出すってことありますよね。
時間がかかっているかどうかは、ある行と次の行のあいだの経過時間を調べればよいです。
それを、もとのソースコードには、極力書き足さずに実現したいです。
書き足さずにというのは、どうせその経過時間を計るコードは、すぐに消去することになるからです。消去するので、極力、短くてシンプルにしておきたい。

###こんなクラスを作りました。
それでこんなクラスを作りました。

フィールドで初期化して。
DebugUtilities.DebugTimeCounter logs = new DebugUtilities.DebugTimeCounter();

計測する行に、
logs.Add(linenumber);
と、書き足します。

####2017/08/11追記
oo2kazumaさんに、結果を文字列で返す方式、結果を０でパディング、アクセス修飾子の変更など、大幅に手を加えていただきました。ありがとうございました。

```C#
using System;
using System.Collections.Generic;
using System.Linq;

namespace DebugUtilities{
	/// <summary>
	/// usage  DebugUtilities.DebugTimeCounter logs = new DebugUtilities.DebugTimeCounter();
	///    logs.Add(linenumber);
	/// </summary>
    public class DebugTimeCounter
    {
        private static DateTime lastaccesstime = DateTime.Now;
        private static IList<DebugTimeCounterLog> Logs = new List<DebugTimeCounterLog>();
        private const string LOG_HEADER = "fff linenumber";
        private const string LOG_FORMAT = "{0:000} {1:00000}"; // ミリ秒３桁 linenumber５桁想定
        public void Add(int linenumber)
        {
            Add(linenumber, DateTime.Now);
        }
		public void Add(string line)
		{
			Add(0, DateTime.Now, line);
		}

		public void Add(int linenumber, DateTime logtime, string line = "")
		{
			var log = new DebugTimeCounterLog()
			{
				LineNumber = linenumber,
				LineContent = line,
				BetweenTimes = logtime - lastaccesstime
			};
			Logs.Add(log);
			lastaccesstime = logtime;
		}


        public void Clear()
        {
            Logs.Clear();
            lastaccesstime = DateTime.Now;
        }
        public string GetLog()
        {
            var log = new List<String>();
            log.Add(LOG_HEADER);
			log.AddRange(Logs.Select(ValidationConstraints => string.Format(LOG_FORMAT, ValidationConstraints.BetweenTimesFFF, ValidationConstraints.LineNumber, ValidationConstraints.LineContent)));
            return String.Join(Environment.NewLine,log.ToArray<string>()) ;
        }
    }

    public class DebugTimeCounterLog
    {
        public int LineNumber { get; set; }
        private TimeSpan betweenTimes;
        public TimeSpan BetweenTimes { get { return betweenTimes; } set { betweenTimes = value; } }
        public int BetweenTimesFFF { get { return betweenTimes.Milliseconds; } }
		private string lineContent = string.Empty;
		public string LineContent {
			get { return lineContent; }
			set { lineContent = value; }
		}
    }
}
```
Internet Explorer 11 の使い方

当たり前の使い方を毎回調べるので、まとめておくことにしました。
※. [Firefox の使い方はこちら](http://qiita.com/ponsuke0531/items/94c462f53415dd9bbecf)

# 文字化けした時の対応方法
- [121ware.com &gt; サービス＆サポート &gt; Q&amp;A &gt; Q&amp;A番号 016003](https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=016003)

# 表示を〇〇したい
- [【解決】IE で検索ボックスを非表示にする | Windows 10](http://tooljp.com/qa/hide-searchbox-in-IE11-5DCD.html)

# パスワードを保存する方法
1. [ツール] > [インターネット オプション]
2. [コンテンツ] > [オートコンプリート] > [設定]
3. [フォームのユーザー名およびパスワード]ON

- [パスワードを記憶してフォームに情報を入力する | Microsoft サポート](https://support.microsoft.com/ja-jp/help/17499/windows-internet-explorer-11-remember-passwords-fill-out-web-forms)

# ブラウザの挙動の違い
- プルダウンで項目を選択するとプルダウンの選択肢から項目が消える
    - IE11 消えない　　Chrome 消える

# タブの切替

```sh:ショートカット
# Windows7
タブの切り替え : Ctrl + Tab
```

# ダウンロード
- [毎回ダウンロード先を指定する方法 > 121ware.com](https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=016039)
- [Windows 10のInternet Explorer 11でダウンロードするファイルの既定の保存先を変更する方法](https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=018345)

# HTMLのタグをまるっと削除する方法
- [ブラウザの開発ツールでHTMLのタグをまるっと削除する方法](https://qiita.com/ponsuke0531/items/8e1be502e9c016c6280a)


# 開発ツールをChromeみたいに右横に表示したい
やり方がわからない・・・・

# ダウンロード時間を測りたい
F12 > [ネットワーク]タブで見られる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/9fd441fb-f109-6289-12fd-0f67ed9978e8.png)

## [ナビゲーション時にエントリをクリア]ってなに？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/cfa23851-fd7a-389e-6801-d8e2b7c29668.png)

> 表示しているページのパフォーマンスを計測するか、クリアされるまで表示を残すかを設定できる。例えば自動リダイレクトされる場合に、リダイレクト前のページも記録したいケースなどで使用する
> [Web制作で使いこなしたいIE開発者ツールの最新機能 - Build Insider](https://www.buildinsider.net/web/ief12devtools/01#page-network)

# 印刷プレビューの表示方法
環境 : **Windows10**

- 歯車マークから[印刷] > [印刷プレビュー]を選択します。<img width="326" alt="WS000003.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/9f397c5a-ebc5-49cc-f65d-29e744008d7a.jpeg">

# 背景と色とイメージを印刷する方法
環境 : **Windows10**

1. [印刷プレビュー]画面の歯車マークを押下します。<img width="196" alt="WS000004.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/2824401f-078a-afd8-8e03-268ac3865337.jpeg">
2. [背景と色とイメージを印刷する]をONにして[OK]ボタンを押下します。<img width="209" alt="WS000005.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/5caedba4-fa0f-ca6e-0bbc-e69afed9ac4b.jpeg">

# ブラウザのスタイルを表示する方法
不明:sob:
Chromeでのこれを・・・・表示する方法をどなたか教えてください。
<img width="234" alt="WS000006.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/fae11593-9c08-c556-5316-42a7bf6705f0.jpeg">

# なぜか、IE11なのにIE7の表示になった時の対応方法
環境 : **Windows10**

1. 歯車マークから[互換表示設定]を押下します。<img width="179" alt="WS000006.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/159761/cf05b1bb-9a7e-2519-9b0e-1e625e21c10b.jpeg">
2. [イントラネットサイトを互換表示で表示する]をOFFにします。![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/5f708bf1-f4c9-f73a-90a6-407bc1b4b946.jpeg)
nodistでNode.jsのバージョン管理

# はじめに
[nodist](https://github.com/marcelklehr/nodist)とはWindowsのcmd, Powershell, Git bash, CygwinでNode.jsのバージョンを上げ下げするツールです。
Node.jsのバージョンの更新は１コマンドで可能です。

以下、自分用メモです。

# インストール
インストーラ（[NodistSetup-vx.x.x.exe](https://github.com/marcelklehr/nodist/releases)）でNodistをインストール。

# バージョンアップ
+ **利用可能なバージョンの確認**

```
$ nodist dist
  ...
  9.7.1
  9.8.0
  9.9.0
  9.10.0
  9.10.1
  9.11.0
  9.11.1
  10.0.0
  10.1.0
```

+ **Node.jsのバージョンを更新**

```
$ nodist 10.1.0
10.1.0
Installing 10.1.0
 10.1.0 [===============] 22678/22678 KiB 100% 0.0s
Installation successful.
```

+ **確認**

```
$ node -v
v10.1.0
```

+ **npmのバージョンを更新**

```
$ nodist npm 6.0.1
```
React NativeでPhoenixのチャット動かすメモ


## 動いた

![スクリーンショット_2017-07-10_21_43_08_.png](https://qiita-image-store.s3.amazonaws.com/0/99683/d9084ed0-62e9-82c0-cf05-816dcc358ab6.png)

自分が確認した中だとAndroid、iOS、Web、React Nativeは動くサンプルがあります

## 概要

一個レポジトリ動かそうとしただけで色々エラーが出たのでまとめる
何かのバージョン違いでエラー出てるっぽいけど、原因はNode.jsなのかreact-nativeなのかとかはっきり切り分けできてない

## 動かそうとしたレポジトリ
https://github.com/skellock/phoenix-react-native-mashup/tree/master/ChatClient
PhoenixのChannelsでチャット動かすやつ
そのまま動かすとlocalhostの4000番ポートにつなぎに行くけど、自分でサーバ立ててないと当然繋がらない
接続先は下記のファイル直す
https://github.com/skellock/phoenix-react-native-mashup/blob/master/ChatClient/Chat.js


## 環境
Mac OS Sierra 10.12.5
node v4.5 or 5.12(途中で5.12に変えたので良くわからない)
npm 3.8.6
react-native-cli: 2.0.1

動かしたのはとりあえずiOSのみ

### Print: Entry, ":CFBundleIdentifier", Does Not Exist もしくは /path/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m:1301:5: error:
      ignoring return value of function declared with warn_unused_result attribute
      [-Werror,-Wunused-result]
    SecRandomCopyBytes(kSecRandomDefault, sizeof(uint32_t), (uint8_t *)mask_key);
    ^~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

RCTSRWebSocketが通らないらしい 下記のURLのやり方で、-Werror,-Wunused-resultを消すと直る
http://qiita.com/iwamatsu0430/items/ba3c5d14e4b525c80e23

### /path/node_modules/react-native/React/Views/RCTScrollView.m:359:7: error:      use of undeclared identifier '_refreshControl'; did you mean 'refreshControl'?

プライベート変数のrefreshControlに_refreshControlでアクセスできてない
self.refreshControlに書き換えたら動いた


## [tid:com.facebook.React.JavaScript] Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. Check the render method of `GiftedMessenger`.
自分の場合はnode_modules内にある'react-native-gifted-messenger'パッケージのGiftedMessenger.js内の記述が間違ってた

```
var Button = require('react-native-button');
```

↓

```
import Button from 'react-native-button';
```

#### 追記:2017/07/13
Element type is invalid.のエラーは[こちらの記事](http://kenjimorita.jp/invariant-js38ncaught/)によると、下記の場合が多い？らしいです

 * export, importを間違えている可能性
 * setState内の記述が誤っている可能性

react-native-gifted-messengerが古いのでreact-native-gifted-chat使おうとして
```
import GiftedChat from 'react-native-gifted-chat'
```
とやると同じエラー(Element type is invalid...)が出た
react-native-gifted-chatのGiftedChatクラスはexport defaultされてないので下記に直すと通った
```
import {GiftedChat} from 'react-native-gifted-chat'
```
React初心者にはこのエラー内容で判断するのはツラい

以上
アルフレスコサーバ　容量いっぱい

#確認コマンド
du -h --max-depth=1 /

98M     /boot
0       /dev
12K     /home
du: `/proc/3414/task/3414/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `/proc/3414/task/3414/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `/proc/3414/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `/proc/3414/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
0       /proc
8.5M    /run
0       /sys
21M     /etc
771M    /root
4.0K    /tmp
122M    /var
759M    /usr
0       /media
0       /mnt
16G     /opt
0       /srv
18G     /

容量が大きい「/opt」を確認する。
du -h --max-depth=1 /opt/

16G     /opt/alfresco-community
16G     /opt/

容量が大きい「/opt/alfresco-community/」を確認する。
du -h --max-depth=1 /opt/alfresco-community/

1.1M    /opt/alfresco-community/licenses
103M    /opt/alfresco-community/common
26M     /opt/alfresco-community/postgresql
15G     /opt/alfresco-community/alf_data
205M    /opt/alfresco-community/java
962M    /opt/alfresco-community/tomcat
602M    /opt/alfresco-community/libreoffice
37M     /opt/alfresco-community/amps
0       /opt/alfresco-community/modules
1.4M    /opt/alfresco-community/bin
2.6M    /opt/alfresco-community/solr4
108K    /opt/alfresco-community/amps_share
8.0K    /opt/alfresco-community/scripts
16G     /opt/alfresco-community/

上記の手順で行くと、容量が多いファイルを見つけることができる。
できるだけプログラムっぽくないプログラミングへの挑戦（Swift編）

- お米の国の人だもの。日本語でコードを書きたいよ。
- 英語が苦手な新人開発者に「読める！読めるぞ！！」と言わせたいな。

意外にも、難しいテーマである。

現在の筆者のスキルではこの程度が限界だが、
「この辺をこうしたら、もっと、ちゃんとプログラムっぽく無くなるよ？」
…といったご意見を募集中である。

![できるだけソース2.png](https://qiita-image-store.s3.amazonaws.com/0/187895/e5dbaac5-091f-2d41-1526-14dd71c72537.png)

### 実行結果

```
「 諦めなさい。 貴方は 私みたいな 気の強い女としか 一緒になれない運命なんだから 」
　　　〜 家内
「 いってらっしゃい。 元気に暮らしてよ！ 」
　　　〜 家出に向かう筆者に当時4歳の長男が掛けてくれた言葉
```

### バージョン情報

Swift：3.1
Xcode：8.３.3 (Swift Playgrounds)

### ソースコード

https://github.com/rotors123/ProgrammingNoProgrammingSwift.git