OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftの曜日表記について

Swiftで曜日の文字列で取得する際に、希望する表記方法にするためにはどうすればいいのだろうと少し考えたので自分用にメモ。


```swift
// 現在の曜日を3文字で返す(Sun, Mon, Thu etc...)関数
private func getDayOfWeek() -> String{
    let formatter = DateFormatter()
    formatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "EEE", options: 0, locale: Locale(identifier: "ja_JP"))
    return formatter.string(from: Date())
}
```
3文字にするためにはCalendarクラスを使うしかないかなー もしくは `EEEEEした文字列.prefix(3)`するしかないのかなーと思いましたが、よく探したらありました。

dateFormatのテンプレート対応表は以下になります。


|fromTemplate|表記|
|:-----------|:--|
|EEE|Sun|
|EEEE|S|
|EEEEE|Sunday|



曜日以外の表記方法一覧はここにあります。
http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns
ネイティブJavascriptオンリーでぐるなびAPIで遊んでみた

# やったこと
ネイティブJavascriptでぐるなびAPIで情報を取得し、HTML+CSSでグリッドレイアウトで表示してみました。

# ソースコード
相変わらずクソコードですがこちら（APIキーは隠しています）
https://github.com/gitk47320/gnaviapi/tree/master
一応実装のポイント？的なところ
・HTML/CSS
ごく基本的な事のみです。結局APIに情報渡すおよびJS側のparse結果を表示するだけなので。
あと今風？にgrid使ってタイルデザインチックなこともやってみました。レイアウトがちょっと詰まっていて不自然ですが。。。
・Javascript
APIで取得したJSONデータのうち「画像」「ぐるなび本体サイトへのリンク」「店舗名」をinnerHTMLで差し込んでいます。
HTML側でひな形（div id='shops'）とその子要素としてshopinfo0～10をハードコーディングしているので、Javascript的には
ここにJSONデータを差し込むだけですね。それ以外は特筆事項なし

# イメージ
![aaaa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239124/4fcf0eff-120a-aeb0-a6c6-bda83201a312.gif)

# 今後の課題（やるかは不明）
## 画面デザイン
もうちょっとCSS色々いじっていい感じのデザインにしたいですね。若干タイルデザインも不自然な感じですし。。。
## ハードコーディング箇所の改善
shopinfo0～9のところですが、ここも含めてJS側でHTML生成して差し込むようにしたい。
実はやろうと試みたのですが、shopinfo9のみが表示されて他は上書きされているような挙動となってしまったので
泣く泣く今回のような形としています。なんとかできると思うが。。。
GraphQL RubyでType定義してみた


# GraphQL RubyでType定義してみた

