OmniAICreator/Qiita-1.07M huggingface dataset:
sizeof

配列のサイズを調べるのに、sizeofを使う、と良くあるが、
動的に確保した内容については、ポインタのサイズを返す、という内容。
あと、動的に確保した領域のサイズを知るためには、malloc_usable_sizeで見れる。

追記。
一応確保したサイズは、malloc_usable_sizeで見れますが、デバッグや内部調査目的以外に、
特に使う理由はないはずです。（malloc_usable_sizeのマニュアルにもそう書いてあります）

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/malloc_usable_size.3.html

一応mallocか、それと同様な処理で確保されたポインタであれば問題なさそうですけど、
newの処理が、具体的に何をしているかは、ちょっと調査不足です。はい。


　

```c++:a.cpp
#include <iostream>
#include <malloc.h>

int main(int argc, char **argv) {
        char text[] = {98, 0, 99, 0, 100, 0};
        char *text2 = new char[100];

        std::cout << "sizeof text: " << sizeof(text) / sizeof(char) << std::endl;
        std::cout << "sizeof text2: " << sizeof(text2) / sizeof(char) << std::endl;
        std::cout << "malloc_usable_size text2: " << ::malloc_usable_size(text2) << std::endl;

        delete [] text2;
}

```

```
[todanano@localhost ~]$ g++ a.cpp
[todanano@localhost ~]$ ./a.out
sizeof text: 6
sizeof text2: 8
malloc_usable_size text2: 104
[todanano@localhost ~]$
```
【チラシの】技術的負債の理解の仕方と既存の対策方法、今後の対策方法検討【裏】

# 1. 技術的負債を理解する

技術的負債とは何かを説明するには、Clean Architecture第1章で紹介された以下の図がよいと思う。

![00009.jpeg](https://qiita-image-store.s3.amazonaws.com/0/30316/faf9a786-5c4c-21fc-809d-ec4f4b526d04.jpeg)

> 　図1-3を見てほしい。本当に恐ろしいグラフだ。これは、コード1行あたりのコストの変化を示している。
> 
> 　グラフの傾向から、持続可能性が低いことがわかる。同時期に企業がいくら利益を上げていようが関係ない。この曲線は、ビジネスモデルから利益を奪い去り、完全に崩壊させることはないにしても、企業を大きく失速させるだろう。
> 
> 　こうした生産性の変化の原因は何だろうか？　リリース8にリリース1の40倍ものコストがかかっているのはなぜだろうか？

私が関わったすべてのプロダクトが、例外なくこのグラフと同じ生産性の加速度的低下を受けた。
例外は、今の所1つもない。

私見だが、私はこの生産性の低下を引き起こすものを技術的負債と定義する。

# 2. 技術的負債の実体は何か

ここは多種多様なものが挙げられると思う。
ぱっと思いつくものを以下に挙げた。

* ドキュメント不足
* 仕様記述の不在
* 一貫しないコード設計
* (チーム、あるいは企業の求める)技術水準にないコード
* バージョンアップされないインタープリタ、ライブラリ
* テスト不足
* ・・・

これについてだけでいくらでも文章が書けるが、本記事では深く掘り下げない。

# 3. 技術的負債に対する従来の2つの対応方法

上述の生産性低下の結果、基本的にすべてのプロダクトはある次点で新規機能の追加が不可能になりバグすらときに修正不可能になる。
その結果、企業は次のどちらかの選択肢を迫られる。

## A. 既存プロダクトの完全リプレース

既存のプロダクトと同等な機能に加えて必要な新規機能を満たす新しいプロダクトを作成し、既存のプロダクトを置き換える手法。

一見かなりバカバカしい選択だが、現実的にはよく取られる。
幸か不幸かまだIT業界の流れは早く、同じプロダクトを再開発する言い訳が以下のようにたくさんある。

* マイクロサービス化
* 新しい言語に変更
* クラウド化
* DDD化

機能追加・保守ができない本当の理由を直視せず、上のような言い訳をして同じ機能のプロダクトを何度も何度も繰り返し開発する企業は確かに存在する。

一方で、マイクロサービスのような考え方ではたくさんの前提条件を敷いた上で上記のような再開発を肯定的に捉える向きもある[^1]。

[^1]: 参考: [O'Reilly Japan \- マイクロサービスアーキテクチャ](https://www.oreilly.co.jp/books/9784873117607/)

この手法は基本的に大量の人員と膨大な時間を必要とするものの、最終的に既存のプロダクトが破棄できれば一旦技術的負債は目減りするので人と金を余らせている企業ではそれなりに有効な方法である。

<!--
[確率的に犠牲的 \- steps to phantasien](http://anemone.dodgson.org/2015/04/09/probablistically-sacrificial/)
-->

## B. 衛星プロダクト

新たに必要な機能のみを含むプロダクトを、既存のプロダクトの隣に作成してそれらをなんらかの方法で連携させる手法。
連携には以下のような技術が使われる。

* 手動でのデータ同期
* 定期バッチ
* DBレベルでの相互参照/書き換え
* API連携

この方法は一見必要な投資が少なく済むように見える。
またプロダクトを別にできるので言語・設計・動作環境などを別にでき、既存のプロダクトの技術的負債を引き継がず機能追加できるように思える。

しかし、実はデメリットが非常に大きい。
理由は連携にある。技術的負債を抱えているようなプロダクトがまともな衛星プロダクトを作れるほど真っ当なAPI設計[^2]をしていることはほぼありえない。結果的に衛星プロダクトの稼働は出来の悪いAPIに依存するか、DBレベル・定期バッチによる連携を迫られる。
出来の悪いAPIによる連携、DBレベルでの連携、定期バッチによる同期はどれも密結合を避けられない。
結果的に殆どの場合2つのプロダクトは融合して2種類の言語・設計・環境で動く1つのプロダクトになる。

この方法は以下の点で既存プロダクトの完全リプレースよりひどい。

1. 技術的負債の総和は一切減らない
2. 1つのプロダクトに2種類の言語・設計・環境が入り交じることで技術的負債をさらに上積みしている[^3]

[^3]: いつもの2倍の言語、2種類の設計指針、3ヶ所の稼働環境でバッファローマンお前の1000万技術的負債を超える計1200万技術的負債だー！

今まで見たシステムの中のワースト1,2はどちらもこのパターンだった。

[^2]: APIドキュメントがある、きちんとテストされており仕様通りに動く、仕様詳細がAPIから漏れ出してない、そもそもAPI粒度や目的・用途が適切である、など。[^1]参考

# 4. 我々は技術的負債とどう戦うべきなのか

わからない。
DDDによる設計やclean architectureによる設計は、それらの主張する正しい設計により冒頭の図1-3のような機能の追加コストの爆発を抑えられると標榜している。
しかし、それらを実践した(少なくとも実践したと主張している)プロダクトのどれもコスト爆発を避けられていなかったし、自分で実践した結果も同様だった。そのプロダクトでのDDD実践者や自分が未熟だったと仮定しても、技術的負債を作らず開発するのはかなり難しいと思える。
マイクロサービス志向のアーキテクチャはDDDやcleanとは別のアプローチで技術的負債に対処しようとしている。DDDやcleanは主に1つのアプリケーション内の設計の試みであるが、マイクロサービス志向は1つのアプリケーションの粒度を細かくして機能単位に分解することによりアプリケーション1つ1つをDisporsableにして、いつでもコードを捨てられるようにしている。しかし、こちらもまだ試行され始めてたかだか4,5年でありマイクロサービスとして作られたものがどう退役するのか、などの知見は十分に集まっていない。

現実的なコストで持続的に機能追加・サービス継続できる。そのようなプロダクトは果たして作れるのだろうか・・・。

# 参考

* [Clean Architecture 達人に学ぶソフトウェアの構造と設計【委託】 \- 達人出版会](https://tatsu-zine.com/books/clean-architecture)
サンタクロースの業務を最適化する、NAVITIME APIを3つ紹介します！

12/24はクリスマスイブ。サンタクロースの1年で一番忙しい日です。
子どもたちに幸せを運ぶサンタクロースを支援したい！ということで、サンタクロースの業務を最適化する「NAVITIME API」を3つ紹介します！

#巡回経路検索
![3_経路検索.png](https://qiita-image-store.s3.amazonaws.com/0/315364/cbd9e2c8-0652-3cc2-2ab1-8bf32ed4dac4.png)

巡回経路検索は、いわゆる「巡回セールスマン問題」を解くためのAPIです。たくさんの訪問先があるときに、どういう順番で回るのが最短なのか？を知ることができます。それだけではなく、どういう道順で行けば良いのか？までを計算してくれます！
サンタクロースの場合、クリスマスの朝までという非常に限られた時間の中で、プレゼントを多くの家庭に届けなければなりません。そのため、巡回経路検索はサンタクロースにとって必須のAPIです。
このAPIは様々な移動手段に対応していますが、サンタクロースの移動手段であるトナカイの移動速度は60km/h～80km/hと言われており、移動手段を自動車として検索することで概ね適切な結果を得ることが可能です。

#到達圏検索
![1_通勤時間検索.png](https://qiita-image-store.s3.amazonaws.com/0/315364/233a252b-e591-83e1-114d-7008cee56784.png)

宅配クライシスが叫ばれています。ECの普及による宅配需要の増加に対し、人手不足が顕在化。宅配したい会社と宅配ドライバーの人材マッチングが重要になる中で、宅配の一種であるサンタクロースがその影響と無縁であろうはずがありません。
ナビタイムの到達圏検索は、通勤時間が〇分圏内の求人を探す、など人材マッチングサイトで活用されています。通勤時間が5分違えば、往復で1日10分、1年間200日勤務だと2000分の差となります。到達圏検索により、サンタクロースも最適な職場を探すことができるでしょう。
国際サンタクロース協会による公認のサンタクロースは180人ほどですが、人手不足により子どもたちにプレゼントが届かない、といったことにならないよう願ってやみません。

#交通費検索
![2_交通費検索.png](https://qiita-image-store.s3.amazonaws.com/0/315364/69a45257-cef2-5bfc-14fb-cdebf9750be7.png)

交通費検索では、出発地と目的地の組合せに対してルートを計算し、それにかかる交通費を算出します。定期券の考慮はもちろん、IC料金にも対応しています。
また、全国515社（コミュニティバスを含めると800社ほど）のバス会社を対象（※2018/12/21現在）に独自調査し、時刻表やバス停位置などの情報を整備。バスの交通費に対応しました。バスのデータ整備は、「2018年度グッドデザイン・ベスト 100」を受賞しています！
サンタクロースの移動手段であるトナカイはレッドリストにおいて絶滅の可能性が高いとされており、また冬場のエサとなる地衣類も大気汚染の影響で減少し、非常に高コストな乗り物となりつつあります。ナビタイムとしてはバスをはじめ公共交通機関での移動を推奨いたします。

#まとめ
上でご紹介したAPI以外にも、いろいろ便利なAPIを用意しています。たとえば、スポット検索APIを使えば、道に迷ったサンタクロースも近くのランドマークを検索し、スムーズにプレゼントを届けられます！
NAVITIME APIをもっと知りたい！という方は、[こちら](http://api-sdk.navitime.co.jp/api/)をぜひご参照ください。

それでは、よいクリスマスをお迎えください！
スライダーのライブラリfluid-sliderで選択した値を取り出したい

# はじめに
スライダーのライブラリ`fluid-slider`を使った時に、選択した値を取り出したい時があった。
図でいうと371の数字のこと。
![Simulator Screen Shot - iPhone XS Max - 2018-12-21 at 11.26.18.png](https://qiita-image-store.s3.amazonaws.com/0/176479/2085ba98-9cec-c283-bb52-6f609e9a6b88.png)

# 解決方法
`attributedTextForFraction: (CGFloat) -> (NSAttributedString)`を使うと取得できる

## 導入例
スライダーを触り終わった瞬間に設定された値を取り出したいとする
`fluid-slider`はこのスライダーに触った時に実行される下記のプロパティがある

```swift
///スライダーを触った時に実行される
var didBeginTracking: ((Slider) -> ())?
///スライダーから指が離れた時に実行される
var didEndTracking: ((Slider) -> ())?
```

```swift:実装例
let slider = Slider()
slider.setMinimumLabelAttributedText(NSAttributedString(string: "0"))
slider.setMaximumLabelAttributedText(NSAttributedString(string: "500"))
slider.fraction = 0.5
slider.didEndTracking = { slider in
    print("スライダーで現在選択されている値: :point_up:",slider.attributedTextForFraction(slider.fraction))
}
```



# ライブラリ`fluid-slider`
https://github.com/Ramotion/fluid-slider
[過去POST][初心者向け]CSSの最初に書くピリオドの意味


## 過去POST
過去自分がTECH::CAMPのメンターをしていた時期にメモしていた内容を公開します。
この手の質問も勉強し始めの人からは結構多かった印象があります。
（このくらいカリキュラムに書いてほしかった…）

## 質問
CSSの最初に書くピリオドはなんのために書くんですか？

## 回答

CSSは「何に対して」装飾するのかを指定する必要があります。（セレクタと言います）

指定できるものは主に
・HTML タグ
・class 
・id 
です。

先頭に[.]や[#]をつけるのは、上記三つのうち何かを区別するためです。

例えば全て同じ名前「head」だとすると、

```html

<head>HTMLタグ</head>

<div class="head">class</div>

<div id="head">id</div>
```

```css
/*HTMLタグ*/
head{
}

/*class*/
.head{
}

/*id*/
#head{
}
```

のようになります。

つまり、先頭にピリオドをつけるのは、「クラス」に対して装飾をするという指定をするためです。
C++ Builder XE4 > はまり > TComboBox > Items[]のTextを取れなかった > Error: モジュール XXXのアドレスXXXでアドレスXXXに対する読取り違反がおきました。

```txt:動作環境
C++ Builder XE4
```

### 概要

- TComboBoxを使用
    - Items[]にリスト登録
    - ItemIndexとしてリスト内のインデックスを保持
- Items[]から選択している項目のTextをとろうとした
- 失敗

### 実装

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	ComboBox1->ItemIndex = 9;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int idx = ComboBox1->ItemIndex;

	String wrk = ComboBox1->Items[idx].Text;

	ShowMessage(wrk);
}
//---------------------------------------------------------------------------

```


![2018-12-21_11h31_53.png](https://qiita-image-store.s3.amazonaws.com/0/32870/93932738-009f-0108-78bb-93bae80acb35.png)


### ComboBox1のItems[]の確認

ブレークポイントで止めて、Items[]の中身を見た。

![2018-12-21_11h33_46.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e1996a74-6b28-dfc2-987d-d6d7d59f9fa4.png)

良く分からない内容が表示される。

### 代替手法

選択している文字列を取得するなら以下とすればいい。

```
String wrk = ComboBox1->Text;
```

Items[]の特定のインデックスの文字列を取る方法は未調査。


### 関連

- [Vcl.StdCtrls.TComboBox](http://docwiki.embarcadero.com/Libraries/Tokyo/en/Vcl.StdCtrls.TComboBox)
[過去POST][初心者向け]post_reviewで何をやっているのか

# 過去POST

過去自分がTECH::CAMPのメンターをしていた時期にメモしていた内容を公開します。
もしかしたら何かに迷っているひとの手助けになるかも…

最近、rubyを触っていないので、文法が変わっていたりしたらすみません…

今見直してみるとひどいコードですね…


## 質問内容

```ruby

 def input_review(a_posts)
     post = {}      
    
    puts"ジャンルを入力"
    post[:genre] = gets.chomp
    puts"タイトルを入力"
    post[:title] = gets.chomp
    puts"レビューを記入"
    post[:review] = gets.chomp
    
    a_posts << post
    puts "No:#{a_posts.length}"
    line = "---------------------------"
    puts "ジャンル : #{post[:genre]}\n#{line}"
    puts"タイトル : #{post[:title]}\n#{line}"
    puts"感想 :\n#{post[:review]}\n#{line}"
    
  end
```

`posts = post_review(posts)`
が何をしているのかがわからない。
postsにメソットを代入している？

↓サンプルコード全容（自分が昔カリキュラムを元に書いてたやつです）
https://github.com/Yuki-k-lion/rubyLesson2/blob/master/reviewApp.rb

## メソッドの引数と返り値
メソッドで重要なのは、「どんな値を受け取り、どんな値を返すのか」です。
「受け取る値」のことを「引数」、返す値の事を「返り値（戻り値）」と言います。

`def method_name`

から始まる部分はそのメソッドでどんな処理をするのかを定義する部分ですが、そこ以外でメソッド名を書いた場合はメソッドを使っている場面です。
この場合は、

`posts = post_review(posts)`

の部分です。

メソッドを使った場合は、メソッドの返り値がメソッド使用部分と置きかわります。

例えば、

```ruby

def twice_num(nun)
 num = num + num
 return num
end
```

というメソッドを定義した場合、

```ruby
put twice_num(1)
n = twice_num(6)
put n
```

を実行すると、ターミナルには

```ruby
2
12
```

という結果が帰ってきます。
つまり先ほどのコードは

```ruby
put 2
n = 12
put n
```

と同義になります。
ここで、2や12という数字がメソッドの返り値です。

これを踏まえて、質問部分のコードを見てみましょう。

`posts = post_review(posts)`

この部分は

`posts = a_posts（←post_reviewの返り値）`

と書き換えられると考えることができます。

つまりここでは、

posts に対してpost_reviewの返り値を代入しているという記述になります。


## 返り値の再代入
２つめの質問ですが、
`posts = []` という配列に要素を追加しているのか？
という質問かと思います。

イメージはとても近いですが、少し違いますね。

これは事前に定義したpostsという配列に対して、post_reviewの返り値を再代入しています。イメージとしては、追加より「更新」の方が近いかと思います。

例えば、最初に定義した段階では
Postsという配列には何も入っていません。この状態を

`posts : []`

と表すとします。

ここでpost_reviewというメソッドを使うと、新たにレビューAを追加した配列が作成され、a_postsとして返り値が返ります。
この状態を

`a_posts : [レビューA]`

とします。

先ほど説明したものと合わせると

`posts = a_posts`

とした場合、

posts の中身はa_postsと置きかわり、

`posts : [レビューA]`

のように「更新」されます。

同様の処理を繰り返していくと

`posts : [A,B,C]`

に対して、post_reviewで新規にレビューDを追記した配列

`a_posts : [A,B,C,D]`

が生成され、

`posts = post_review(posts)`

によりpostsの中身は

`posts :  [A,B,C,D]`

のように更新されます。
Alexaデザインガイドの本は他のプラットフォームでも応用できる

ごきげんよう

この記事は
**「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」**
の20日目の記事です。

先日のAlexaDevSummitで以下の本が配られました。

![デザインガイド.png](https://qiita-image-store.s3.amazonaws.com/0/67398/3f41b3ee-a39e-8ce4-2b64-b7f0a7c4d81f.png)


中身は基本的に以下のWebページと同様です。

紙の物理本ですので、オンラインの方が最新であることは確かでしょう。

■Alexaデザインガイド
https://developer.amazon.com/ja/docs/alexa-design/intro.html

#もう1回振り返るのに最適

Alexaでスキルを作成している方々はすでに上記サイトは確認済みとは思いますが、画面が付いたりマルチモーダルになってきたAlexaについてのデザインガイドは再度読んでおくと、新しい発見があると思います。

もちろん、これからスキルを作成する方々にも極めて有用です。

#他にも公式のこのドキュメントは目を通すべき

上記のデザインガイドはもちろん有用ですが、以下も併せて確認することをオススメします。

■音声デザインガイド
https://developer.amazon.com/ja/designing-for-voice/

特にチェックリストが載っているのが良いと思われます。

#Alexa以外のプラットフォームでも共通部分は多い

もちろんこれらのドキュメントはAmazonのAlexa用のドキュメント類です。

とはいえ、音声デザインに関しては他社プラットフォームに共通している部分も多く、上記のドキュメントをしっかり読んでいれば他社プラットフォームでも応用が十分聞くと思います。

特にLINE系の場合はClovaに限らず、Messaging APIやLIFFなどに置き換えることもある程度できるのではないでしょうか。


以上
雰囲気で書かないmod_rewrite

##mod_rewriteって分かりづらくない？
サイトの移転やhttpsリクエストページへのリダイレクトなどでmod_rewriteを使うことがありますが、
正直出番は多くない＆みんなやりたいことが一緒なので、なんとなくネットで方法を調べたり、詳しい人に対応してもらっているケースが多いと思います。本来ならば、しっかりと理解してから対応すべきなのですが、独自の言い回しや、非常に多いオプションが難易度を上げているようにも感じます。ここらでちゃんと基本を理解しましょう。

##文法について
一見難しそうな文法ですが、見慣れない文言やオプションが多いだけで、記述の仕方はシンプルです。

### mod_rewriteの基本的な文法
 - `RewriteEngine on`　：URL書き換えを宣言
 - `RewriteBase`　：基準となるパスを設定（今回は説明しない）
 - `RewriteOptions`　：親子ディレクトリ間での影響範囲を設定（今回は説明しない）
 - `RewriteCond`　：条件文を設定
 - `RewriteRule`　：指定したパターンでURLの書き換えを行う

### RewriteEngine on|off
 - URL書き換えを行う場合には必須
 - URL書き換えの on | off を設定する
     - offの場合は、URL書き換えが動作しない
 - バーチャルホストには継承されないので、それぞれ設定する必要がある

### RewriteCond
 - ルールの条件設定を行う
 - 書き方は`RewriteCond X Y`
    - XはYに一致する場合、の意
 - RewriteRuleの前に記述
 - 複数記述できる
 - 設定した全ての条件にマッチした場合、指定したRewiteRuleが実行される
 - サーバー情報やリクエスト情報を取得できる環境変数を使用できる
     - `%{環境変数名}`で使用可能
     - どんな環境変数があるかについては[こちらを参照](https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritecond)

### RewriteRule
 - 書き換えの処理を実行する
 - 書き方は`RewiteRule X Y`
    - 前述したRewriteCondとXがマッチした際、Yに書き換える、の意
 - 書き換え内容は正規表現で指定

## 記述例
### httpリクエストとhttpsにリダイレクトする
下記は、`http://foo.jp/bar/dee`というリクエストがあった場合、httpsにリダイレクトする例です。

```
<ifModule mod_rewrite.c>
　　　　　　　　RewriteEngine On
　　　　　　　　RewriteCond %{HTTPS} off
　　　　　　　　RewriteRule ^(.*)$  https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</ifModule>
```
処理の内容を説明すると下記のようになります
 - httpsで無い場合
 - リクエストされたもの`http://foo.jp/bar/dee` の
 - %{HTTP_HOST}であるfoo.jpと
 - %{REQUEST_URI}である/bar/deeを利用して
 - [R]リダイレクトし
 - [L]それ以降の処理は行わない

#### フラグの設定
上記例に`[R]`とか`[L]`が急に出てきて「**うわ、めんどくせえ**」ってなりますね。これらはフラグと呼ばれ、RewriteRuleの末尾につけます。役割としては、**RewriteRuleを振る舞いを設定します。** 
このフラグは約20個あり、全部説明するのは困難なので、[他の方が書いた記事に譲ります](https://qiita.com/tsukaguitar/items/e37245260f0b1407341d)。

### 無効なURLがリクエストされた場合は、index.phpに書き換え
下記は、CMSなどでよくある設定です。

```
<Directory /var/www/foo.jp>
    RewriteEngine On
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</Directory>
```
 - `index.php`がリクエストされた場合、何もしないで終了
 - 存在しないファイルがリクエストされた場合、次の条件へ
 - 存在しないディレクトリがリクエストされた場合、次の条件へ
 - 上記条件を満たすリクエストはindex.phpに書き換える

まーた`-f`とか`-d`とか出てきました。 これらは条件パターンと呼ばれるもので、左辺側に対して条件を指定しています。
勘の良い方は気づいたかもしれませんが、`-f`はファイルを表し、`-d`はディレクトリを表します。
それに否定を意味する`!`を付け足し、`ファイルが存在しない場合`、`ディレクトリが存在しない場合`という意味を持たせています。
条件パターンについては[他の方が書いた記事をご参照ください](http://blog.dawgsdk.org/weblog/archives/411011)。

## 終わりに
mod_rewriteは奥が深いので、１つの記事で全てを説明するのは難しいですが、この記事で苦手意識を抱えている方の手助けになれば幸いです。
オプションが多く、敷居が高く感じられますが、一個一個は非常にシンプルな条件の塊です。怖がらずにどんどんチャレンジしていきましょう。
HadoopのSIで躓かない初歩の手引き

株式会社　日立製作所　木下翔伍

# はじめに
[Apache Hadoop](https://hadoop.apache.org/) (以降Hadoop)とは、多種/大量なデータを蓄積し、高速に分散処理するための基盤となるOSSミドルウェアです。Hadoopの周辺では、Hadoopをより高度に利用するための関連OSSが登場してきており、これらをうまく組み合わせて活用することでデータの収集から蓄積、分析、結果の可視化までをカバーすることができます。このようにHadoopの周辺で関連OSS群が結びつき、補いながら共存している様子はHadoopエコシステムと呼ばれています。

この記事では、CDH（Cloudera社が提供している、Hadoopと、その周辺でHadoopエコシステムを構成するOSS群をパッケージングしたディストリビューション）を使ってSIしたときに、実際に遭遇した大小さまざまなトラブルから得た注意点を一口メモ風にご紹介します。

# ネットワーク構成の検討は慎重に
## 名前解決
クラスタを構成するノードを名前解決するために、各ノードのホスト名にはhostnameコマンドの実行結果として得られるものを使います。名前解決は順引きと逆引き、両方できなければいけません。

DNSで名前解決することが望ましいですがhostsファイルで名前解決しても構いません。ただしCDH/Cloudera Managerはhostsファイルの設定にFQDNがあると、それを使って管理しようとします。ホスト名にFQDNを使わずhostsファイルで名前解決するとき、エイリアスにFQDNを残すことがないよう注意してください。

``` text:NGなhostsファイルの例
10.196.1.11  manager       server01.mydomain.com
10.196.1.12  master01       server02.mydomain.com
　　　　　　　　　　　・・・(略)・・・
10.196.1.18  worker04       server08.mydomain.com
```

``` text:OKなhostsファイルの例
10.196.1.11  manager
10.196.1.12  master01
　　　　　　　　　　　・・・(略)・・・
10.196.1.18  worker04
```

## ネットワーク構成とネットワークインタフェース
同一ノード上で複数ネットワークインタフェースを使用して、Hadoop関連の通信をおこなうような動作はサポートされません。Hadoopの処理で使うインタフェースは1つに特定しておきます。もちろん、このネットワークインタフェースは名前解決をしたときに使われるように設計する必要があります。

例えば次のようなネットワーク構成はNGです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/328461/51f8f811-815e-1d34-becf-dc0b42dbf7c2.png)
ワーカノード間では多量の通信が発生します。それが業務用の基幹ネットワークを圧迫するのを避けようと、ワーカノードどうしだけを結ぶ10Gbpsネットワークを追加してしまった例です。ワーカノードどうしの通信はよいのですが、ワーカノードとマスタノードの間の通信は、必ず業務用基幹ネットワークを通る必要があります。すなわち、ワーカノードはHadoopの処理・通信において2つのネットワークインタフェースを通信相手によって使い分ける必要が出てきます。このような構成はサポートされませんので避けなければいけません。

一方、次のようなネットワーク構成はOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/328461/ec96dfb2-4e83-6635-2075-cf7cdf7d9201.png)
全ノードが業務用基幹ネットワークと管理系ネットワークに接続されています。このときHadoopの処理はすべて業務用基幹ネットワークを使うようにしておけば、期待通り正常に動作します。ネットワークインタフェースを複数搭載していること自体は問題ではありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/328461/c5f9f547-487b-4489-2790-781992c08eab.png)
先ほどの例ではノード間通信が業務用基幹ネットワークを圧迫してしまうことを懸念する人がいるかもしれません。その解決案の一例として管理用ネットワークとは別に、クラスタの各ノード間を結ぶ新しいネットワークを導入する例を示します。Hadoopの動作要件を満たし、かつ既存の業務用基幹ネットワークに与える影響を抑えた、最もシンプルなネットワーク構成ではないでしょうか。

# Impala / HiveはRDBではない
SQL on Hadoopを実現するためのツール(Hadoopエコシステムのひとつ)として、ImpalaやHiveがあります。ImpalaやHiveではHDFSに蓄積した構造化データをSQLライクに操作できます。しかしSQL風にデータを扱えるからといって、RDBと同様に考えて扱ってはいけません。いくつかRDBとは大きく異なる点と考え方をご紹介します。

## データはファイルに保存
Impala/Hiveは投入されたクエリを解釈しHadoopクラスタ上のリソースを使ってデータ処理を実行しますが、データストアを内包しているわけではなく、Hadoopの分散データストア（分散ファイルシステム）であるHDFSなどにデータを格納します。Impala/Hiveはクエリを解釈して処理するサービスであって、データストアは他のサービスに任せているということです。

## データの更新はしない
HDFSにはライトワンスという特性があり、一旦書きこんだファイルの本文を修正して更新することはできません(最近ではKuduというデータの更新が可能な分散データストアも登場してはいますが)。そのためクエリエンジンにImpalaやHiveを、データストアにHDFSを用いた場合、データの更新を前提とする処理は不向きといえます。

## Impalaはアドホッククエリ向け
Impalaはデータサイエンティスト等がインタラクティブに分析をするときに用いられることを想定して開発されており、なによりも結果を迅速に返すことを重視します。そのため何らかの原因で処理が失敗した場合にはリトライせず、すみやかに処理を中断します。またクエリの実行開始時に用いるメモリ量を推定しますが、これがクラスタ利用可能なメモリ量を上回ったときには、実際に使用するメモリ量が利用可能な範囲であったとしても、クエリの実行をすることなく諦めて、その旨をユーザへ通知します。SQL on Hadoopでバッチ処理をする場合には、処理エンジンとしてノード障害時などのリトライ機構のあるSpark/MapReduceを使用するHiveを推奨します。

# おわりに
本記事ではHadoopを構築するときのポイントをいくつかピックアップしてご紹介しました。Hadoop活用の一助となれば幸いです。
ブラウザからアプリ開きたくてディープリンク，URLスキーム，Universal Linksについて学んだ話

# はじめに
ブラウザからアプリ開くやつってどうやったらできるんだろう...
URLスキーム？ディープリンク？Universal Links？
なにがなんだかわかりません，勘弁してください


# 3つの違いとは
## ディープリンク
「アプリケーションの特定機能を開くリンク」がディープリンクであり，すなわちディープリンクはそのような機能の**概念**になります．
ディープリンクはWebサイトやアプリ内に設置され，ほかのアプリへの遷移を実現することができます．


## URLスキーム
URLスキーム(カスタムURLスキーム)は，上で説明したディープリンクを実現するための方法の一つです．

https://qiita.com/
というURLを例にとると，**「スキーム」**というのは**"https://"**の部分のこと．
要は「どんなプロトコルで通信をするか（どんなコンテンツを要求するか）」を指すところなんですが，iOSやAndroidではこの部分にアプリ名を入れることで，アプリを起動することができるようになります．

例：
music:// (ミュージックアプリの起動)
comgooglemaps:// (Google Mapsの起動)

アプリケーションを起動する、"music://"の部分のことをURLスキームと呼び、
さらに，URLパラメータを含めることでアプリに引数として情報を渡すことも可能です．

しかしながら，
- アプリがインストールされていない場合
- 複数のアプリが同一のスキーム名を要求している場合
には対応できず，基本的にはエラーとなってしまうのが欠点になります．


## Universal Links

iOS9以降で利用可能になったディープリンク実現のための方法で，Appleが公式に提供しているものです．

http://(https://)リンクをキーとして，**アプリのインストールの有無により挙動が変わる**ことが大きな特徴となります．

- インストール済み...アプリに遷移
- 未インストール...Webページに遷移

http://(https://)のリンクであるため，一意性が確保されURLスキームで生じていた重複を避けることができます．
また，Universal Linksでは遷移はシームレスに行われ，「アプリを開きますか？」などのポップアップは表示されることがありません．


## さいごに
ディープリンク技術はほかにもいろいろあるので今後調査は必要そう...


## 参考サイト
- [URLスキームとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1814.html)
- [ユニバーサルリンク、URIスキーム、アプリリンク、ディープリンク：何が違う？ | Branch Blog Branch Blog](https://blog.branch.io/ja/%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%83%AA%E3%83%B3%E3%82%AF%E3%80%81uri%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%A0%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%83%AA%E3%83%B3%E3%82%AF/)
- [ディープリンク と URLスキームの違い](http://tooljp.com/windows/chigai/html/Internet/deeplink-url%20scheme-chigai.html)
- [URLスキーム・独自ディープリンク実装に代わる、Universal Links(iOS 9で導入)でより良いUXを実現 - Qiita](https://qiita.com/mono0926/items/2bf651246714f20df626)
- [iOS・Android のディープリンク技術のまとめ (2017年2月更新) – ymyzk’s blog](https://blog.ymyzk.com/2015/12/ios-android-deep-linking/)
VSCode 用 SystemVerilogの拡張を作る（#6）

# JavaScript上で動作するコードを出力できるパーサージェネレーター
これが結構困ります。
C++ならflex+bisonでいいや、となりますが、あいにくJavaScriptは門外漢です。

[Wikipediaに比較ページがあり](https://en.wikipedia.org/wiki/Comparison_of_parser_generators)、さらに[このページ](https://tomassetti.me/parsing-in-javascript/)など参考にしてみると、

- [Jison](https://zaa.ch/jison/)
- [PEG.js](https://pegjs.org/)
- [ANTLR4](https://www.antlr.org/)

あたりが有力という事がわかりました。
Jisonが実際にCoffeScriptで使われているということで良さげでしたが、更新が止まっていることと、PEG.jsのほうが簡単そうで使いやすかったため、当初はPEG.jsで実装を始めました。しかし、結局以下の点がネックでANTLR4に切り替えました。

- 左再帰ができない
- エラー時復帰処理がない（あるいは貧弱）

Parsing Expression Grammar (PEG)というのは初めて使いましたが、楽なのでちょっとしたファイルのパーシングなどには良いんですが、流石に言語解析には厳しいと感じました。

ANTLR4はLLパーサーで、同様に左再帰ができないはずなのですが、なんと簡単なレベルであれば左再帰が扱える拡張がされており、エラー復帰やメッセージもそれなりにしっかりしています。メンテナンスも頻繁です。

また、VSCodeに[ANTLR4拡張](https://marketplace.visualstudio.com/items?itemName=mike-lischke.vscode-antlr4)があり、これが大変使いやすく決め手となりました。


# ANTLR4によるパーサー実装
ANTLR4の入力文法ファイルはBNFに似ているので簡単に書けます。

SystemVerilogの文法は公式の仕様書PDFの他、[ここ](http://insights.sigasi.com/tech/systemverilog.ebnf.html)と、[ここ](http://sven.xtreme-eda.com/)が参考になります。Webベースのほうがハイパーリンクで辿れて便利です（間違いもあるので注意）。

見てもらうとわかりますが、SystemVerilogのBNFはかなり大きいです。ｷｶﾞｸﾙｯﾄﾙ。
ハードウェアを記述する抽象度の低い言語なので仕方ないとは思いますが・・・すごく汚い言語です。

すべてを実装はできませんでした。なぜなら私も使ったことがない文法が結構あり、効果が不明であった部分があったからです。
assertion関連だと、もはや使い方が不明な記法も多くありました。

実装はgithubにありますので、よければ参考にどうそ。

- Lexer ファイル
 - https://github.com/Rockdoor/systemverilog/blob/master/src/sv_parser/grammar/SystemVerilogLexer.g4
- Parser ファイル
 - https://github.com/Rockdoor/systemverilog/blob/master/src/sv_parser/grammar/SystemVerilogParser.g4

ANTLRの左再帰を成立させるために小変更した箇所があり、完全準拠とはなりません。
パフォーマンスの問題もあって、こんなの絶対使わない、という文法は削っています。
また、式の解析はサボっており、演算子の優先度を考慮した構文木にはなりません。

JavaScriptがそもそも遅いことに加え、この文法の大きさがゆえに最終的なパーサーの実行速度が落ちてしまっていると思われ、残念ながら1000行超えのソースだと1パース1秒くらいかかってしまいます。幸か不幸か、1ファイル1000行を目処に設計する強制力が意図せず発生しています。

ANTLRは使いやすいのですが、人口が少ないのかサンプルが少ないことなどがあってハマりどころも多いので、SystemVerilogパーサー実装の記事は別にします。
SSH鍵（秘密鍵）でログインした際のパーミッションエラーの解決方法

## 事象
SSH鍵でログインしようとした際に、秘密鍵にパーミッションエラーがでて、ログインができなかった。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0755 for '/Users/suzuki/.ssh/xxxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/suzuki/.ssh/xxxx.pem": bad permissions
debug1: No more authentication methods to try.
ec2-user@xx.xxx.xxx.xxx: Permission denied (publickey).
```

## 原因と対応方法
秘密鍵の権限が緩すぎた事が原因であった。
> Permissions 0755 for '/Users/suzuki/.ssh/xxxx.pem' are too open.

外ユーザからアクセスできないようにし、自分のみにreadとwrite権限を付けることで解決した。
> It is required that your private key files are NOT accessible by others

```
# 所有者にreadとwriteの権限を付与
chmod 600 xxxxxxxxxxx.pem
```
【個人的備忘録】pythonのクロージャー

```
◎クロージャー
def b(a, b):     #aとbを引数に指定 
    def inner():
        return a + b
    return inner    #innerを返さずに処理
    
p = b(100, 50)    #pにbの関数を代入
k = p()           #さらにそれをkに代入
print(k)          #最後にkを出力(innerがここで返されて処理される)
```
[CakePHP 3.x] 孫要素の保存メモ

例として1つの注文 (Orders) に対して、複数のパッケージ (Packs) 、さらにその中に複数の商品 (Items) が入っている構造を考える。今回は一画面でこれらを一気に作成して保存までやってしまいたい

まずはEntityに対してassociationルールを設定する。今回はOrders と Packs, Packsと Itemsの間に `hasMany` 関係があるため親要素となるTableにそのルールを記述する。

```php:OrdersTable.php
...(前略)
public function initialize(array $config)
{
    $this->hasMany('Packs', [
        'foreignKey' => 'order_id'
    ]);
}
...(後略)
```


```php:PacksTable.php
...(前略)
public function initialize(array $config)
{
    $this->hasMany('Items', [
        'foreignKey' => 'pack_id'
    ]);
}
...(後略)
```

テンプレートは以下のように書く。　`cake bake template order` で生成されたものをベースにするといい。子要素、孫要素の名前の後に `.[数字]` を入れると数字ごとに関連づいて保存される。

```php:Orders/add.php
<?= $this->Form->create($order) ?>
<?= $this->Form->control('name') ?>
<?= $this->Form->control('date') ?>
<?= $this->Form->control('packs.0.name') ?>
<?= $this->Form->control('packs.0.items.0.name') ?>
<?= $this->Form->control('packs.0.items.1.name') ?>
<?= $this->Form->control('packs.1.name') ?>
<?= $this->Form->control('packs.1.items.0.name') ?>
<?= $this->Form->control('packs.1.items.1.name') ?>
<?= $this->Form->control('packs.1.items.2.name') ?>
<?= $this->Form->end() ?>
```

add アクションの中でリクエストを表示するとこんな感じ

```php:OrdersContoroller.php
function add() {
    var_dump($this->request->getData());
}

/* 出力結果
[
    "name" => "ほげほげ",
    "date" => "2018-12-21",
    "packs" => [
        0 => [
            "name" => "hogehoge",
            "items" => [
                0 => [
                    "name" => "ほげほげ"
                ],
                1 => [
                    "name" => "ほげほげ"
                ]
            ]
        ],
        1 => [
            "name" => "hogehoge",
            "items" => [
                0 => [
                    "name" => "ほげほげ"
                ],
                1 => [
                    "name" => "ほげほげ"
                ],
                2 => [
                    "name" => "ほげほげ"
                ]
            ]
        ]
    ]
]
*/
```

保存するときもassociationルールを設定する必要があるので注意

```php:OrdersController
$order = $this->Orders->newEntity();
$order = $this->Orders->patchEntity($order, $this->request->data, [
    'associated' => [
        'Packs' => [
            'associated' => [
                'Items'
            ]
        ]
    ]
]);
$this->Orders->save($order)
```

これで保存が完了する。
デフォルトのpatchEntityだと子要素までしか見てくれないみたいなので、
patchEntity に association ルールを書くと孫要素までEntityとして変換してくれる。

saveした段階でEntityになると勘違いしてsaveメソッドにassociationルールを書いて詰まったのでメモしておく
yarnをMACにインストール

使用状況 -v

* Mojave 10.14.2
* Homebrew 1.8.6

***

### [yarn](https://yarnpkg.com/ja/docs/install#mac-stable)

homebrewからインストール

```
brew install yarn --without-node
```

新しいバージョン通知が来たらアップグレードする

```
brew upgrade yarn
```

***
###memo
反省点
node.jsはnodebrewを使用。
普通にインストールすると node と icu4c も入るので`--without-node`をつける。
気がついたら、icu4c がインストールされているのは yarn を入れてる時にインストールをされてたんだと...
今更ながら、気づく...

***
* [npmのパッケージをインストール](https://www.npmjs.com/)
* [使い方の詳細](https://yarnpkg.com/lang/ja/docs/cli/add/)

```
yarn add <package...>
```

個人的に、よく使うパッケージのメモ

```
//アニメーション,animate css
yarn add animate-sass --dev

//スタイルシート,bootstrap
yarn add bootstrap

//絵文字,font awesome 
yarn add font-awesome

//スライダー,slick carousel
yarn add slick-carousel

```
[animate css](https://www.npmjs.com/package/animate-sass)などは ```--dev```で、複数のパッケージをインストールして必要なものだけインストールして使う事が多いです。

***
Max OS X: NTPがCPUを食い尽くす

## お前かー！！！！
最近どうもMACのCPU使用率が、きれいに50%使いつくされている状況があり。
どうやら調べたらこれがヒットしていて、

https://discussions.apple.com/thread/7390949?answerId=29515234022#29515234022
要するにUnreachableなNTPを参照してるとCPU食うよ、ということらしい。

僕のMACは会社のドメインに参加しているので、VPNがキレてるとNTPにUnreachableになりCPUを回すという。


ヤレヤレ、、、
Vue.js 算出プロパティを活用すべきというお話

#はじめに
私自身、あまり説明書を読まない派の人間です（子供の頃は熟読してたけどいつの間にか変わっていた）。
なにかしらの技術を新しく学ぶとなったときももちろん勉強のフェーズではドキュメント読んだり参考書読んだりするわけですが中々隅々まで目を通せていないことが多いです。これが原因でソースレビューで「これ使ったほうがいいよ」と便利・有用なモノを教えてもらうこともしばしば。

今回は私と似た性格の人・Vueをこれから学ぶよって方へ向けた、Vueの「算出プロパティ」について紹介します。

#算出プロパティとは
あるデータに依存しているデータ（Aを元に生成されるBのような）がある場合、Vueでは何種類かの実装手段があります。
文章だと分かりづらいのでまずは例を・・・
入力値「苗字」と「名前」（上の説明でいうA）を元に、フルネーム（上の説明でいうB）を表示する処理を各手段ごとに書いてみました。
<img width="271" alt="スクリーンショット 2018-12-21 16.38.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/314386/d668c80e-a22c-40e4-77cb-9e1edcfcaa93.png">

↑こんな感じです。各ケース、入力値に応じてフルネームがリアルタイムで更新されます。

・テンプレートに直接書く方法

```vuejs 
<div id="test">
  苗字<input v-model="lastName"><br>
  名前<input v-model="firstName">
  <p>Full Name: {{ lastName + ' ' + firstName }}</p>
</div>
```
```javascript 
var vm = new Vue({
  el: '#test',
  data: {
    lastName: '',
    firstName: '',
  }
})
```
この例の処理くらいだったらまだマシですが、基本的にテンプレートに処理は書きたくないですよね。

・処理をメソッドに切り出す方法

```vuejs 
<div id="test">
  苗字<input v-model="lastName" v-on:keyup="updateName"><br>
  名前<input v-model="firstName" v-on:keyup="updateName">
  <p>Full Name: {{ fullName }}</p>
</div>
```

```javascript 
var vm = new Vue({
  el: '#test',
  data: {
    lastName: '',
    firstName: '',
    fullName: ''
  },
  methods: {
   updateName: function () {
      this.fullName = this.lastName + ' ' + this.firstName
    }
  }
})
```
無事にテンプレートから処理を切り出すことができました。
しかし、たったこれだけのことなのにテンプレート側がややごちゃごちゃしてしまいました。

・監視プロパティで実装する方法

```vuejs 
<div id="test">
  苗字<input v-model="lastName"><br>
  名前<input v-model="firstName">
  <p>Full Name: {{ fullName }}</p>
</div>
```

```javascript 
var vm = new Vue({
  el: '#test',
  data: {
    lastName: '',
    firstName: '',
    fullName: ''
  },
  watch: {
    lastName: function (val) {
      this.fullName = this.lastName + ' ' + this.firstName
    },
    firstName: function (val) {
      this.fullName = this.lastName + ' ' + this.firstName
    }
  }
})
```
watchを利用してlastNameとfirstNameの更新を監視しており、更新があったらfullNameを再生成する動きです。methodsでの実装と比較するとテンプレート側はスマートになりますが、処理側が冗長になっています。

・算出プロパティ

```vuejs 
<div id="test">
  苗字<input v-model="lastName"><br>
  名前<input v-model="firstName">
  <p>Full Name: {{ fullName }}</p>
</div>
```

```javascript 
var vm = new Vue({
  el: '#test',
  data: {
    lastName: '',
    firstName: ''
  },
  computed: {
   fullName: function () {
      return this.lastName + ' ' + this.firstName
    }
  }
})
```
いかがでしょうか。パッと見でもスマートになった感があると思います。
算出プロパティであるfullNameは、依存するデータ（lastName,firstName）に**更新が入ったときのみ**自動で処理が実行され、**キャッシュされます**。
つまり、依存するデータに更新がない状態で再描画が走っても処理は実行されず、キャッシュから即時にデータを取り出します。この程度の処理であれば差を感じることはありませんが、Vue側で膨大な量のデータを加工しないといけないといったケースにおいてはマストで利用していきたい機能です。



#デメリット
処理実行頻度の制御など、一部のケースにおいて算出プロパティでは実現できないものが存在します。（公式ドキュメントに例があるのでそちらを参照願います）
https://jp.vuejs.org/v2/guide/computed.html#%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81%E3%83%A3

#あとがき
先に述べましたが、実際算出プロパティを使わなくても実装上は困らないためドキュメントをあまり読まない人は知らずに実装進めちゃいそうだなと思い（自戒も込めて）紹介させていただきました。
可読性やパフォーマンス面等において利用できるならしたほうがいいケースがほとんど（できるのにあえてしないケースが思い浮かばない）ではないでしょうか。
ReluxにおいてVueを利用するかどうかはまだ検討中ですが、利用するときはまず「算出プロパティが適用できるか」から考え、それが難しかった場合に適宜ウォッチャ等で実装していくという進め方を心がけていこうと思います。
WLinuxでシェルを変えてはまった話

2018年12月21日現在、Windows 10のMicrosoft StoreよりWLinuxというディストリビューションをインストールすることができます。（そして、現在バーゲン中）

使いたい方はこちらをご一読されるのがお勧めです。
[WLinux を Windows 10 で使う最小手順 by @ma2shita ](https://qiita.com/ma2shita/items/d2785e023b26f5b2e7ae)

私はSHELLを変えてはまったので、解決までの流れを書いておきます。

## TL;DR

現状、zshやfishをお使いになるときは /etc/profile と /etc/profile.d 以下の必要項目が起動時に読まれるように修正が必要です。

## Shellを変えてはまった

インストール直後にwlinux-setupを実行すると、カスタマイズができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/35cefac2-ff01-b293-19c6-236a4bc3144a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/663f46d3-d2f7-cbf7-705f-b798ab01bc3b.png)

魅力的なメニューが並ぶので片っ端からアスタリスクを入れてインストールしてみました。（なお、インストール時間がとてもかかるので段階的にインストールすることをお勧めします）

このメニューの中にSHELLSというのがあり、zsh,csh,fishがインストールできます。筆者は普段zshを使っているのでインストールしてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/13ef3897-acb8-6e4b-ab62-77ad91dd1ed3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/df1961eb-0fba-d413-83b3-76b010d733c7.png)

oh-my-zshのインストールも聞いてくる気の利きようです。

インストール後にchshにてシェルを変えると普通に使えます。(Pathは/usr/bin/zsh）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/ca8a88ae-6818-e999-12c7-72044d4cb8c9.png)

これでTABキー連打でファイルが選べますな。らくちん。

その後、ほかにもインストールしてみようと再度wlinux-setupを実行してみると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/ba12b7cc-4890-3761-3247-e5926e0b3c38.png)

おおお。もしかして・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/8da9a66e-8725-faac-6a2a-734b8ed8aef5.png)

dockerも使えなくなっている。

さて、調べましょう。。。

## bashの起動時に起きていることを思い出す

原因として考えられるのは環境変数とaliasの設定かなと。ではと.bashrcを見てみましたがそれらしいのがありません。次に見るところは/etc/profileです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/0d1ee380-c926-115b-6ee4-658336e1103f.png)

という行があります。これで一つ目の問題は解決です。

次にDockerですが、/etc/profile.d/以下を見てみましょう

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2080/e729fc9a-6e69-88a8-698d-fbdc12c4c0f6.png)

ああ、なるほど。つまりBashが起動するときに/etc/profileが参照され、次に/etc/profile.d以下が実行されます。そのため、zshやfishを使うとこの部分が省かれてしまい不具合が起きていたことになります。

・・・あれ？

zshって起動時に/etc/profileを読むんじゃなかったっけ？まぁいいや。
(oh-my-zshやoh-my-fishを使うようにしたからか？）

## まとめ

ということで、WLinuxでzshやfishをお使いになるときは/etc/profileの中の必要な項目と/etc/profile.d/以下の必要なものを読み込むように調整しましょう。
単一カメラで、顔の３Dモデルを得る

顔の３Dモデルを得るのに、高価な深度カメラやステレオカメラを使う必要はありません。汎用の安価な単一カメラ（英語だと、モノキュラーカメラ）でも可能です。

画像の複数フレームが必要なので、人の顔の映像（画像ストリーム）を得ていることを前提にします。

コードを載せると長すぎるので、処理の概略を載せておきます。

まず、OpenCVなどで、顔の特徴点を決め、画像フレームから特徴点を得られるようにしておきます。

###顔の特徴点のXY位置決め。

正面視時に、相続くフレームから特徴点位置が安定したフレーム群を得て、位置の平均を３DモデルのうちのXY位置とする。なお、人の顔のXYは、左右対称ではないですね。

###顔の特徴点のZ位置決め。

相続くフレームから特徴点位置が安定したフレーム群における特徴点の位置平均を、何個かサンプリングしてとっておく。これらをzモデルの評価に使う。

RANSAC方法で、最適なｚを決め、先のxyに合わせて、３Dモデルとする。

RANSAC方法とは、仮説をランダムに生成して、評価することを繰り返して、最も評価値がよかったものを採用する、という方法です。具体的には、数百回ないしベストな評価値の改善具合がほとんどなくなるまで、以下を繰り返す。

1.　モデル仮説生成：
唇は鼻の頂よりも奥にある、目頭は左右同じｚ、などというHeuristicsも利用して、特徴点群のもっともらしいｚ値をランダムに生成する。それで３D仮説とする。

2.　モデル評価：
2.1.　3D仮説モデルをもとに、サンプルしておいた各フレームの特徴点群に対し、OpenCVを使い、以下を行う。
(1) FacePose（カメラと顔座標系の関係）を推定する。
(2) FacePoseを使い、３D仮説をカメライメージ平面に投影し、投影点と、フレーム内特徴点の実測位置と、の距離(誤差）の和を求める。
2.2.　各フレームの距離の和の合計を、この３Dモデルの評価値とする。

そして、最も評価値(誤差）の小さいモデルを採用する。
　　

なお、特徴点位置とモデルからFacePoseが計算できる。2フレーム間で、FacePoseの含むカメラに対する顔の角度差と、特徴点位置差とから、三角関数を使って計算すれば、ある特徴点のZを得ることができる。その方法を試したが、いい結果が得られなかった。FacePoseはモデルに依存し、モデルの計算はFacePoseに依存するという循環がある上に、顔角度、特徴点位置いずれも誤差込々だし、ｚの値を安定させていくには、繰り返し法(日本人は、動的計画法を生み出したときから、繰り返し法が、好きみたいね）など複雑な手順が必要になる。それよりは、素早くRANSACで計算したほうがよい。
NSAttributedStringを空文字で生成すると2度とAttributesを取り出せなくなる

# 環境

Swift4.2.1

# 本題
   
例えば、以下のようなコードを書いて、xibやstoryboardで設定したattributesを取り出そうとします。

```swift 
extension NSAttributedString {
    var allAttributes: [NSAttributedString.Key: Any] {
        return self.attributes(at: 0, effectiveRange: nil)
    }
}
```

すると、文字列が空(`isEmpty == true`)の場合に`NSRangeException`で落ちます。

### 😱

`attributes(at:effectiveRange:)`のDiscussionに記載がある通りです。

> Raises an rangeException if index lies beyond the end of the receiver’s characters.
> For a list of possible attributes, see Character Attributes.

文字列がからの場合は、`at: 0`が存在しないのでCrashするわけですね。

### 結果無理

# 回避策

### 空文字列でNSAttributedStringを生成しないようにする

以下のようにUILabelのExtensionでisEmptyにならないように、空の場合は**半角スペース**を入れるようにする。
これなら上で作ったExtensionがバグることもない。

```swift
extension UILabel { 
     func updateAttributedText(_ text: String) { 
         // スペースいれておかないと、allAttributesが空文字で設定したAttributesを返さなくなる 
         let string = text.isEmpty ? " " : text 
         self.attributedText = NSAttributedString(string: string, attributes: self.attributedText?.allAttributes) 
     }
}
```

### そもそもxibやstoryboardでattributedを設定しない

そもそもxibやstoryboardでattributedを設定しなければ、`self.attributedText?.allAttributes`を使わずに、以下のように毎回`attributes`を生成して設定すれば良い

```swift
extension UILabel { 
    func setAttributes() {
        // lineSpace設定
        let pStyle = NSMutableParagraphStyle()
        pStyle.lineSpacing = 3
        let attr = [NSAttributedString.Key.paragraphStyle: paragraphStyle]
        // 文字色設定
        attr[NSAttributedString.Key.foregroundColor] = .red
        self.attributedText = NSAttributedString(string: self.text, attributes: attr)
    }
}
```

### あきらめる

最悪Crashしないように`isEmpty`だけはチェックしとく

```swift
extension NSAttributedString {
    var allAttributes: [NSAttributedString.Key: Any] {
        if self.string.isEmpty {
            return [:]
        }
        return self.attributes(at: 0, effectiveRange: nil)
    }
}
```

# 最後に

最近IB系の調子が悪いので、使わないほうがいいんじゃあないかなーと思ってきました。
Attribute周りはコードでやったほうが良いのかもしれません。
homebrewのパスを通す

使用状況 -v
* monterey 12.0.1 intel
デフォルトのパスが変わったのね...
***

###デフォルトシェルのチェック

```
echo $SHELL
```
* ~/zshの場合：.zshrc
* ~/bashの場合：.bash_profile

bashrcとzsh、bash_profileがあるか確認

```
ls -al
```

bashrcとzshrc、bash_profile作成

```
$ touch .bashrc
$ touch .bash_profile
$ touch .zshrc
```

.bashrc に以下のパスを追加

```
export PATH="/usr/local/bin:$PATH"
```

.bash_profileに書き込み

```
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

パスを通す

```
$ source ~/.bashrc
$ source ~/.bash_profile
$ source ~/.zshrc
```

***
### memo

反省点
パスを通すのを直ぐに忘れてしまう...
***
WordpressにFlamingoを入れるべきではない

1年以上前に[ハッキングされたWordpressから難読化されたコードを見つけた件](https://qiita.com/mikkame/items/eec33df6863ed81740c2)を書いたんですが
また献体をもらったので思ったことを書きます（献体とは関係ない、なお本業とも関係ない）

# Contactform 使ってますか？

問い合わせフォームを作るやつです。
8割方入っている印象があります。
そんなContactformですが、お問い合わせ内容は保存されません。
送信された瞬間に、メールが配信されて終わりです。
メールなくしちゃったらどうしよう？
問い合わせがロスしてしまうので困りますよね。

そんなときに・・・

[Flamingo](https://ja.wordpress.org/plugins/flamingo/)をインストールすると
問い合わせ履歴がWP上で確認出来ます。便利ですね。

# 便利なのになんで駄目？

**改竄されるWPサイトが多すぎる問題**

もうコレに尽きます。
身の回りだけでも毎月1回ぐらい改竄されたって聞きます。
おそらくもっと多くのWPが日常的に改竄されているはずです。

改竄を受けるWPでは攻撃者は下記の捜査をできる事がほとんどです。

- 任意のファイルを設置できる（改竄）
- 管理者ログインを行う
- WP上のデータ閲覧
- サーバから任意のメール発信

これらの事が出来てしまいます。

# で、何が言いたいかというと

**改竄を受ける確率が高いWPに大切なデータ(顧客情報)を置くのは避けた方がいい**

- メールは無くさずに管理する（フィルタ処理でコピーしてアーカイブ残す）
- CRMにメールなげてそのまま管理してもらう
- contactformではなくEFOのSaaSを入れる

など他にもやりようがあると思うので、絶対に入れるなとは言いませんが
改竄受けたらサイトが見れるだけじゃなくて**中に入っているデータも盗られる可能性大**なので
**リスクを考慮した上で導入**を検討して欲しいと思います。



PS.

- そもそも改竄されたら保持してなくても抜かれる可能性ある
- WPは改竄されるという先入観は捨てるべき？
PostgreSQLのJSON型のカラムにインデックスを作成した

## 経緯
担当プロダクトでPostgreSqlを使用しているのですが、JSONBのカラムに検索をかけている箇所があり、全文検索となっていました。

これまでの開発経験で配列形式のカラムを使用したことがなかったため、インデックスなんて貼れないと思っていました。


## DB構成

バージョン：9.4.15
AWS　RDS　インスタンスタイプ：db.m4.large

## テーブル構成
JSONB型カラムが設定されているテーブル構成は次のとおりです。

```
mpv=> \d image_files
                                          Table "image_files"
   Column    |            Type             | Collation | Nullable |                Default
-------------+-----------------------------+-----------+----------+----------------------------------------
 id          | integer                     |           | not null | nextval('image_files_id_seq'::regclass)
 file_type   | integer                     |           |          |
 chksum      | character varying(128)      |           |          |
 savedpath   | character varying(200)      |           |          |
 created_at  | timestamp without time zone |           | not null |
 updated_at  | timestamp without time zone |           | not null |
 tiff_chksum | character varying(50)       |           |          |
 dhash       | character varying(20)       |           |          |
 meta        | jsonb                       |           |          |
 kind        | integer                     |           | not null | 1
Indexes:
    "image_files_pkey" PRIMARY KEY, btree (id)
    "index_image_files_on_chksum" btree (chksum)
    "index_image_files_on_dhash" btree (dhash)
    "index_image_files_on_file_type" btree (file_type)
    "index_image_files_on_kind" btree (kind)
    "index_image_files_on_tiff_chksum" btree (tiff_chksum)


```

metaというカラムがjsonbカラムに該当し、
静止画像や動画キャプチャのハッシュ値を複数アルゴリズムで解析したハッシュ値、サイズなどを格納しています。
動画と静止画像の違いで格納するデータが変わるためJSON型を採用しています。

## CREATE INDEX

テーブルはrailsのActiveRecordで管理しているので、マイグレーションを作成しました。

インデックスタイプはGINを使用します。

```XXXX_add_indexes_to_image_file.rb
class AddIndexesToImageFiles < ActiveRecord::Migration
  def up
    add_index :image_files, :meta, using: :gin, :name => 'index_image_files_on_meta_using_gin'
  end
  def down
    remove_index :image_files, :name => 'index_image_files_on_meta_using_gin'
  end
end
```

再度テーブル構成を出してみて、metaカラムにGINインデックスが作成されていることが確認できました。

## SQLの修正

SQLはlambdaで定義したプログラムから発行されているのですが、
詳しく調べていないのですが、以下のSQLではインデックスが使用されませんでした。

```before
SELECT
	id
FROM
	image_files
WHERE
	kind = 1
AND
	(meta->'avghash'->>'1p' = 'aaaa' OR meta->'phash'->>'1p' = 'bbbb OR meta->'dhash'->>'1p' = 'cccc')
	
```

`＠>`を使用する形式に書き換えました。

```after
SELECT
	id
FROM
	image_files
WHERE
    kind = 1
    AND 
      (
        meta @> '{"avghash": {"1p": "aaaa"}}'::jsonb
      OR
        meta @> '{"avghash": {"1p": "aaaa"}}'::jsonb
      OR
        meta @> '{"avghash": {"1p": "aaaa"}}'::jsonb
      )
```

## インデックスを使用しているか
explainしてみます。

```explain(一部抜粋)
  ->  Bitmap Index Scan on index_image_files_on_meta_using_gin  (cost=0.00..813.62 rows=749 width=0)
        Index Cond: (meta @> '{"avghash": {"1p": "aaaa"}}'::jsonb)

```

問題なくIndexScanが行われていました。


## 最後に

今プロダクトでは使用してないので情報を追ってなかったのですが、MySQLも5.7からJSON Data Typeに対応したみたいですね。

インデックスも貼れるみたいです。
機会があれば試してみたいと思います。
想いとシビックテックで変わる社会

私がシビックテックというものに関わって早くも5年が経ちました。
Code for Kanazawa、Code for Japanの設立から始まり、各地でシビックテックのコミュニティが続々と立ち上がって、現在では80を超える団体が活動しています。各団体の活動のスタイルも様々で、市民活動団体を基本に、一般社団法人やNPOなど、様々な形で活動されています。多くの活動がある分、考え方やアプローチの仕方が違うので、アドベントカレンダーを機にまとめてみようと思います。
![startup-594090_1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/101800/663304a7-8f34-4efb-4879-17b004dfb9f4.jpeg)


## そもそも、シビックテックって何だっけ

原点回帰ではないけれど、シビックテックというものを再確認してみよう。
シビックテックは、Civic（市民）とTech（技術）を掛け合わせた造語で、市民が自らの手を動かしながら、行政サービスの問題や社会課題を解決していくという活動である。この活動は、市民が望むもの・必要と思うものを自発的に（DIY的に）作るもので、対価を求めて行動するものではなく、まず欲するがままに行動するというところが特徴的である。

シビックテックとよく一緒に出てくるのが「オープンデータ」である。
オープンデータは、改変・商用問わず誰でも自由に利用できるデータのことで、例としては、国や行政のデータ（みんなのデータ：税金が充てられていることに由来）が挙げられることが多い。

一時期、オープンデータを使って課題を解決しよう、というデータドリブン（データ起点）の動きが流行ったが、本来のシビックテックは課題ドリブンの動きであって、課題を解決するために何ができるか、であったり、地域を盛り上げるためにはどうテクノロジーを使ったらいいか、という考え方である。

つまりシビックテックは、基本的に草の根から始まる動きを指す。
前途のように、シビックテックは基本的に「対価を求めて行動するものではない」ので、成果物が本当に必要とされるモノであった場合、社会の中で運用・維持していくために、維持管理コストの負担や運営体制の面で現状確立されているものがない、というのが課題である。

## シビックテックが与える様々な影響

シビックテックが与える影響は非常に多様なものがある。
Civic Tech Forum 2018で生駒の事例を取り上げてお話したが、シビックテックは単なるボランティア活動ではなく、周囲のコミュニティのあり方・コミュニティ間の繋がり・人の考え方など、様々な面で影響を与えている。お金に換算できない価値を生みだしているモノである。

シビックテック・インパクト 〜生駒から生まれた繋がり〜
https://speakerdeck.com/takuya310/2018-dot-6-2-sibitukutetukuinpakuto-sheng-ju-karasheng-maretaxi-gari

## デジタルガバメントとシビックテック

日本では、「官民データ活用推進基本法」が2016年に成立した。
この法律は、行政データの流通環境の整備や行政手続きのオンライン化の原則化など、日本の行政でIT化が遅れている部分の底上げが期待される法律だ。そして、これを具体的に推進していくために「世界最先端デジタル国家創造宣言・官民データ活用推進基本計画」が閣議決定されている。ここには書ききれない容量なので、下記URLを参照されたい。

デジタル・ガバメント計画
https://cio.go.jp/node/2422

世界最先端デジタル国家創造宣言・官民データ活用推進基本計画
https://cio.go.jp/data-basis

これらに基づき、行政側のデジタル化を支援することで地域を良くしていく・変えていくという手法がある。
政府（ガバメント）側にテクノロジーを導入する支援をしたり、政府側が内部に抱えている課題を解決していく、GovTech（ガブテック）である。
Code for Americaで、フェローを行政内部に派遣して行政のカタチを変えていくように、Code for Japanでも、自治体の中でのデータ利活用の推進、自治体とスタートアップを融合したサービス開発、行政が開発するシステムにアジャイル開発手法を持ち込むなど、様々なアプローチでチャレンジしている。

GovTechにおいても、最終的には行政の成果物をつくるという上で、市民側の意見や考え方を捉えるシビックテックの考え方が重要になってくる。Code for Japanでは、それらを繋ぐ架け橋となるべく挑んでいる。

## シビックテックはどうやって維持していくか

最後に、シビックテックの成果物についてまとめておきたい。
シビックテックの成果物は、前途のようにコストの負担や運営体制の面が課題となり、どうやって維持していくかが課題となっている。

アーバンデータチャレンジや、LODチャレンジ、インフラデータチャレンジ、MashupAwards（シビックテック部門）など、シビックテックに関するアプリコンテストが多く開催されている。年々応募数は増加し作品のレベルが向上しているだけに、維持できないというのでは、かけたパワーが勿体無い。

アーバンデータチャレンジ
http://urbandata-challenge.jp/

LODチャレンジ
https://2018.lodc.jp/

インフラデータチャレンジ
http://jsce-idc.jp/

MashupAwards
https://ma2018.we-are-ma.jp/

草の根から生まれたモノを、きちんと世に送り出していきたい。
その想いが、様々なシビックテックの活動が集まる「Civic Tech Forum」で語られ、「Civic Tech Japan」の立ち上げが発表された。
Civic Tech Japanは、各地でシビックテック活動によって生まれたものをきちんと育て、維持していく仕組みづくりに挑戦するという団体だ。

会社で作ったわけでもないアプリが広まり、全国展開という段階になったら、誰がどう維持管理していったらいいのだろう。そんなシビックテック側の悩みに寄り添う団体を目指している。

## 総じていうと

アプローチは違えど、どの活動にも共通しているのは「社会を良くしていこう」という想い。
「みんなでつくる」という考え方のもと、5年前には考えられなかった、新しい社会が少しずつ作られていく。
できる範囲で大丈夫。ぜひあなたも一緒に行動してみましょう。
ANNで使うBackpropagationのメモ


# はじめに
[この記事](https://qiita.com/ryouka0122/items/9acac34dfb04d78dcec1)で，書かずに終わってしまったBackpropagationについてメモします．
計算方法や実装は比較的容易なのに，理解するのにそこそこ時間がかかったので，整理して自分なりの備忘用にしてあります．

# どこで使うの？
人工ニューラルネットワーク(ANN: Artificial Neural Network)や深層ニューラルネットワーク(DNN: Deep Neural Network)の学習時に生じた誤差をネットワーク内に反映させる時に用いる手法が，Backpropagationである．
Backpropagationは，日本語では誤差逆伝播法と言うらしい．

# 計算方法
更新処理では，以下のコスト関数$J$をパラメータ$\Theta$で偏微分した値が必要になる．

```math
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
```

これは，パラメータ$\Theta_{ij}^{(l)}$すべてにおいて誤差を求めるというもの．一度にすべてを求めるのは現実的ではなく，それよりも効率の良い求め方がある．それが，Backpropagation Algorithmである．

以下のような4層ANNを例にBackpropagationの計算をしてみる．
![4層ANNモデル.png](https://qiita-image-store.s3.amazonaws.com/0/165030/5435dd6d-fa9c-c756-06a1-58cd5a97e140.png)

まず，入力値を$x$とするとForward Propagationの計算は以下のようになる．

```math
\begin{align}
a^{(1)} &= x \\
\\
z^{(2)} &= \Theta^{(1)}a^{(1)} \\
a^{(2)} &= g(z^{(2)}) \\
a^{(2)} &:= \left(\begin{matrix}
1 \\
a_1^{(2)}\\
\vdots\\
a_{s_2}^{(2)}
\end{matrix}\right)\\
\\
z^{(3)} &= \Theta^{(2)}a^{(2)} \\
a^{(3)} &= g(z^{(3)}) \\
a^{(3)} &:= \left(\begin{matrix}
1 \\
a_1^{(3)}\\
\vdots\\
a_{s_3}^{(3)}
\end{matrix}\right)\\
\\
z^{(4)} &= \Theta^{(3)}a^{(3)} \\
a^{(4)} &= g(z^{(4)}) = h_\Theta(x)
\end{align}
```

各層$l$にあるノード$j$の誤差を$\delta_{j}^{(l)}$とする．
そうして，各ノードの誤差$\delta_{j}^{(l)}$は以下のように計算する．

```math
\begin{align}
\delta^{(4)} &= a^{(4)} - y \\
\\
\delta^{(3)} &= (\Theta^{(3)})^T \delta^{(4)} \circ g^\prime(z^{(3)}) \\
\\
\delta^{(2)} &= (\Theta^{(2)})^T \delta^{(3)} \circ g^\prime(z^{(2)}) \\
\end{align}
```

$\delta^{(1)}$がないのは，入力値に誤差というものがないためである．
$g^\prime(\cdot)$は，活性化関数の導関数になる．Sigmoid関数であれば，$x(1-x)$となる．また，$\circ$はアダマール積であり，行列の要素同士の積算を表している．

各層の$\delta^{(l)}$を求めることができたら，更新値を次のようにして計算する．

```math
\begin{align}
\triangle_{ij}^{(l)} &= \sum_{i=1}^m a_j^{(l)}\delta_i^{(l+1)} \\

\frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta) &= \frac{1}{m}\triangle_{ij}^{(l)} + \lambda\Theta_{ij}^{(l)} \\
\end{align}
```

# まとめ
Backpropagationは簡単な計算しかしてなく，Forward propagationと似た実装である．
式が分からなくなったら，変数の次元数を確認していけば良い．
GUI(tkinter)を使い，時刻を表示する　No.1

#ターミナルではなく，GUIで時刻を知りたい．
このページは[ターミナルで時間を知らせる](https://qiita.com/ayousanz/items/e6508a0cd8e8901ec531)の続きに当たります．
##実現したいこと
・GUIを使い，現在の時刻を知らせる．

##使用するもの
tkinterを使い，GUIを使えるようにする．

##方法
```python
# ウインドウを作成し，時刻を出力する．このときに出力する時刻は，更新しないものとする．
from datetime import datetime
import tkinter
from tkinter import font
from time import sleep

root=tkinter.Tk()
root.title("timer")
today_time=datetime.now()
root.geometry("400x300")
label1 = tkinter.Label(root, text=today_time)
label1.pack(side="top")
font1 = font.Font(family='Helvetica', size=30, weight='bold')
root.mainloop()
```
##結果
<img width="401" alt="スクリーンショット 2018-12-21 09.44.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/241933/1184f674-ba6b-1826-c0e7-33f4dd4bf4a0.png">

##これから実現したいこと
・入力した時刻になったときにウインドウを作成する．
・ウインドウの時刻が適度に更新される．

##参考ページ
[Python3のtkinterによるクロスプラットフォームGUIアプリ作成入門] (https://myenigma.hatenablog.com/entry/2017/09/15/150945)

##続編
[GUI(tkinter)を使い，時刻を表示する　No.2](https://qiita.com/ayousanz/items/ac09dbfbb3d0f1d8a835)
Amazon ECRでDockerイメージを管理する

#はじめに
触る機会があったのでメモ代わりに手順をまとめます

#Amazon ECRとは？
Docker コンテナイメージを簡単に保存、管理、デプロイすることができるサービスです。

#AWS CLI のインストール
awsコマンドを使える状態にします。

```
$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo pip install awscli
```

#設定
aws configureコマンドを使って設定します。

```
$ aws configure
AWS Access Key ID [None]: *****
AWS Secret Access Key [None]: *****
Default region name [None]: us-east-1
Default output format [None]: json
```

#リポジトリ作成
CloudFormationでリポジトリを作成します。

```
Resources: 
  WebContainerRepository:
    Type: AWS::ECR::Repository
    Properties:
      RepositoryName: *****
```

#DockerイメージのPush

Dockerクライアントの認証に使用するログインコマンドを取得します。

```
$(aws ecr get-login --no-include-email --region us-east-1)
```

#Dockerイメージの作成
```
docker build -t ***** .
```

#DockerイメージのPush
```
docker push *****.dkr.ecr.us-east-1.amazonaws.com/sample:latest
```

#DockerイメージのPull
```
docker pull *****.dkr.ecr.us-east-1.amazonaws.com/sample:latest
```

#ライフサイクルポリシー
[ライフサイクルポリシー](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/LifecyclePolicies.html)
ライフサイクルポリシーを設定することで不要になったイメージを有効期限切れにしてくれます。
イメージを頻繁にPushするような環境であれば設定した方がいいかもしれません。
RSGT2019 スポンサーブースでスカベンジャーゲームをやる！

[「Regional Scrum Gathering Tokyo Advent Calendar 2018」](https://adventar.org/calendars/3359)の21日目の記事です。

## 昨日のお話

昨日はささささんの[「RSGTで転職した話」](https://sasakendayo.hatenablog.com/entry/2018/12/20/022619)でした。

私と共通点が多いささささんですが、なんとRSGT参加をきっかけに転職になり私と一緒にお仕事をされることになりました！

## 今日のお話

2019年1月に[Regional Scrum Gathering®️ Tokyo 2019](https://2019.scrumgatheringtokyo.org/)でyamanecoとしてスポンサーをさせていただきます！

そこで、どうすればスポンサーブースを楽しんでいただけるかいろいろ悩んだ結果、スカベンジャーゲームをやることにしました。本記事ちょっとネタバレしたいと思います。

<img width="702" alt="Screen Shot 2018-12-20 at 20.25.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/260796/38db7d91-f2a6-7a13-f64e-7f9f01d63e37.png">

### スカベンジャー何？

スカベンジャーハントはアメリカの大学などで行われるイベントで、ヒントを探し当てて次のヒントの手がかりとなる指示を得る、といったアクションを重ねていき、最終的に目的に辿り着く遊び（[weblio参照](https://www.weblio.jp/content/%E3%82%B9%E3%82%AB%E3%83%99%E3%83%B3%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%88)）です。

スポンサーブースにおいでの方に上記ような形でチャレンジをしていただきます！

### どうやって遊ぶ？

1. yamanecoブースに行く
2. スカベンジャーハントのパンフレットをもらう
3. チャレンジに挑戦する

### なにかもらえるの？

チャレンジをクリアできた方に賞品を差し上げます、当日ブーススタッフに問い合わせてください！

## 明日のお話

明日はやっとむさんの記事、[「心理的安全性について」]
(https://adventar.org/calendars/3359#list-2018-12-22)です！
やっとむさんは実は私が初めてアジャイルのトレーニングを受けて興味を持ったときの講師でした。

是非読んでみてください！
php-master-changes 2018-12-20

今日は配列初期化処理を小さなサイズの配列に強くする修正があった！

# 2018-12-20
## dstogov: Added specialized code for small arrays
- https://github.com/php/php-src/commit/d6f46522553a95dbab76a0feda3a5f060219aa83
- [昨日に続き](https://qiita.com/sj-i/items/0dd63c2baa353c991133#dstogov-added-specialized-code-for-small-arrays)配列初期化処理を小さなサイズの配列にもっと強くした