[「GraphQLを試してみた2 -RubyでGraphQLを試してみた-」](https://qiita.com/yhornisse/items/a30c01b69ed1789fb3c5)の記事の続き。
参考にしたのは公式の以下のページ。

https://graphql-ruby.org/type_definitions/objects.html

ちゃんと読めばこれだけで十分だったが、最初に変な勘違いをしてしまったので一応サンプルコードをメモとして記載。

```ruby:type.rb
require 'graphql'

class User < GraphQL::Schema::Object
  field :id, ID, null:true
  field :name, String, null:true
end

class QueryType < GraphQL::Schema::Object
  field :user, User, null:true
  def user()
    {'id'=>123, 'name'=>'Taro'}
  end
end

class Schema < GraphQL::Schema
  query QueryType
end

puts Schema.execute('query { user {name} }').to_json
```

```shell-session
$ bundle exec ruby type.rb
{"data":{"user":{"name":"Taro"}}}
```

スカラー型は以下のページを参照。

https://graphql-ruby.org/type_definitions/scalars.html

---

## Sinatraと組み合わせる

```:Gemfile
source "https://rubygems.org"

gem "sinatra"
gem "sinatra-contrib"
gem 'rack-contrib'
gem "graphql"
```

```ruby:hoge.rb
require 'graphql'
require 'sinatra'
require 'sinatra/json'
require 'rack/contrib'
use Rack::PostBodyContentTypeParser

class User < GraphQL::Schema::Object
  field :id, ID, null:true
  field :name, String, null:true
end

class QueryType < GraphQL::Schema::Object
  field :user, User, null:true
  def user()
    {'id'=>123, 'name'=>'Taro'}
  end
end

class Schema < GraphQL::Schema
  query QueryType
end

post '/graphql' do
  json Schema.execute(params[:query], variables: params[:variables]).to_json
end
```

```shell-session:サーバ側
$ bundle exec ruby hoge.rb
[2019-06-09 21:20:09] INFO  WEBrick 1.3.1
[2019-06-09 21:20:09] INFO  ruby 2.3.3 (2016-11-21) [x86_64-linux-gnu]
== Sinatra (v2.0.5) has taken the stage on 4567 for development with backup from WEBrick
[2019-06-09 21:20:09] INFO  WEBrick::HTTPServer#start: pid=2437 port=4567
```

```shell-session:クライアント側
$ curl -H 'Content-type: application/json' -X POST http://localhost:4567/graphql -d '{ "query" : "query { user {name} }" }'
"{\"data\":{\"user\":{\"name\":\"Taro\"}}}"%
```
UnityでgRPCを動かす #4 Android

ゴール：Unity(iOS/Android)でgRPCを動かす

* [UnityでgRPCを動かす #1 コンソールアプリ]
(https://qiita.com/nakaken0629/items/faf355db576542c2712c)
* [UnityでgRPCを動かす #2 Unity](https://qiita.com/nakaken0629/items/2cda78997befb71f7e3d)
* [UnityでgRPCを動かす #3 iOS](https://qiita.com/nakaken0629/items/0e2d6cdb7eb5283a7d34)
* UnityでgRPCを動かす #4 Android

開発環境：macOS Mojave + Unity 2019.1.5f1

今回はその４です。

# AndroidでgRPCのサンプルを動かす

[UnityでgRPCを動かす #2 Unity](https://qiita.com/nakaken0629/items/2cda78997befb71f7e3d)で別プロセスのサーバーを呼び出すよう修正したプロジェクトからスタートします。Build SettingsでPlatformを"Android"にしてください。

## ソースコードの修正

**この作業は、エミュレーター＋ローカルサーバーという環境でのみ必要な作業です。**

Androidエミュレーターから見ると、ローカルマシンのアドレスはlocalhost(127.0.0.1)ではなく10.0.2.2という特別なIPアドレスになっています。なので、接続先のサーバーのアドレスを修正します。

```cs:HelloWorldTest.cs
  public static HelloReply Greet(string greeting)
  {
    // 127.0.0.1から10.0.2.2に接続先のアドレスを修正する。
    // Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
    Channel channel = new Channel("10.0.2.2:50051", ChannelCredentials.Insecure);

    var client = new Greeter.GreeterClient(channel);

    var reply = client.SayHello(new HelloRequest { Name = greeting });

    channel.ShutdownAsync().Wait();

    return reply;
  }
```

## 実行

ソースの修正を終えたら、ビルド＆実行をすることで、エミュレーター上でクライアントが動作します。

<img width="404" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75307/59cbe191-14ef-888e-23a5-b61c40773b05.png">

# おしまい

以上、ゴールである「Unity(iOS/Android)でgRPCを動かす」が実現できました。
記事を書き始めた時は、gRPCでUnity対応が進んでいませんでしたが、１年弱経ったところでは専用のサンプルが用意されるくらいには、対応が進んでいました。この後も引き続き対応が進み、正式対応になってくると思います。
【PHP】JSONでPOSTされた値の取り出し方。file_get_contents("php://input") するようだ。

##$_POSTには何もなかった...

るんるん気分で普通にクライアント側からAjaxしてPHPにJSONをPOSTしました。いつも通りに。

しかし、$_POSTには何も入っていませんでした...array(0)みたいな。

公式に明記されていましたが、残念ながらPHPではPOSTデータを$_POSTで受け取れるのは「application/x-www-form-urlencoded」又は「multipart/form-data」のみとのこと。

> Content-Type に application/x-www-form-urlencoded あるいは multipart/form-data を用いた HTTP リクエストで、 HTTP POST メソッドから現在のスクリプトに渡された変数の連想配列です。
[PHP公式](https://www.php.net/manual/ja/reserved.variables.post.php) より

じゃあどうするのというと↓らしいです。

##PHPでJSONを受け取るにはこうするらしい⇒file_get_contents("php://input")

タイトルにも書いてますが、file_get_contents("php://input")するらしいです。

JSON値を受け取るサーバ側のコード

```php:mytest-api.php
// POSTされたJSON文字列を取り出し
$json = file_get_contents("php://input");

// JSON文字列をobjectに変換
//   ⇒ 第2引数をtrueにしないとハマるので注意
$contents = json_decode($json, true);

// デバッグ用にダンプ
var_dump($contents);
```

> php://input
で送信されたbody部を意味するので、それに対してfile_get_contentsしてあげればデータ部の文字列(JSON)が取れ、あとは普通にjson_decodeすればPHPオブジェクト(連想配列)にパースできる。

一応クライアント側も書いておきます。

```javascript
$.ajax({
	type: "POST",
	url: "./mytest-api.php",
	dataType: "json",
	contentType: "application/json",
	data: JSON.stringify({
                mytestdata: "hoge"
	})
})
```

前も調べたから今度はちゃんと覚えよう...
現場で潰しが効くディープラーニング講座（オンライン）応用数学課題レポート

応用数学： 
「第 1 章：線形代数」
固有値分解：正方行列の場合は、固有値を対角線上に並べた行列Aとそれに対応する固有ベクトルを並べた行列Vについて、AV＝VAとなり、A＝VAV（Vの右上に－1）。これにより、行列の累乗の計算が容易になる。
特異値分解：正方行列以外の行列Mについて、固有値分解に似たことをするためには、
Mv（vの上に→（ベクトル））=σu（uの上に→）
M（右上にT（転置行列））u（uの上に→）＝σv（vの上に→）
という特殊な単位ベクトルがあれば、特異値分解できる。
M=USV（Vの右上に－１）。算出式は割愛するが、例えば、ユーザーがどのような作品（動画など）を好むかを予測し、推薦するといったシステムのアルゴリズムを作成する際などに活用される。

「第 2 章：確率・統計」 
事象が発生する頻度（客観確率）に対して、信念の度合いで測るベイズ確率がある。複数の仮説に基づいて尤もらしさ（信念の度合い）を考え、実験や観測によって新しいデータを収集し、それらを組み合わせてベイズの定理によってその確率を改定するもの。スパムメールの発見などにも活用される。
共分散とは、２つのデータ系列の傾向の違いである。確率分布には、ベルヌーイ分布（２種類の結果のみ）、マルチヌーイ分布（複数の結果）、二項分布（ベルヌーイ分布の多試行版）、ガウス分布（釣鐘型の連続分布）がある。

「第 3 章：情報理論」 
自己情報量とは、（確率が決まっている）事象に対して定義される量であり、対数の底が２のとき、単位は、bit、対数の底がネイピアのとき、単位は、nat。
エントロピーとは、確率分布に対して定義される量で、シャノンエントロピーとは、自己情報量の期待値であり、すべての情報を得たときに、ゼロになる。
カルバック・ライブラーダイバージェンスとは、同じ事象・確率変数における異なる確率分布P、Qの違いを示し、２つの分布の違いによる情報量の違いを示す。次元削減や機械学習で活用する。交差エントロピーとは、KLダイバージェンスの一部分を取り出したもので、事前に考えていた情報に対して、現実がどれだけかみ合っているかを考えるもの。
主なIonicのライフサイクルイベント

Ionicのライフサイクルイベントのメモ。

# ionViewDidLoad
ロードされた時に実行される。DOM要素やカスタムコンポーネントにアクセスしたい時に利用する。
# ionViewWillEnter
ページがアクティブになる直前に実行される。イベントの登録やデータ取得に利用する**nav.pop()**で戻ってきた時には実行されない。
# ionViewDidEnter
ページがアクティブになる直前に実行される。**nav.pop()**で戻ってきた時も実行されるので、データを常に最新にしたい時に利用する。
# ionViewWillLeave
ページが非アクティブになる直前に呼ばれる。イベントを破棄する時に利用する。
# ionViewDidLeave
ページが非アクティブになった時に呼び出される。
# ionViewWillUnload
ページが非アクティブになって破棄される直前に呼び出される。
# ionViewCanEnter
ページを離脱してするかどうかの判定を行う。**return ture**だと離脱するが、**return false**だと離脱せずに留まる。
AWS 認定 Solution architect - Professional受験後のメモ

# 受験当時
## 当時の前提
- 入社2年目で、AWS関連業務を半分、それ以外の業務を半分やっています。
- AWSを触って１年くらいでした。
    - ただ、主にCloudFormation、CodeCommit、Lambda,DynamoDB,SNSあたりで、ArchitectというよりDeveloperに近いサービスを触っていました。
    - ELB、DirectConnectなどはどういうサービスか理解しているくらいでした。
    - Organizationsはそこそこ触っていました。
- Solution architect - Associateを取得して、6か月前に取得しました。
- 一応、応用情報技術者試験(AP)も持っていました。

# 勉強方法
## Advanced Architecting on AWSの受講(３日間)
- Professionalの試験内容に沿って、講義を進めてくれます。
- 業務では触たことないサービスを触ることができ、すごく役に立ちました。
- グループディスカッションもとてもよかったです。
- 私が受けた回はAWS触って１年未満の方が多かったのが印象的でした。

## 模擬試験を受験
- Associateの合格の時にもらったバウチャーを利用しました。
- 問題の傾向は把握できましたが、やはり不安だったのでUdemyで過去問を解きました。
- ちなみに、結果は40％で不合格でした…

## Udemyの過去問をし解く
- セールを狙い過去問を購入しました(1800円～2500円くらいだったと思います)
    -  [aws-solutions-architect-professional-practice-exams-2018](https://www.udemy.com/aws-solutions-architect-professional-practice-exams-2018/)
    -  もちろん英語なので、Google翻訳様の力をお借りしました。
- 間違った問題は解説を読み、Advanced Architectingの研修時のメモをもう一回確認しました。
- 間違いが多い分野は該当サービスのBlackBeltを読み、Youtubeで公開されているセミナーを見ました。
    - [クラウド活用事例集](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
    - [BlackBeltのYoutuebのプレイリスト](https://www.youtube.com/playlist?list=PLzWGOASvSx6FIwIC2X1nObr1KcMCBBlqY)

## qwiklabs
- サブスクリプションを決済して、ProfessionalのQuestを実習しました。
- 旧型式(2019年2月前の試験)の内容ですが、普段触ることないサービスを触ることができたのでよかったです。

# さあ、受験へ
## 受験場所
 - webカメラで受験者を監視、英語のチャットで指示を受けるというテストセンターもあるようですが、私が受けたところは普通にPCで受験するようなところでした。(部屋はカメラで監視されていましたが)

## 試験について
- 受験したのは3月だったので、ちょうど新しい形式の問題に変わったごろでした。
- 170分で80分解くのはやはり大変でした。
    - 認定のページでは170分と書かれてますが、PSIサイトを見ると180分と表示されてますね。どっちが正しいんだろう…
- 30分くらい残して全問題解いて、残りの時間は問題を見直してました。
- 緊張したせいか、途中からトイレにいきたかったです…

## 結果
- 合格でした。
- 後に来たレポートを見ると770点のギリギリ合格でした。
    - 合格ラインは750点です。
- 各カテゴリの評価は全部「十分な知識を有する」でした。とういうことは、どのカテゴリもギリギリ点数だったとういうことか…

## 感想
- 3か月前のことなので忘れてしましたが、私の時は移行(migration)周りの問題が多かった印象でした。
- 結果を達成するために、いくつがある方法で提示された条件(コストを抑えたいとか)から最適な方法を探す問題が多かったです。
    - なので、各方法の向き不向き(SnowballとSnowmobileの違いとか)を知るのが大事だと思います。
- Organizations周りは業務での経験があったので、自信もって解けました。やはり、業務で直接触るのは大事ですね。
    - うまく説明できないんですが、qwiklabsなどの実習では、「こういう構成システムを作りましょうー」で単純に作っていて知識を覚えるだけですが、業務の場合は「このアカウントにこういう制限をつけたい」という目的があって、手段を考えて実施するのでより深く理解できるのかなと思いました。
- 3年後にはもうちょっと高い点数で更新したいです！

## 出たサービス(覚えている限り)
- organizations
* snowball
* directconnect
* opswork
* workflow
* 暗号化(S3のカスタマー暗号化とサーバサイド暗号化)
* storage gateway
* cloudfront(キャッシュや証明書関連)
* cloudtrail
* cloudwatch
* migrationサービス(SMSとかDMSとか)
* kinesisとSQS
* vpc peering
* HSM
* S3
* リザーブドインスタンとスポットインスタンス
* praivate link
* elastic cache
* ELBあたりとか
* Route53
* DDos関連は出なかった…(WAFとかshieldとか)
Python3でnfcpy

#はじめに
初投稿です。
プログラミング関連の知識はほぼ無い浅学な者ですが、気が向いたときに更新できれば、と思っております。よろしくお願いいたします。

#nfcpyがPython3対応
さて、PythonでNFCを扱うとなると、**nfcpy**を用いるのが(多分)定番だと思います。
しかし、これまでは**Python2のみ対応**と、普段Python3で書いている方々にとっては頭が痛かったのではないでしょうか。
私も先日NFCリーダライタ(SONY RC-S380)を購入し、Python2で簡易的な入退室管理システム等を構築していた所なのですが、どうやら最近になってPython3に対応したとの情報をキャッチ。
早速Python3にも導入していきます。

[nfcpy](https://nfcpy.readthedocs.io/en/latest/index.html)

#導入環境
- Windows 10 Home 64-bit
- Python 3.7.3
- nfcpy 1.0.1
- SONY RC-S380

#下準備
ただリーダを刺してコードを書いただけでは動きませんので、下準備をしていきます。すでに導入済みの方は適宜読み飛ばしてください。

##1.libusbの導入
まずはlibusbを導入していきます。
[このページ](https://libusb.info/)からDownloadsをクリック、githubに飛ばされるのでそこからダウンロードします。
(今回は`libusb-1.0.22.7z`を使用)
解凍したら次の操作をします。

- 64ビット版Windowsの場合
 - `MS64\dll\libusb-1.0.dll`を`C:\Windows\System32`にコピー
 - `MS32\dll\libusb-1.0.dll`を`C:\Windows\SysWOW64`にコピー

- 32ビット版Windowsの場合
 - `MS32\dll\libusb-1.0.dll`を`C:\Windows\System32`にコピー

##2.ドライバの適用
次に[このページ](https://zadig.akeo.ie/)からZadigをインストールします。
(今回は`Zadig 2.4`を使用)

RC-S380を刺し、一旦**ドライバが自動適用されるまで待ちます**。
私の環境では自動適用されないうちにセットアップを進めたら上手くいきませんでした。

適用されたのを確認してZadigを起動、リストボックスからRC-S380を選択します。

(ない場合は`Options -> List All Devices`)

Driverの欄は`WinUSB`を選択。

`Replace Driver`をクリックして待ちます。

完了したら下準備は終了。

#nfcpyの導入
nfcpyをインストールしていきます。

nfcpyはpipでインストール可能です。(ここで`libusb1`も同時にインストールされるようです)

```
> pip install nfcpy
```

インストールが完了したらPythonを起動して正常にインポートできるか確認。

```
>>> import nfc
```

#動作確認

今回は読取対象をSuicaに限定してみます。
こうすることでApple Pay等、エキスプレス設定のバーチャルカードでも一発で読めます。

その他の文法も基本的にPython2のnfcpyと相違ないようなので、各自お調べください。


Suicaのidmを読み取るサンプルを置いておきます。

```python:NFCread.py


import nfc
import binascii

suica=nfc.clf.RemoteTarget("212F")
suica.sensf_req=bytearray.fromhex("0000030000")


while True:

    with nfc.ContactlessFrontend("usb") as clf:
            
        target=clf.sense(suica,iterations=3,interval=1.0)
            
        while target:
                
            tag=nfc.tag.activate(clf,target)
                
            tag.sys=3
            
            idm=binascii.hexlify(tag.idm)

            print(idm.decode())

            break

```

カードが置かれている間、idmを出力し続けます。

#終わりに
ということで、ついにPython3にnfcpyが来た、という話でした。
いやぁ、Python3で書ける様になるのは有難いですね、、、。
pythonでバイナリデータを読む(PNGを例として)

# 環境
- Windows10 Pro
- Python 3.6.4 :: Anaconda 
- zlib 1.2.11

# 概要
- pythonでバイナリの読み書きをするには、structモジュールが便利 
 - https://docs.python.org/ja/3/library/struct.html#struct.unpack_from 
- pngの中身を読んでみる
 - http://web.archive.org/web/20050407143942/http://tech.millto.net/~pngnews/kndh/PngSpec1.2/PNGcontents.html

# 前準備：読み込むpngを作る
1ピクセルの黒いpngをさくっと作ります

```python:makePng.py
from PIL import Image, ImageDraw

screen = (1,1)
bgcolor=(0,0,0)
filename = "black.png"

img = Image.new('RGB', screen, bgcolor)
img.save(filename)
```
![black.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244405/3704563c-8195-4f53-bd46-8ae183e9a556.png)

# pngをバイナリデータとして読み込む

## エンディアン
pngはネットワークバイトオーダ(=ビッグエンディアン)でデータが格納されます。
以下に記載されているように、フォーマット文字列の最初に">"を入れることによってビッグエンディアンを指定します。

- https://docs.python.org/ja/3/library/struct.html#byte-order-size-and-alignment

ちなみに、自分のマシンのエンディアン(=native)を知りたければ以下のようにしましょう。

```python
import sys
print(sys.byteorder)
#little or big
```

## zlibによるデータ解凍
さて、念願のデータを手に入れましたが、deflate圧縮がかかっています。

```python
idata = list(struct.unpack_from(">" + str(length[0]) + "B", data, offset + 8))
print(idata)
#[120, 156, 99, 96, 96, 96, 0, 0, 0, 4, 0, 1]
```

みんな大好きzlibで解凍しましょう。

- https://docs.python.org/ja/3/library/zlib.html

バイト列に変換してからdecompressすればOKです。

```python
import zlib
idata = zlib.decompress(bytearray(idata))
print(idata)
#b'\x00\x00\x00\x00'
```

## コード全文
offsetをずらしながら、必要なデータをどんどん読み込んでいきます。

```python:binary.py
import struct
import os
import zlib

f = open("black.png", "rb")
data = f.read()

#unpack_fromはtupleを返す,たとえ要素が1つでも
#pngシグネチャ 8byteで(0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A)
signature = struct.unpack_from(">8B", data, 0)

offset = 8

#image header(25 bytes)
length = struct.unpack_from(">I", data, offset) 
ctype = struct.unpack_from(">4s", data, offset + 4)
width = struct.unpack_from(">I", data, offset + 8)
height = struct.unpack_from(">I", data, offset + 12)
bitDepth = struct.unpack_from(">B", data, offset +16)
colorType = struct.unpack_from(">B", data, offset + 17)
compless = struct.unpack_from(">B", data, offset + 18)
filter = struct.unpack_from(">B", data, offset + 19)
interlace = struct.unpack_from(">B", data, offset + 20)
crc = struct.unpack_from(">I", data, offset + 21)

print(length, ctype, width, height, bitDepth, colorType, compless, filter, interlace)
offset += 25

#image data
length = struct.unpack_from(">I", data, offset) 
ctype = struct.unpack_from(">4s", data, offset + 4)
print(length, ctype)
idata = list(struct.unpack_from(">" + str(length[0]) + "B", data, offset + 8))

offset += length[0] + 12

#Image trailer(12 bytes)
length = struct.unpack_from(">I", data, offset) 
ctype = struct.unpack_from(">4s", data, offset + 4)
print(length, ctype)

f.close()

#zlibによる解凍
idata = zlib.decompress(bytearray(idata))
print(idata)
```

## 出力
```
(13,) (b'IHDR',) (1,) (1,) (8,) (2,) (0,) (0,) (0,)
(12,) (b'IDAT',)
(0,) (b'IEND',)
b'\x00\x00\x00\x00'
```

最後の行がpngのデータ列です。
(フィルター,R,G,B)の順にデータが入っています。
フィルター:0 → フィルタなし
R,G,B:(0,0,0) → 黒

データの中身を取り出すことができました。素晴らしい。

必要なのは正確なフォーマット情報と、根気ですね。
「$this->」の意味

**「$this->」**は「疑似変数」というもので、そのclass内の関数や変数にアクセスするために使用します。

つまり、$this は、「自分自身のクラスの〜」という意味になります。


例えば以下のようなコードがあると、

```php:Step1.php
class Step1 extends Hoge
{
    public function run()
    {
        $this->logger->debug("ここにきてるか確認");
    }
}
```

class「Step1」のメソッド、また、継承元であるclass「Hoge」のメソッドにアクセス可能ということ。
（ちなみに、php stormでは元のメソッドの定義先にアクセスしたいとき、[command+クリック]でアクセスできる）



ここで、継承元の、Hoge.phpをみてみると、以下のように書かれている。

```php:Hoge.php
   ........
    /**
     * @var LoggerInterface
     */
    protected $logger;
   ........
```

このように、自分のクラス内のオブシェクトにアクセスする時に使うものが$this->である。
PythonでFlickr APIから画像取得

自分用のメモ。

# 動作環境
- macOS Mojave 10.14
- Python 3.6.8
- flickapi 2.4

# 事前準備
flickr APIキーの取得 及び ライブラリ(flickapi)のインストール方法は[こちら](http://ykubot.com/2017/11/05/flickr-api/)を参考

# コード
```python:download.py
from flickrapi import FlickrAPI
from urllib.request import urlretrieve
import os, time, sys

# 「事前準備」で取得したAPI KeyとSecret Keyを設定
key = "XXXXXXXXXX"
secret = "XXXXXXXXXX"

# 1秒間隔でデータを取得(サーバー側が逼迫するため)
wait_time = 1

# 検索キーワード(実行時にファイル名の後に指定)
keyword = sys.argv[1]
# 保存フォルダ
savedir = "./" + keyword

# 接続クライアントの作成とサーチの実行
flickr = FlickrAPI(key, secret, format='parsed-json')
result = flickr.photos.search(
    text = keyword,           # 検索キーワード
    per_page = 100,           # 取得データ数
    media = 'photos',         # 写真を集める
    sort = 'relevance',       # 最新のものから取得
    safe_search = 1,          # 暴力的な画像を避ける
    extras = 'url_q, license' # 余分に取得する情報(ダウンロード用のURL、ライセンス)
)

# 結果の取り出しと格納
photos = result['photos']

for i, photo in enumerate(photos['photo']):
    url_q = photo['url_q']
    filepath = savedir + '/' + photo['id'] + '.jpg'
    if os.path.exists(filepath): continue
    urlretrieve(url_q, filepath)
    time.sleep(wait_time)
```

# 実行方法
- 事前に"検索キーワード"となる保存フォルダを"download.py"と同じ階層に作成しておく
- 保存フォルダを作成後、下記のように実行する("Keyword"はflickrで検索する文字)

```terminal:terminal
$ python download.py Keyword
```

# ソースコード
https://github.com/hiraku00/py_flickr
NUCLEO-L476RG用micropythonをビルドする

# 手順
環境はUbuntu16.04とWindows10を利用しました。
基本的には、@boochowpさんの[こちら](https://blog.boochow.com/article/454050470.html)のページを参照しながら手順通りに進めればできました。

1.　[micropythonのホームページ](https://micropython.org/download)からソースコードmicropython-1.11.zipをダウンロード　　
　　( [git-hub](https://github.com/micropython/micropython)からダウンロードするとSTMのライブラリソースが空だったので上記からダウンロードしたものを使います。)
2.　Linuxマシン(Ubuntu)に先ほどダウンロードしたソースを解凍して置きます。
　（Windows10のWSLではビルドエラーが出てしまったのでLinuxで作業しました。）
3.　下記のコマンドを入力します(arm用コンパイラのダウンロードとビルドを行う)。

```bash

wget https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q3-update/+download/gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2  
tar xvfj gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2  
sudo apt-get -y install lib32z1 lib32ncurses5
cd <前記のmicropythonのソースフォルダ>/ports/stm32/  
make BOARD=NUCLEO_L476RG CROSS_COMPILE=<前記のarmコンパイラを解凍したフォルダ>/bin/arm-none-eabi-
```
4.　```build-NUCLEO_L476RG```フォルダの```firmware.hex```というファイルがビルド結果になります。
5.　USBメモリなどにコピーしてWindows10マシンに```firumware.hex```を移します。
6.　書き込みユーティリティソフト[STSW-LINK004](https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/stsw-link004.html)をインストールします。
7.　ボードとPCを接続して、先ほどインストールしたSTM32 ST-LINK Utilityを立ち上げます。
8.　Target->Connectを押して接続して、Target->Program画面からFile pathに```firmware.hex```を選択しStartボタンを押すと書き込みが実行されます。
9.　以上でmicropythonがボード上で立ち上がります。
Javaでのコンソール入力(仕組み理解)

通常Javaではこのように書くことで、コンソール入力することができます

```
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String someValue = br.readLine();
```

## Systsm.inとは 
Systsm.inはSystemクラスの中のメンバ変数inを表しています。標準入力や標準出力のためのオブジェクトはあらかじめ生成されていて、それがSystem.inやSystem.outに代入されています。
したがって、特にnewで入出力用のオブジェクト（インスタンス）を生成しなくても、System.out.println()などのメソッドを使うことができるのです

System.inが扱うのは、入力される生のバイト列です。日本語も正しく処理されません。
Windows上では日本語はJavaの内部ではUnicodeであるため、入出力のところで変換しなければなりません。
それを変換をしてくれるのが、*InputStreamReaderクラス*です。

１行目の、
　　`InputStreamReader isr = new InputStreamReader(System.in);`

によって、オブジェクトisrは日本語の変換をしてくれます。
※この時点ではisrはバイト列です。

１行単位に読むには、

　　`BufferedReader br = new BufferedReader(isr);`

BufferedReaderクラスのオブジェクトに繋ぐ必要があります。
このオブジェクトはバッファ機能を持っているので、１行単位に読み込みができます。

　　`String someValue = br.readLine();`

br.readLine()は、入力された１行分を日本語変換して返してくれます。
このようにして、Stringクラスのbufの中に、１行分の文字列を入れることができるのです。
外部サーバのmariadbにphpで接続する方法

##前提
・mariadbサーバーとphpサーバーがあるとする。

・mariadbサーバーにはmariadb(ポート番号3306を開放しておいてください),phpサーバーにはphpがインストールされている

・mariadbサーバーには接続確認のため、任意のテーブルを作成し、データを入れておいてください。

#これからやること
mariadbサーバー側はデフォルトで、localhostしか参照できないようになっているので、
許可したいユーザーと接続元サーバの作成をして、
「このサーバー（今回でいうとphpサーバー）のこのユーザーからのアクセスは許可します」という設定が必要。


##ユーザーと接続元サーバの作成

まずは許可したいユーザー(username)と接続元サーバ(192.168.10.1)の作成。
パスワードを指定したければ、IDENTIFIED BY "パスワード"で指定してください。

```shell
mysql>CREATE USER username@192.168.10.1 IDENTIFIED BY "passwd";
```
##作成できているのかを確認
ちゃんと作成できているのかを確認。以下のコマンドで、作成したuserが出てくればOK。

```shell
mysql>SELECT User,Host FROM mysql.user;
```

##権限を付与

```shell
mysql>GRANT [権限種別] ON [データベース名].[テーブル名] TO [ユーザ名]@[接続元ホスト];
```
権限種別は外部記事を参考にしてください。

以下の例は、
「接続元「192.168.10.1」のユーザー名「username」には、testdbというデータベースのtesttableというテーブルに全ての権限（selectとかdeleteとか諸々全部）を与える」
という意味です。

```shell
mysql>GRANT ALL ON testdb.testtable TO username@192.168.10.1;
```

##PHPから接続

次にphpのあるサーバー（この例だと、192.168.10.1のはずです。）からpdoを用いて接続します。

phpファイルを作成し、接続を確認しましょう。

```php:pdo.php

<?php
//ここのhostは接続先（mariadbサーバー）を指定.
//dbnameは作成したdb
$dsn = 'mysql:host=192.168.10.31;dbname=testdb';
//許可したいユーザー
$user = 'username';
$password = 'passwd';

try{
    $dbh = new PDO($dsn, $user, $password);
    $sql = 'select * from staffname';
    foreach ($dbh->query($sql) as $row) {
        print($row['id'].',');
        print($row['name']);
        print('<br />');
    }
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}

$dbh = null;

?>

```

ここでinsertしておいたデータが表示され、接続できていることが確認できればOK
RecyclerViewに区切り線を入れる

RecyclerViewはListViewと違って、ある程度自由に画面を作成できますが、その分自分で実装しないといけない箇所が多いです。
区切り線もそうです。
ListViewでは特に実装しなくても区切り線が表示されますが、RecyclerViewでは実装が必要です。


```kotlin:MainActivity.kt
val separateLine = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)

RecyclerView.addItemDecoration(separateLine)
```

実装自体はお決まりパターンですが、RecyclerViewのfindByIdした変数RecyclerViewにseparateLineを追加します。
RecyclerViewの方が多様性があって、個人的に使いやすいので、RecyclerViewで実現できるかをまずは考えたいと思いました。

####参照

[DividerItemDecoration リファレンス](https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration)
気を付けよう getimagesize() の引数に

本記事は、前の記事
「[gethostbyaddr()って外部と通信するんだね](https://qiita.com/kyotoisalsosnownight/items/90c76ad2442283813d98)」
と同時進行していた話です。よければ一緒にご覧ください。

#【 概要 】

ＰＨＰのあるシステムで、なぜかブラウザ表示が
重くなる現象が起きていました。

まず対象のページについて、テスト環境で調べました。
すると apache のログ( /var/log/httpd/ )が妙なのです。
ページに１回だけアクセスしたはずなのに、
ログ上は２回アクセスしているのです。

はぁっ？ と思い、その２回目のログをよく見ると、
リモートＩＰ（通信元）が、サーバＩＰと同じでした。
つまり、自サーバから自サーバに通信していたのです。

その後いろいろ調べたところ、
[getimagesize()](https://www.php.net/manual/ja/function.getimagesize.php) が原因だと突き止めました。
（画像の大きさを取得する関数です。）

#【 原因 】

最初に言っておきますが、
getimagesize() に罪はありません。
コールの仕方に問題があったのです。

まず getimagesize() の引数 filename は、
主に２種類の書き方ができます。

>
>[ローカルファイル形式]
>/var/www/image.gif
>
>[ＵＲＬ形式]
>http: //xxxx.yyy/image.gif
>

ここで、画像が自サーバ内にある場合は、
どちらの書き方でもコール可能です。

ただし http: //xxxx.yyy/image.gif（ＵＲＬ）の書き方だと、
画像が自サーバ内にあるにもかかわらず、
わざわざ apache のコネクションを介して画像を取得するのです。

これが apache の不明なログの正体でした。
（問題のＰＨＰソースでは、ＵＲＬ形式を引数にしていました。）
言い換えれば、apache のコネクションを無駄に張っていたのです。

もう少し詳しく説明しましょう。

ＰＨＰのページにアクセスする際、そのページ内で、
画像（自サーバ内）のサイズ取得のため getimagesize() をコールしていて、
その引数としてＵＲＬを指定していると、
本来１個のコネクションで済むはずが、
２個のコネクションを張ってしまうのです。

仮にそのページに、同時に１００アクセスされた場合、
apache のコネクションは２００になってしまいます。

>
>・ページに対するコネクションが１００
>・画像に対する（予想外の）コネクションも１００
>・合わせて２００
>

#【 何が違う？ 】

以上を読んで、
「ＨＴＭＬ内に img タグがあれば、同じことが起こるじゃないか」
と思われたでしょうが、それとは違います。
その場合は、ページに対するコネクションの「後」に、
画像へのコネクションが発生するからです。

今回 私が見た現象は、ページに対するコネクションの「最中」に、
画像へのコネクションが追加発生するのです。

#【 apache との関係 】

以上に述べた、予想外のコネクションが発生するとなると、
httpd.conf の MaxClients の意味が薄れてしまいます。

なぜなら MaxClients は、外部からの純粋なアクセス数を
予測／計算して決めますが、その１アクセスで
じつは内部的に２アクセス以上 発生するとなれば、
MaxClients が不足することになるのです。

結果、本来 捌ける（さばける）はずのアクセスを
捌けなくなってしまいます。アクセスの待ち行列が増大します。
これが、ブラウザ表示が重くなった理由です。

#【 まとめ 】

結局、getimagesize() の引数を
/var/www/image.gif（ローカルファイル形式）に修正したところ、
apache がリクエストを捌けるようになり、ブラウザ表示が軽くなりました。

プログラマーは、apache 等のサーバやインフラのことなど
あまり意識しない（というか知らない）場合もあると思います。

本番環境の特殊な状態に晒されて、
初めて問題に気づくことが多いです。

結局 地道に、ノウハウを蓄積するしかないですねぇ。
リスト

# リスト
- 参照は必ずしも高速ではないが，挿入・削除は高速
- v.s. 配列：参照が高速だが，挿入・削除は最悪の場合$O(n)$の計算量がかかる．

## 線形リスト

![](https://media.geeksforgeeks.org/wp-content/cdn-uploads/gq/2013/03/Linkedlist.png)

```go
package main

import "fmt"

type Cell struct {
	val int
	next *Cell
}

type LinkedList struct {
	head *Cell
}

func (l *LinkedList) Print() {
	cell := l.head
	for cell != nil {
		fmt.Printf("val: %d\n", cell.val)
		cell = cell.next
	}
}

func (l *LinkedList) Insert(val int, previous *Cell) {
	cell := NewCell(val)
	if previous == nil {
		fmt.Println("ERROR: Given previous cell does not exist yet.")
		return
	}
	cell.next = previous.next
	previous.next = cell
}

func (l *LinkedList) Prepend(val int) {
	cell := NewCell(val)
	cell.next = l.head
	l.head = cell
}

func (l *LinkedList) Append(val int) {
	cell := NewCell(val)
	last := l.head
	if last == nil {
		l.head = cell
		return
	}
	for last.next != nil {
		last = last.next
	}
	last.next = cell
}

func (l *LinkedList) Delete(val int) {
	if l.head == nil {
		fmt.Println("ERROR: linked list does not exist yet.")
		return
	}
	target := l.head
	var prev *Cell
	for target.next != nil {
		if target.val == val {
			break
		}
		prev = target
		target = target.next
	}
	if target == l.head {
		l.head = l.head.next
		return
	}
	prev.next = target.next
	target.next = nil
}

func NewCell(val int) *Cell {
	return &Cell{val: val, next: nil}
}

func NewLinkedList() *LinkedList {
	return &LinkedList{head: nil}
}

func main() {
	l0 := NewLinkedList()
	l0.head = NewCell(0)
	c1 := NewCell(1)
	c2 := NewCell(2)
	l0.head.next = c1
	c1.next = c2
	l0.Print()
    // val: 0
    // val: 1
    // val: 2

	l0.Prepend(-1)
	fmt.Println()
	l0.Print()
    // val: -1
    // val: 0
    // val: 1
    // val: 2

	l0.Append(99)
	fmt.Println()
	l0.Print()
    // val: -1
    // val: 0
    // val: 1
    // val: 2
    // val: 99

	l0.Insert(77, c2)
	fmt.Println()
	l0.Print()
    // val: -1
    // val: 0
    // val: 1
    // val: 2
    // val: 77
    // val: 99

	l0.Delete(0)
	fmt.Println()
	l0.Print()

    // val: -1
    // val: 1
    // val: 2
    // val: 77
    // val: 99
}
```

## 環状リスト

## 双方向リスト

気が向いたら追記
CMakeを使ったビルドが"*** missing separator.  Stop."で失敗する

`set_target_properties`の値に改行等を含む文字列が渡されると、次のようなメッセージと共に失敗する不正なmakefileが生成される事がある。

```bash
src/CMakeFiles/awesometarget.dir/build.make:91: : *** missing separator.  Stop.
```

改行を変数中から取り除く方法には`STRIP`string operationで取り除ける:
https://cmake.org/cmake/help/latest/command/string.html#strip

`execute_process`から文字列を得ている場合は`OUTPUT_STRIP_TRAILING_WHITESPACE`で取り除ける:
https://cmake.org/cmake/help/latest/command/execute_process.html
初心者も簡単！UbuntuでNode.jsの環境構築

以前[ちょっとLinuxを始めてみようと考えている人のためのVirtualBox](https://qiita.com/Hiroro0970/items/a1a894bf21fda2f0135a)の記事を書いたからせっかくだし早速活用してみよう！ということでVirtuualBox上のUbuntuでNode.jsの環境構築をしてみました。

## 手順
まず、Node.jsをインストールします。

```
sudo apt install nodejs -y
```
私の場合、何故かインストールできず、以下のメッセージが表示されました。

```
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
```
どうやら他のプロセスでadminが使用されているので開けませんとのことだったのでとりあえず再起動 & 再実行。
そしてnpmもインストール

```
sudo apt install npm -y
```

たったのこれだけ。インストールが完了しました。
pythonで階層的クラスタリング

#階層的クラスタリングとは
クラスタリングアルゴリズム一つで, 名前の通りデータを階層的にクラスタ分割していきます. 階層的クラスタリングだけでも, 様々な設定が設定があるようなので, 試してみたいと思います. 

# 距離計算手法
クラスタリングはデータ同士の距離に基づいて, データをグループ分けします. その距離の計算方法についても色々とあるようです. 

|method|説明|
|:-:|:-:|
|average|重みのない平均距離|
|centroid|重みのない重心までの距離|
|complete|最大距離|
|median|重みのある重心までの距離|
|single|最小距離|
|ward|内部平方距離|
|weighted|重みのある平均距離|

##実践
今回は, 1次元のデータをランダムに20個生成し, 上記の距離計算アルゴリズムそれぞれでクラスタリングをしていきます. 結果はデンドログラムで表示します. 

##average
![average.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/5ba0716c-8656-6f9c-3cee-822d00f2f96c.png)

##centroid
![centroid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/918dd549-97ba-e080-f5bb-1a812ff31bbb.png)

##complete
![complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/a33e582f-1835-a4d4-3cab-7ec3cf2a54fe.png)

##median
![median.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/81d34a79-0ac4-bdd4-adb4-b4dbc6640af1.png)


##single
![single.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/fb086034-0e82-37c1-f2f2-e50a88011942.png)


##ward
![ward.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/341a3650-be27-8460-a96f-93297ad91ec7.png)


##weighted
![weighted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/5779ae66-65c4-3c44-8de8-ddda0f708613.png)

##
距離の計算手法によって, 異なる結果が得られることが分かりました. 

#コード
以下のコードを実行すれば, 各距離計算手法でのデンドログラムが表示されます. 

```python
# -*- coding: utf-8 -*-
import pandas as pd
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
import random

# methodのリスト
method_list = ("average", "centroid", "complete", "median", "single", "ward", "weighted")
data = []   # dataを格納するリスト
label = []  # labelを格納するリスト

# dataを20個生成
for i in range(20):
    num = random.randint(0, 99)
    data.append(num)
    label.append(str(num))

# DataFrameオブジェクト生成
df = pd.DataFrame(data)

# クラスタリング
for method in method_list:
    Z = linkage(df, method=method, metric="euclidean")
    dendrogram(Z, labels=label)
    plt.title(method)
    plt.show()
```
「DLLAB 2 周年イベント: ディープラーニングの社会実装を阻むものは何か？」参加記

2019/6/8(土)に大手町で開催された「[DLLAB 2 周年イベント: ディープラーニングの社会実装を阻むものは何か？](https://dllab.connpass.com/event/124666/)」に参加しました。簡単な感想と、把握できたリンク等を記載します。

#1.講演・ハンズオン関連リンク

- [（AINOW）ディープラーニングは儲けてなんぼ！ エンドユーザの付加価値を考えろ！松尾豊氏](http://ainow.ai/2019/06/08/171682/)
- [（ロボスタ）NTTコム「ディープラーニングの社会実装が進まない理由」として製造業の事例を紹介　DLLABイベントで](https://robotstart.info/2019/06/08/dllab2-nttcom.html)
- [（Ridge-i 柳原様）Deeplearning 導入　PoCを超えるノウハウ](https://www.slideshare.net/TakashiYanagihara/deep-learning-lab-2-deeplearning-poc)
- [（ロボスタ）世界初のJetBotハンズオン・ワークショップ開催！Jetson Nano、Microsoft Azure、キット製品でAI自律ロボットカーの作成体験](https://robotstart.info/2019/06/08/jetbot-workshop-dllab.html)
- [（chug）Chainer 初学者向けハンズオン](https://dllab.connpass.com/event/124666/presentation/)
- 6/13追記[（@IT）「DLLAB」の次回大規模イベント情報と、今後の方針・施策](https://www.atmarkit.co.jp/ait/articles/1906/13/news021.html)

　※ [Twitterの#dllab](https://twitter.com/search?q=%23dllab)で検索した結果等から引用しました。

![190608-0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280437/8c78bd2c-2a4d-c3bc-7f43-0c574f2aee7c.jpeg)


#2.会場
会場は、2018年後半に竣工したばかりの「大手町プレイス　ウエストタワー」の28階でした。
私は約1年ぶりに大手町を訪れたのですが、前は建設中で気になっていた建物に、こうして踏み入れる機会を頂けて嬉しかったです。
今回の参加者とスタッフ等の方の人数は計600名ぐらいだったようですが、まだまだ広さには余裕がありました。今後、イベントの会場として外部にも公開したいご意向との事で、また来る機会があるのかな～と感じました。

![190608-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280437/c9c26f7c-b3f8-0e4b-f849-6726d9965af1.jpeg)
↑メインフロア

![190608-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280437/c994a589-ea3a-1d11-59f2-02b893eafd0e.jpeg)
↑通路を挟んで反対側には、受付や10～100名程度(?)収容の複数会議室が。

#3.感想
今回、個人的に1番刺さったのが、松尾先生が現在のディープラーニングのビジネス事例を「産業革命時のエレベーターの発明」になぞらえていた事でした。

- エレベーターの発明直後、1Fから2Fに上がるだけのためには、大して価値がなかった。<br>（現在のDLビジネスの大半の現状）
- しかし、以降に高層ビルが建つようになり、エレベーターは不可欠な存在になった。<br>（DLビジネスが目指すべきブレークスルー）


分かりやすい例えで、素直に考えさせられました。
初めてのHTML ひな形

今回からHTMLを扱ってみようと思います！！
![HTMLひな形 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/70ad65e6-bfa1-34e6-cd5a-629eaff1e50a.png)

**初めに**
開始タグ、終了タグを書きます。
開始タグ
html
終了タグ
/html

bodyタグ内に文字を書くと画面に表示されます。
**職業**

Google Chromeに、Ctrl + s で保存した文字が表示されました！
![HTMLひな形.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/93722383-78cf-a49f-559d-ebb481908733.png)


UTF-8は大事になるので覚えておきましょう。
・ASCIIコードの文字に加え、世界中の文字を加えたのが、UTF-8です。ASCIIコードで以外の文字は、2～6バイトで表現され、日本語の文字は、基本的に3バイトで表現します。
ASCIIコードとの互換性が良いため、パソコンで扱いやすく、世界中の多くのソフトウェアは、UTF-8に対応しています。そのため、「パソコンの世界共通語」と言っても過言ではありません。

初めてのHTMLでしたがこれからはじめる方でも楽しくできると思います。
macOS に python3 をインストールする

## 背景
python でスクリプトを組んで macOS 上で動作確認したい。
ので、まずは、python3 のインストール手順を記載する。

## 参考情報
https://www.python.org/downloads/

## 環境情報
|項目|値|
|:-----|:-----|
|OS|macOS Mojave 10.14.5|
|PC|MacBook Pro (Retina, 15-inch, Mid 2015)|
|Python|3.7.3|

## 手順
1. 参考情報のサイトから pkg ファイルをダウンロードする
    - 実際にダウンロードしたファイル「python-3.7.3-macosx10.9.pkg」
2. ダウンロードした pkg を起動する
3. インストーラが起動するので画面にしたがってインストールする
4. インストールされたかを確認する

```cmd:
> python3 --version
Python 3.7.3
```
Python len()の中で何が起こっているのか

普段何気なく使っているlen()ですが、「長さを教えてくれる」程度の理解しかできていませんでした。ちょっと深堀ってみます。
※実行したバージョンはPython3.7.3です。

# len()

関数の説明　[公式リファレンス](https://docs.python.org/ja/3.7/library/functions.html#len)より
> オブジェクトの長さ (要素の数) を返します。引数はシーケンス (文字列、バイト列、タプル、リスト、range 等) かコレクション (辞書、集合、凍結集合等) です。

##  使ってみる
リファレンス通り、シーケンスやコレクションを引数にする

```Python
# シーケンス型の例
>>> len('abc')
3
>>> len(['a','b'])
2

# コレクション型の例
# 辞書の場合はキーの数が返る
>>> len({'name':'サザエ','age':25})
2
>>> len({1,2,3})
3
```

シーケンスやコレクション以外のオブジェクトを引数にするとどうなるか

```python
# TypeErrorになる
>>> len(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
>>> len(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'bool' has no len()

```
自作クラスのオブジェクトを引数にするとどうなるか

```python

# intやboolを引数にしたときのようにTypeErrorになる
>>> class MyClass():
...     pass
...
>>> len(MyClass())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'MyClass' has no len()

```

## 中で何が起こっているのか

`len(hoge)`が呼ばれると、内部で`hoge.__len__()`が呼ばれます。
`__len__()`は特殊メソッドの一種です。特殊メソッドについては[公式リファレンス](https://docs.python.org/ja/3.7/reference/datamodel.html#special-method-names)をご参照ください。（いつか特殊メソッドについてもまとめたい）

シーケンスやコレクションのオブジェクトでは`__len__()`が定義されています。

```python
# 同じ結果になる
>>> len('abc')
3
>>> 'abc'.__len__()
3
```
しかし、intなどシーケンスやコレクションでないオブジェクトでは`__len__()`が定義されていません。
len()でシーケンスやコレクション以外のオブジェクトを引数にするとエラーになった理由はこれだったのです。

```python
>>> int().__len__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__len__'
```
つまり、自作クラスのオブジェクトでも`__len__()`が定義されていればlen()の引数にできます。

```python
>>> class MyClass2():
...     def __len__(self):
...         return 100
...
>>> obj =  MyClass2()
>>> len(obj)
100
```
##注意すべきこと
自作クラスの場合、`__len__()`の中身を自身で定義することができます。
極端な例ですが、以下のようなlistを継承して作った自作クラスMyListClassがあったとします。

```python

>>> class MyListClass(list):
...     # 要素のうち正の数の数を数えて、それを長さとする
...     def __len__(self):
...         cnt = 0
...         for i in self:
...             if i > 0:
...                 cnt += 1
...         return cnt
...
>>> obj = MyListClass([1,2,-1])
>>> obj
[1, 2, -1]
# 正の数は2つなので、長さ2となる
>>> len(obj)
2
```
MyListClassの実装を知らずにlen()の引数にMyListClassオブジェクトを使用したら... 思わぬ不具合を生む可能性があります。

特殊メソッドを定義して動作をカスタマイズする場合、影響箇所を考慮する必要があります。また、自作クラスのオブジェクトを使用する場合はどういったカスタマイズがされているのか確認したうえで使用したほうがよさそうですね。
UITableViewCellの一部の区切り線を消す際のTips

TableViewCellの一部の区切り線を消す際の Tipsメモ


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/54d7882b-fa2b-2884-8849-fca01153b980.png" width="300px">

上記のようなTableViewがあったとき、
例えば「設定B」と「設定C」の間の線(Separator)を消したい場合があります。




## 区切り線を消す

[こちら](https://qiita.com/takashings/items/693ba4b31d07dbe90778) の記事が詳しく説明されているため、参考にさせていただきます。
該当部分にコードで反映。

```swift
cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
```

#### 結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/4c78225d-670b-3728-4beb-ac5501fb7792.png" width="300px">

**なぜか、区切り線を消した部分のセルがずれてしまいました。**
これは、その他のdefaultのセルには、defaultのマージンサイズが設定されているから
と考えられます。

## defaultのマージンサイズに揃える

storyboardからdefaultのマージンサイズを確認してみると
**iPhone XS MAX**の場合は**20**、**iPhone 8**の場合**15**に設定されていました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/4d2b1900-3b29-0533-002f-916e78d33e24.png" width="500px">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/ac27f8c3-dda2-e82c-ae28-35de6f4af384.png" width="500px">


直接数値を入れてしまうと、デバイスによって値が異なってしまうため、
`separatorInset.left`の値を取得してから、反映させるように書き換えます。

```swift
let insetLeft = cell.separatorInset.left
cell.separatorInset = UIEdgeInsets(top: 0, left: insetLeft, bottom: 0, right: .greatestFiniteMagnitude)
```

### 結果

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/1db7cc4e-2808-049d-6d1b-e4736ad41ec8.png" width="300px">


**無事正しく反映することができました！**

---

### 余談

Twitterアプリの設定画面を見てみると、cellのタイトル, accessoryを1つのセルとし、
項目の説明文を違うセルとして管理しているのかもと考えられます。
(セルをタップした際、説明文の部分は選択されていなかった。)

このようなtablevieをつくりたいときに、 
**一部の区切り線を消す** 実装を活用することができますね

| Twitter設定画面の例 | タップ時の挙動 |
|:--:|:--:|
|<img width="300" alt="IMG_5544.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/617da2d4-9992-32c0-1067-c677c1a16136.png">|<img width="300" alt="IMG_5543.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/2973615e-8bdc-77a1-2f18-587bb3ea21e2.png">|



最後までご覧いただきありがとうございました 🙏
Vimをデフォルトの設定で運用すると任意コードが実行される脆弱性が発見された

バージョン8.1.1365以下のvimやバージョン0.3.6以下のneovimは、細工されたファイルを開くと、モードラインにより任意コードが実行可能であること。

##CVE
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12735

##対策
vimやneovimはそれぞれすでにパッチを提供しているため、更新すること。


##Patches

- [Vim patch 8.1.1365](https://github.com/vim/vim/commit/5357552)
- [Neovim patch](https://github.com/neovim/neovim/pull/10082) (released in [v0.3.6](https://github.com/neovim/neovim/releases/tag/v0.3.6))

##タイムライン
2019-05-22 vimやneovimの開発者に通知
2019-05-23 vimがパッチを提供
2019-05-29 neovimがパッチを提供
2019-06-05 CVE-2019-12735割り当て
インターネット公開サーバのセキュリティ設定、サービスでアクセス元IPアドレスを制限

色々なサービスでアクセス元IPアドレスを制限する方法
[firewalldで制限](https://qiita.com/harasakih/items/cf5fdcfb23af480bc66b)

セキュリティ対策として、

- 不要な、プロセスを起動しない
- 不要な、ポートを閉塞する
- 許可するアクセス元を制限する

などを求められている。
アクセス元制限の解決策は

- 専用のファイヤウォールを導入する
- NW機器のACLで制限する
- OSで制限する
 - /etc/hosts.allow,/etc/hosts.denyで制限
 - firewalld,iptableでサービス毎に制限
 - サービス自体で制限

などあるが、影響範囲を限定するには「サービス自体で制限」が最も望ましいと考える。サービス毎にこの具体例を例示する。

firewalld,iptableでサービス毎に制限も可能であるが、設定が煩雑（自分がよく理解できていないだけ、でもある）なので、サービスごとの設定ファイルに書く。

# sshd
[man of sshd_config](https://euske.github.io/openssh-jman/sshd_config.html)

 sshd_configに、AllowUsers,DenyUsers,AllogGroups,DenyGroupdを指定
 指定の参照順は[DenyUsers 、AllowUsers 、DenyGroups 、AllowGroups ]
 

## 全てのユーザのアクセス元を限定
```conf:/etc/ssh/sshd_config
AllowUsers *@www.xxx.yyy.zzz/nnn
```
## ユーザ毎に指定

```conf:/etc/ssh/sshd_config
AllowUsers  user1                  # 全てのアドレスから
AllowUsers  user2@192.168.0.0/16   # 192.168.0.0/16 から許可
AllowUsers  user3@192.168.0.99     # 192.168.0.99 からのみ許可
```

# httpd
[参考](https://qiita.com/YasuyukiKawai/items/727d2238572851000c79)

## ホワイトリスト方式
ホワイトリスト方式で、次のように書く

- Order  Allow,Deny
- Allow from xxx
- Deny  from all

## サイト(ディレクトリ）毎に指定
 サイトのconfに書くか、レンタルサーバなどでconfに書けないなら、[ .htaccess ]が利用可能なら、それに書く 

```conf:/etc/httpd/conf.d/xxxx.conf
<Directory "/directory/to/path">
    Order           allow,deny
    Allow from      wwww.xxxx.yyyy.zzz/nnn
    Deny  from      all
</Directory>
```

# dns
[参考](http://ddns.blog.jp/archives/12772614.html)

## ホワイトリスト方式
ホワイトリスト方式で、次のように書く

- allow-queryで許可するIPアドレスを指定する
- allow-queryは、optionに書けば全体、zoneに書けばそのゾーンだけに有効
- blackholeで接続そのものを拒否できる。optionのみ指定可能

```conf:/etc/named.conf
option {
    allow-query     { 192.168.0.0/16; 127.0.0.1; };
    ....
}
```
Java開発の基本~開発環境の設定とプロジェクトの作成~

# Java開発の基本~開発環境の設定~
色々と設定するのは大変なのでとりあえずeclipseを入れてすぐにjavaに触れる環境を整えましょう。

## エクリプスのダウンロードとインストール?

日本語化パッチが当ててあるeclipseのダウンロード手順は[ここ](https://javazuki.com/articles/windows-pleiades-all-in-one-install.html)を参照しました。（ちなみにmacだとインストールされるみたいです）
このページでは「最新バージョン」をダウンロードしていますが、安定していないこともあるので、ちょっと前のバージョンをいつも入れています。
今回は<b><font color="red">photon</font></b>を入れました。（2019/6現在）

## プロジェクトの作成
とりあえず"hello world"を出力してみましょう。

ダウンロードしたeclipseを開きましょう。
<img width="601" alt="スクリーンショット 2019-06-09 18.22.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/c287867b-fc14-9820-8e5c-6719ef6e5358.png">
ここはデフォルトのまま`起動`をクリックしてeclipseを起動させましょう。

`ファイル>新規>Javaプロジェクト`と進んで、プロジェクト作成のダイアログを出します。<img width="875" alt="スクリーンショット 2019-06-09 18.28.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/dd2b5469-04a8-f28b-7158-9ecfd1565fc7.png">

ダイアログが開いたらプロジェクト名に`learnJava`と入力して`完了`をクリックします。
<img width="1013" alt="スクリーンショット 2019-06-09 18.30.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/7e4ad998-b463-d4a2-e1e2-337bf3d8c8e1.png">

こんな感じで作成したプロジェクトが表示されます。あと、邪魔な部分は青い四角の所にあるxボタンをクリックして閉じてしまいましょう。

<img width="1027" alt="スクリーンショット 2019-06-09 18.34.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/8d266f47-16bd-72d5-7321-0eff117d9b71.png">

左の三角をクリックしてlearnJavaを開きます。srcの上にカーソールを合わせ、`新規>パッケージ`をクリックします。
<img width="1024" alt="スクリーンショット 2019-06-09 18.44.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/b03ae37e-5fc8-1151-2cd0-577bc4e736bf.png">
ダイアログが表示されたらパッケージ名を`sampleCode`と変更し`完了`をクリックしてください。
<img width="526" alt="スクリーンショット 2019-06-09 18.48.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/ff9ce488-5840-de6f-3424-6f4bc98a664a.png">

作成されたパッケージの上にカーソルを合わせて`新規>クラス`をクリックします。
<img width="772" alt="スクリーンショット 2019-06-09 18.50.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/deb248f1-5bc1-2e72-e339-8dd2ba94985a.png">
ダイアログが表示されたら名前に`HelloWorld`、public static void main(String[]args)にチェックをつけて`完了`をクリックします。
<img width="553" alt="スクリーンショット 2019-06-09 18.51.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/a6c69325-53a5-3dc7-bed6-655edcb1fe25.png">

自動生成されたコードが出てくるので、下のイメージの通りの記述を追記してください。
<img width="1019" alt="スクリーンショット 2019-06-09 18.54.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/8ff897bc-d639-607e-5d9a-250ca82f9adf.png">

追記したら左上の緑のボタンの右の三角をクリックして`実行>Javaアプリケーション`をクリックします。<img width="1017" alt="スクリーンショット 2019-06-09 18.57.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/50e10c13-c40d-4bb1-8271-e4c852d910de.png">

コンソールという画面が現れて"hello world"という文字が出力れます。めちゃくちゃ地味ですが、これはこれでプログラムなので・・・<img width="1018" alt="スクリーンショット 2019-06-09 18.59.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292795/0b38d2e8-5e74-203c-9d9f-c058451936df.png">




次回は実際にプログラミングを初めて行きます。
かけだし大学生プログラマーのふりかえり〜ふた月め〜

#おひさしぶりです。
ひと月でやめずにちゃんと今月も書きます、
新人大学生プログラマーのさかがみです。
2019/4月より関西地方のWebシステム会社でエンジニアとしてアルバイトをしています。
[前回の記事](https://qiita.com/Kazuto_Sakagami/items/14f63321ea1759ed0b98)からひと月が経過したので、いつか誰かの役にたつと信じて、新人プログラマーのふりかえり、やっていきます。

#5月の仕事内容とその感想
[先月](https://qiita.com/Kazuto_Sakagami/items/14f63321ea1759ed0b98)はペアプロという形で社員さんがコードを書くのを横で見ていましたが、五月は、ほとんどの時間をひとりでコードを書いたり、実装するための調査をしたりしていました。
まだ難しい作業はやれていませんが、一応ひとりで作業が進められているという点では若干の進歩かなと思いますね。

主にやっていたのは以下のような仕事です。
1. a-Frameを用いたAR画像表示機能の実装
2. haskellを利用した既存コードの改修作業
3. kotlinとTypeScript,Reactによる新画面の実装

この中で、特に3つめの新画面の実装は、kotlinによるAPIの実装から、フロントエンドのコーディングまですべて自分でやっていく作業なので、既存コードに参考になる部分がかなり多いとはいえ、今のじぶんにはやりがいのある仕事で、APIが想定通りの挙動になったときには、ほんの少しですが成長を感じることができました。

#今の課題
やれることが増え若干の成長を感じる一方で、今自分が課題と感じているのは、**調査が遅い**という点です。
これについては個人的にstackOverFlowを使って調査ができないという点が、かなりピンポイントですが、大きいのかなと思っています。
実際、何かを調査して実装する際、
日本語サイト→英語サイト→ソースコード
の順でヒントを探して行くことが多いのですが、
実務のあまりメジャーでないライブラリについて調べる際はとくにQiitaやteratailといった日本語サイトでヒントが見つかるケースはあまり多くなく、実際には英語で書かれたリファレンスか、
stackOverFlowを使用することになるのですが、じぶんはstackOverFlowの検索はなんか大変そうという理由でさっさと済ませるケースが多く、その結果としてハマってしまうケースが多いのが課題だなぁと感じています。これについては自分なりにいろいろ対策して、何かヒントになりそうなことがあれば後日Qiitaで共有します。

#5月にプライベートでやってた勉強と今後
ここでは5月に仕事とは関係なくやっていた勉強について書きます
やっていたことは大きく以下です
- Dockerについてdotinstallで見て、動かす
- オブジェクト指向の本を真似して、はないちもんめを作ってみる
- 会社で必要な技術の環境構築をじぶんのマシンでやってみる
- 「リーダブルコード」を読む
- 「[WEBを支える技術](https://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042)」を読む
この中で特におすすめだったのは「[WEBを支える技術](https://www.amazon.co.jp/Webを支える技術-HTTP、URI、HTML、そしてREST-WEB-PRESS-plus/dp/4774142042)」という本を読んだことです。
この本はざっくりいうとwebの仕組みについて解説した本で、案外初心者向けのプログラミング教材だとwebの仕組みについて言及されないことが多く、この部分がブラックボックスになりがちな上、この知識があるとないとでは設計や、デバックの効率が変わってくるのでもし後にこの記事読んでらっしゃる方でwebの仕組みについて詳しく学んだことない方はぜひ読んでいただきたい一冊だなぁと感じました。


#あとがき
若干いい兆しを感じるふた月めでした。
6月は競プロ系の問題を解いて、エンジニアとしての基礎力の増強にも努めたいな〜なんて思います。
あと、[ツイッターの技術アカウント](https://twitter.com/WebGami092?lang=ja)を作りました。ビジネスアカとかじゃなければフォロバ100%です。新人エンジニアのみなさん、情報共有しましょう。~~馴れ合いましょう~~
最後まで読んでくださってありがとうございます。ほなまた、
初心者によるVue.jsガイド(English)の備忘録

Vue.jsガイドの英語版を上から順に読んでいく

# {{ xxx }}, v-bind （Mustache Syntax）

<b>●data-bindingをしたい場合は`{{}}`(mustache)を使う。</b>
<b>●HTML構文の中では使えない。</b>
→HTML構文の中で使う場合は、`v-bind`(Directive)を使う。

```<p>{{ message }}</p>
<div v-bind:message="mustache"></div>```

<b>●mustacheはHTMLではなくプレーンテキスト（文字列）として認識される。</b>
<b>●mustacheの中の式はJavascriptとして処理される。</b>


# Directives
<b>●`v-`から始まるもの</b>
<b>●mustacheの値が変わった際にすぐ反応することを期待して作られた</b>
<b>●argumentとvalueを指定できる</b>

`v-bind:argument="value"`

ex)
`v-bind:href="url"`
`v-on:click="addToCart"`

<b>●argumentには式(JavaScript)を記入できる</b>
→式そのものは文字列として認識される。
→`スペース`と`'`は使えない（コンパイルエラーになる）

ex)
```hereIsArgument = "href"
v-bind:[hereIsArgument]="url"```
→<b>`v-bind:href="url"`</b>として認識される


# Modifier
<b>●v-bindなどのdirectiveの後ろにつけられる`.`のこと</b>
<b>●directiveを特別な方法で開始するもの</b>
<b>●それぞれのdirectiveに対してそれぞれmodifierが決まっており、それぞれ特定の処理を呼び出す</b>
ex)
`<form v-on:submit.prevent="onSubmit"> ... </form>`
→`.prevent`は`v-on`に対して、`submit`実行前に`event.preventDefault()`を呼ばせる
＝ submit実行前に.preventの処理（event.preventDefault())が走る


# computed:
<b>●valueを変えて式を繰り返し使いたい場合は`compute:`に宣言する</b>
（→メソッドと同じでは・・・？）

<b>●`methods:`の式は呼ばれる度実行されるが、`compute:`の式はvalueが変わらなければ実行されない</b>
→`compute:`の式はvalueが変わると実行され、新しいvalueがキャッシュされるので、
valueが変わらなければキャッシュのvalueがずっと使用される
→ただし`Date.now()`は`reactive`なものではないので、`compute:`に宣言しても実行されない
<b>●実行結果をキャッシュしたくないとき（その都度データを更新したいとき）は`methods:`に宣言する</b>
<b>●基本的にcompute内の宣言は`getter`しか持たないが、`setter`を持つhjjhhhこともできる</b>

# watch

<b>●Vueインスタンス上のデータが動的に変わるかを監視するもの</b>
→`compute:`上に宣言するほうがコードも短くて済む

# class
<b>●classには`object`, `array`が使用できる。</b>
<b>●`Component`内で`class`をbindingした場合、そのcomponent（root）のクラスにbindしたクラスが「追加」される（＝上書きされない）</b>

```
---JS-------------------------
Vue.component('my-component', {
  template: '<p class="foo bar">Hi</p>'
})
--------------------------------

---HTML-------------------------
<my-component class="baz boo"></my-component>
--------------------------------


---Result-----------------------
<p class="foo bar baz boo">Hi</p>
--------------------------------
```

# style
<b>●キャメルケース(camelCase）かケバブケース(kebab-case)が使用できる</b>
→ケバブケースの場合は`'`で囲む必要がある（'kebab-case'）
名前空間たるものを勉強してみた件について

#はじめに
こんにちは、こんばんは。
ワタタクです。
今回は名前空間について見ていこうと思います。

正直なところ私、名前空間という概念をまったく理解しておりませんでした。
なので自分の勉強だと思い、一から書いていきたいと思います。

#名前空間とは
*※phpの名前空間はver5.3から使用できます。*

- namespaceとも呼ばれ、項目をカプセル化するときに使われます。
- 例えば同じファイルに同じクラスや同じ関数名、定数名が存在できませんが、名前空間を使うと関連するクラス、インターフェース、関数、定数などをグループ化することができます。
そのため、名前空間を指定しておけば自分が作ったクラスがサードパーティーのクラスや関数などと名前が衝突することを防ぐことが出来ます。

#書き方
書き方は下記の方法。

```php
namespace 名前空間;
```
**注意）**
- ソースコードの1番先頭で宣言する。
- namespaceの前にHTMLを書かない。

#namespaceの使い方
ここでは、namespaceを使用しないで別々のファイルから同名の関数を呼び出したときの挙動と名前空間をを使ってどのように解決するかを見ていきます。
##名前の衝突とは
以下のソースはエラーが発生します。

```php:Sample_1.php
function getHoge() {
   return "hoge";
}

function getHoge() {
   return "Boo";
}
```

```php:Sample_2.php
require_once "Sample_1.php";

echo getHoge();
```

```
実行結果：エラー
```
当然ですよね（笑）

なので、名前空間とやらを使いましょう。

```php:Sample_1.php
namespace name1;

function getHoge() {
   return "hoge";
}

namespace name2;

function getHoge() {
   return "Boo";
}
```

```php:Sample_2.php
require_once "Sample_1.php";

echo name1\getHoge();
echo name2\getHoge();
```

```
実行結果：hogeBoo
```
namespaceを宣言すると、その後に記述した関数はその名前空間の関数に属されます。
サンプルではname1とname2を宣言して、その直後に関数を記述しているため、name1のgetHoge()、name2のgetHoge()と区別されます。
Sample_2.phpで関数を呼び出すときは**「名前空間\関数名」**とすれば同一の関数を呼び出すことが出来ます。

#useの使い方
名前空間を勉強していく中でもうひとつ出てくる単語が**use**です。
ここではこのuseについて見ていきましょう。
##useとは
名前空間の拡張機能で、外部のエイリアスやその一部を参照したり、クラス・関数・定数などをインポートするときに使います。
##書き方

```php
use 名前空間または一部クラス・関数・定数など as 別名称;
```
*※「as 別名称」　省略可*

**use**キーワードを使用して名前空間の一部を取得し、それぞれの名前空間の関数を呼び出す方法。

```php:place.php
namespace asia\japan\tokyo\shibuya

function getName() {
    return "shibuya";
}

namespace asia\japan\tokyo\shinzyuku

function getName() {
    return "shinzyuku";
}

namespace asia\japan\tokyo\minato

function getName() {
    return "minato";
}
```

```php:read.php
require_once "place.php";

use asia\japan\tokyo as name;

echo name\shibuya\getName();
echo "<br>";
echo name\shinzyuku\getName();
echo "<br>";
echo name\minato\getName();
```

```
実行結果：
shibuya
shinzyuku
minato
```
#さいごに
namespace結構便利だわw

以上。間違っている点などございましたら連絡してください。
最後まで読んでいただきありがとうございました。
Windows Shortcut Key

Windows7のショートカットキーをまとめたので、ここに記す。
（Windows Key = Home と記す）

# 1. 使用頻度　★★★★★
|Short Cut|Operation|
|:-------:|:-------:|
|Home+e|コンピュータを開く|
|Home+(数字)|タスクバーの起動|
|Alt+F4|閉じる|
|Ctrl*w|閉じる|
|Alt-←|1ページ前のフォルダに移動|
|Alt-→|1ページ後のフォルダに移動|
|Alt-↑|親フォルダに移動|
|Print Screenキー|スクリーンショット|
|Alt-Tab|ウィンドウを切り替える|
|Ctrl-n|新規ページ作成|

# 2. 使用頻度　★★★★☆
|Short Cut|Operation|
|:-------:|:-------:|
|Home-l|PCロック|
|Home-m|全て最小化|
|Home-Shift-m|「全て最小化」を元に戻す|
|Home-移動キー|ファイルを移動させる|
|Ctrl-Shift-Esc|タスクマネージャー|

# 3. 使用頻度　★★★☆☆
|Short Cut|Operation|
|:-------:|:-------:|
|Alt-Enter|プロパティを開く|
|Home-Print Screenキー|スクリーンショットして保存する|