OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでC#やJavaのinterfaceみたいなものを実現する

# はじめに

僕はC#やJavaのような静的型付けのオブジェクト指向言語に慣れており、pythonを勉強中です。
C#やJavaにはinterfaceというのがあり、そのinterfaceを実装したさまざまなクラスのインスタンスを、すべて同じ型のオブジェクトのように取り扱うことができます。

同じようなことをpythonでもできないのかな、と思って調べてみました。

# 抽象基底クラス（ABC: Abstract Base Class）の定義

pythonはバージョン3で抽象基底クラス（ABC: Abstract Base Class）というものをサポートするようになったそうです。
これを利用することで、C#やJavaのインタフェースみたいなものを実現できるようです。
試してみましょう。

```python
class AbstractHello(metaclass=ABCMeta):
    @abstractmethod
    def hello(self):
        pass
```

このコードでは、メタクラスに`ABCMeta`を指定しています。これにより、抽象基底クラス`AbstractHello`クラスを定義できます。
また、`AbstractHello`クラス中の`hello`メソッド定義には、`@abstractmethod`というデコレータをつけます。これにより、`AbstractHello`を継承するクラスは、`hello`メソッドを必ずオーバーライドしなければならなくなります。
オーバーライドしなかった場合、そのクラスのインスタンスを生成した際にエラーとなります。

```python
class WrongHello(AbstractHello):
    pass
w = WrongHello()


# エラー
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-70ed5a2d6030> in <module>()
      1 class WrongHello(AbstractHello):
      2     pass
----> 3 w = WrongHello()

TypeError: Can't instantiate abstract class WrongHello with abstract methods hello
```

`hello`メソッドを正しく実装した派生クラスを2つ定義してみましょう。

```python
class HalfHello(AbstractHello):
    def hello(self):
        return 'Hello, world!'
    
class WideHello(AbstractHello):
    def hello(self):
        return 'Ｈｅｌｌｏ，　ｗｏｒｌｄ！'

helloes = [HalfHello(), WideHello()]

for h in helloes:
    print(h.hello())

# 出力
Hello, world!
Ｈｅｌｌｏ，　ｗｏｒｌｄ！
```

このように、抽象基底クラスを利用することにより、C#やJavaのinterfaceと同じように、実装をサブクラスに隠蔽しつつ、クラスが持つメソッドのシグネチャを揃えることができます。

# 注意点

ただし、あくまでpythonは動的型付け言語であり、派生クラスの定義時に厳密な型チェックやメソッドのシグネチャのチェックは行っていないことに注意しましょう。

例えば、以下の例では、抽象基底クラス`AbstractGreeting`では、文字列の引数`name`を取る`greetinig`メソッドを定義しています。
一方で、`AbstractGreeting`を継承する`JapaneseGreeting`で定義した`greeting`メソッドは、引数`name`を取りません。
それでも、エラーとならずに`JapaneseGreeting`のインスタンスを生成、メソッド呼び出しをすることができます。

```python
class AbstractGreeting(metaclass=ABCMeta):
    @abstractmethod
    def greeting(self, name):
        pass

class EnglishGreeting(AbstractGreeting):
    def greeting(self, name):
        return 'Hello, %s' % name

class JapaneseGreeting(AbstractGreeting):
    def greeting(self):
        return 'こんにちは、%sさん' % 'John'

print(EnglishGreeting().greeting('John'))
print(JapaneseGreeting().greeting())

# 出力
Hello, John
こんにちは、Johnさん
```

C#やJavaであれば、JapaneseGreetingのようなクラス定義はコンパイルエラーとなりますが、pythonはそうはなりません。
あくまでも抽象基底クラスの継承者が自身の責任で正しくメソッドをオーバーライドする必要があります。

# まとめ

* C#やJavaのinterfaceに似たものを定義するためには、抽象基底クラスを利用する。
   * クラス定義に`SomeInterface<metaclass=ABCMeta)`と書き、メソッド定義に`@abstractmethod`のデコレータをつければ良い。
* 抽象基底クラスを継承したクラスでは、`@abstractmethod`デコレータをつけたメソッドをすべてオーバーライドする必要がある。
   * ただし、メソッドのシグネチャが基底クラスと一致せずとも、呼び出さない限りはエラーとならないので注意する。
opencvのバージョンをあげたら動作しなくなった。namespaceなんたらというエラーがでる

# 概要

自作ライブラリのttLibCで、opencvを使ってカメラ映像を取得したりするプログラム書いてた。

で、opencvのライブラリをbrewでインストールしていた3.4.0から
ソースコードから取得したopencv3.4.1にして見たところ

```
In file included from util/opencvUtil.c:17:
In file included from /usr/local/include/opencv/cv.h:63:
In file included from /usr/local/include/opencv2/core/core_c.h:48:
In file included from /usr/local/include/opencv2/core/types_c.h:59:
/usr/local/include/opencv2/core/cvdef.h:485:1: error: unknown type name 'namespace'
namespace cv {
^
/usr/local/include/opencv2/core/cvdef.h:485:13: error: expected ';' after top level declarator
namespace cv {
            ^
In file included from util/opencvUtil.c:18:
In file included from /usr/local/include/opencv/highgui.h:46:
/usr/local/include/opencv2/highgui/highgui_c.h:139:9: error: expected ';' after top level declarator
CVAPI(cv::Rect)cvGetWindowImageRect(const char* name);
        ^
/usr/local/include/opencv2/highgui/highgui_c.h:139:10: error: expected identifier or '('
CVAPI(cv::Rect)cvGetWindowImageRect(const char* name);
         ^
4 errors generated.
```

こんなエラーが出て動作しなくなってた。

# 解決策
cを使わない。cppを使う。

# 原因
c言語からopencvを使ってたのがまずかったみたいです。

この追加された下の方の部分
/usr/local/include/opencv2/core/cvdef.h
<img width="644" alt="スクリーンショット 2018-04-03 16.30.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/6246/b4ca6f06-785c-54b7-b1eb-d81e57c073fd.png">

これのせいで、c言語なのにnamespaceを使おうとしてただけでした。

OPENCV_STDINT_HEADERを定義してやって色々すれば回避できるかもしれませんが、とりあえずソースをc++にしてしまえば大丈夫になるみたいなので、それで行こうかと思います。
EC2 で nginx + php7.2 環境を構築した時にハマったメモ

EC2 で nginx + PHP7.2 の環境を構築していた時にハマったこと。
前提としては rpm とかはあまり詳しくないので、基本 yum だけでサクッと終わらせたい。

まずは nginx
nginx はバージョンのこだわりも特に無いので、さくっと終了

```
yum install nginx
```
次に php7.2。
php として 7.2 が動く（「php -v」で7.2となる）ようにしたい。
普通に yum install すると 5.3 になるので、  

```
$ sudo rpm -Uvh ftp://ftp.scientificlinux.org/linux/scientific/6.4/x86_64/updates/fastbugs/scl-utils-20120927-8.el6.x86_64.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```
で

```
$ sudo yum install --enablerepo=remi-php72 php-fpm
```
なのだが、これだと php として 7.2 がインストールされない。

色々調べていたら下記を発見。
https://dev.classmethod.jp/server-side/os/amazonlinux-yum-priority/

どうやら、**Amazon Linux の場合**はデフォルトでリポジトリの優先度を設定できるプラグインがインストールされているらしい。

なので、/etc/yum.repos.d/amzn-main.repo を

```
-priority=10
+priority=99
```

これで解決した。
GCEへPython3.6インストール

```sh
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

tar zxvf Python-3.6.1.tgz 

cd Python-3.6.1

./configure --prefix=/usr/locla/python

su

（パスワード入力）

make && make install

exit
LaravelでコントローラのメソッドからView（ブレード）へ変数を渡すときの表示のされ方

あるコントローラにつぎのようなメソッドがあるとする。

```php

    public function index()
    {
        $view_params = [];
        $view_params[0] = 'りんご';
        $view_params[1] = 'みかん';
        $view_params[2] = 'バナナ';
        $view_params[3] = '<a href="#">パイナップル</a>';
        $view_params[4] = '<h1>いちご</h1>';
        $view_params[5] = '<span style="background-color: yellow;">レモン</span>';
        return view('yamato/sample', ['view_params' => $view_params]);
    }
```

このとき、sample.blade.php を下記のように書いたとする。

```php
ブレード表示テスト

<p>{{$view_params[0]}}</p>

<p><?php echo $view_params[1]; ?></p>

<p><?=$view_params[2]?></p>

<p>{{$view_params[3]}}</p>

<p>{!! $view_params[3] !!}</p>

<p><?php echo $view_params[4]; ?></p>

<p><?=$view_params[5]?></p>
```
表示は下記の通り。

![view.png](https://qiita-image-store.s3.amazonaws.com/0/75451/22ba7dde-165f-6323-b842-a394039caeb4.png)
【what is】限定共有投稿

投稿者本人及びURLを知っているユーザーのみアクセス可能な投稿
＜参考URL＞
https://help.qiita.com/ja/articles/qiita-private-article

なるほど。
完全非公開ではなく、URLを知っていれば誰でも見れるんですね。
Swift3 Storyboardで画面の中心にViewを配置する

# Swift3 Storyboardで画面の中心にViewを配置する

## やりたいこと

Storyboardから任意のViewを画面の中心に配置したい

## 動作環境
- Xcode9.2
- Swift3

## 手順
1. Storyboardにviewを配置する
2. 配置したViewにオートレイアウトで画面の中心に配置を行う
3. Viewのサイズの制約を追加する



### 1. Storyboardにviewを配置する
プロジェクトのStoryboardを開き、画面の中心に配置したいViewを配置します

### 2. 配置したViewにオートレイアウトで画面の中心に配置を行う
配置したViewを選択し、Storyboardの画面右下に存在する「Add New Alignment Constraints」をクリックし、「Horizontally in Container」と「Vertically in Container」にチェックを入れ、
「Add Constraints」をクリックし制約を反映します。

![AddNewAlignmentConstraints.png](https://qiita-image-store.s3.amazonaws.com/0/139291/e0f75e63-b822-b7e7-6a76-7c665316fb88.png)


### 3. Viewのサイズの制約を追加する
このままだと制約が足りずエラーになってしまうので、今回はエラー回避のためにViewのサイズに制約を設けます。
配置したViewを選択し、Storyboardの画面右下に存在する「Add New Constraints」をクリックし、「Width」と「Height」にチェックを入れ、「Add Constraints」をクリックし制約を反映させます。
この時の「Width」と「Height」のサイズでViewに制約が追加されます。

![AddNewConstraints.png](https://qiita-image-store.s3.amazonaws.com/0/139291/6a4c9ba3-92cd-586d-8a9c-0208f6423d2f.png)


上記手順で指定したViewが中心に配置されるようになります。
[map,filterなど高階関数がよく分からない場合]listの中にlistを持っていた時にmap関数を使いたい

# [map,filterなど高階関数がよく分からない場合]listの中にlistを持っていた時にmap関数を使いたい

なんてことはないんだけど、解説してるサイトが見つからなかったので、後で困った時のためにメモ。

``` list_in_list.py
list_in_list = [
  ['1A','1B','1C'],
  ['2A','2B'],
  ['3A','3B','3C','4D']
]

list(
  map(
    print, list_in_list
  )
)
#['1A','1B','1C']
#['2A','2B']
#['3A','3B','3C','4D']

list(map(lambda lists:list(map(print, lists)) , list_in_list))
#1A
#1B
#1C
#2A
#2B
#3A
#3B
#3C
#4D
```

リストの外の括弧[]に対してlist(map())でループを回しているイメージ。

## 発展

ただし、

``` list_in_list.py
list_in_list = [['first',['1A','1B','1C']],['second',['2A','2B']],['third',['3A','3B','3C','4D']]]

list(map(lambda lists:list(map(print, lists)) , list_in_list))

#first
#['1A','1B','1C']

#second
#['2A','2B']

#third
#['3A','3B','3C','4D']
```

のようなデータを扱うと、以下の場合おかしくなる。

``` list_in_list.py
list(map(lambda lists:list(map(lambda list2:list(map(print, list2)), lists)) , list_in_list))
#f
#i
#r
#s
#t
#1A
#1B
#1C
#s
#e
#c
#o
#n
#d
#2A
#2B
#t
#h
#i
#r
#d
#3A
#3B
#3C
#4D
```

これは、stringに'first'を入れてstring[0]、string[1]...のように取り出すような振る舞いがされている。
そのためエラーにならないが、期待値と異なる事がある。

## 解決
これを防ぎたい場合、たとえば今回の場合は以下のような書き方で逃げられる。

``` list_in_list.py
list(map(lambda lists:list(map(print, lists[1])) , list_in_list))
#1A
#1B
#1C
#2A
#2B
#3A
#3B
#3C
#4D
```

lists[0]のfirst, second, thirdを取りたい場合は、

``` list_in_list.py
list(map(lambda string: print(x[0]), list_in_list))

#first
#second
#third
```

で取れる。
落ち着いて一つずつ読み解けば難しい事ではないんだけど、勘違いしやすいので注意。
よく分からなくなった場合、list(map(..., list_in_list))をfor文に書き直してみると気付きやすいかも。

## 2018/04/09 解決追記
itertools.chainを使うともう少しスマートになる。

``` answer_comment.py
from itertools import chain

list_in_list = [['first', ['1A', '1B', '1C']], 'second', ['second',['2A', '2B']], ['third', [['3A', '3B', '3C', '4D']]]]
list(
    map(print, list_in_list )
)
```

# python2.x系の場合
printで説明しているのでprintについて言及するが、python2では上記をそのまま使えない。
そのため、以下のような関数を用意する。

``` python2.py
def my_print(message):
    print message
```
これでとりあえず使える。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
クライアントOSからサーバー側Hyper-V管理に接続する方法

## 検証環境
* Hyper-VサーバーOS: WindowsServer2016
* クライアントOS: Windows10


接続先Hyper-Vサーバーと同じドメインでないクライアントの場合
---
なぜか同じドメインに参加していないクライアントからは繋ぐのに苦労する。

以下の作業はクライアント上でのみ実施すること。
※コマンドの先頭についている`$`や`#`はLinuxシェルを模しているだけなので入力する必要はない点に注意。

### Hyper-V管理ツールのインストール
"Windowsの機能の有効化または無効化"から、"Hyper-V管理ツール"を有効にする。
![2018-04-03_14h41_24.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/c34d71b9-12ca-7dec-3320-d1b189eff450.jpeg)



### WindowsServer管理サービスの自動起動
サービス一覧(`services.msc`)を開き、`Windows Remote Management (WS-Management)`を自動起動に設定した上で起動する。
![2018-04-03_14h15_46.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/e0cad913-1c8a-1546-4a76-6df349b41ab0.jpeg)



### 名前引きの設定
DNSサーバーやhostsファイルの設定を行い、接続先Hyper-Vサーバーを名前解決できるようにする。
![2018-04-03_14h21_25.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/0f0a88d6-8465-bb04-42db-1df8a76022ca.jpeg)


### 資格情報の登録
以下のコマンドを実行し、接続先Hyper-Vサーバー(名前解決可能であること)の管理者資格情報を入力する。

```
$ cmdkey /add:{接続先Hyper-Vサーバー名} /user:administrator /pass:{パスワード}
【例】
$ cmdkey /add:host-sv /user:administrator /pass:password
```


### コンポーネントサービスの設定
コンポーネントサービス(`dcomcnfg`)を開き、"マイコンピューター"の"プロパティ"を開く。
![2018-04-03_14h27_35.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/f31ea929-12f0-0ba4-b725-b29b94889492.jpeg)

"COMセキュリティ"タブを開き、"アクセス許可"の"制限の編集"を開く。
![2018-04-03_14h28_44.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/6e912681-97e6-edd0-7847-5d69c320af5e.jpeg)

"ANONYMOUS LOGON"ユーザーを選択し、"リモートアクセス"を許可する。
![2018-04-03_14h29_00.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/094db94a-3932-00b0-c8b0-624a1311a83d.jpeg)


### リモート管理対象として登録
以下のコマンドをPowerShellで実行する。問題なければ何も表示されない。

```
# Set-Item WSMan:\localhost\client\trustedhosts -Value * -Force
```


### Hyper-V管理ツールに管理対象を登録する
Hyper-V管理ツールを起動し、"サーバーに接続"を選択する。
![2018-04-03_14h43_37.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/f1184467-44c6-5a1c-f59a-06312ee2c250.jpeg)

名前解決可能なアドレスで対象サーバーに接続する。
![2018-04-03_14h44_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/d94fe136-1db1-54ef-ca49-fd78aeb73771.jpeg)

問題なく仮想マシンにアクセスできることを確認する。
![2018-04-03_14h44_34.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/a2488e81-af14-2ad5-412f-b9b218d30c0a.jpeg)

接続先Hyper-Vサーバーと同じドメインに参加しているクライアントの場合
---
Hyper-V管理ツールのインストールさえしておけば、ややこしいことせずに使えるはず。
多分、ADに参加していることで名前解決・認証・リモート管理サービスが裏でうまいこと動作しているからだと思われる。
VScodeでanaconda内のpython3を使う

# はじめに
今までatomを使っていたんですが、VScodeが一番人気があるって聞いてミーハー心をくすぐられVScodeを使ってみることにしました。
そこでpythonの設定をしていたんですが、pep8を有効にしようとしたら謎にエラーを吐き出し、こんな感じのエラーは他の人も出うるのではないかと思ってメモ書きしておきます。
ここのエラー解消はVScodeでpython3を使いたい人全般に役立つと思います。


# 環境
Mac OS HighSierra 10.13.4
VScode バージョン1.21.1
Anaconda3-5.1.0


# 準備
1. VScodeをインストールする
2. VScodeに拡張機能のpythonをインストールする(microsoftが出してるやつです)
3. VScodeを開き直す or 再読み込みをする


# 結論
すべきことは簡単なので先に書いておきます。

1. command+, で設定を開く
2. Python Configurationの項目を開く
3. python.pythonPathを"python"から"python3"に変更する  
   (ユーザー設定に "python.pythonPath": "python3" を書き足す)


僕はこれでいけました。
何がしたかったかいうと、デフォルトの設定ではターミナルでpythonと打って反応するpython、すなわちMacに初期搭載されているpython2.7がVScodeに設定されていました。
これを変更するためにanaconda内のpython3.6が反応するコマンド、python3に変更したということです。

なので皆さんのPCの設定に合わせてここを変更してもらえればいいと思います。


# よかったこと
僕の目的としてはpep8を有効にしてlintingしてもらうことでした。
なので他にも以下の設定の変更をしています。

"python.linting.pylintEnabled": false
"python.linting.pep8Enabled": true

これでうまくいきます。
pythonPathがデフォルトのままだと「pep8がありません」みたいなエラーが出たりしてうまくいきません。
anacondaにはもとからpep8が入ってるらしいのでこの設定にすれば大丈夫です。
anaconda使ってない人でもpipとか使えばpep8は使えます。
Go言語はじめました

#なぜGo？
特に理由はないです 
なんか流行ってるっぽい？
#読んだ本
<img width="253" alt="スクリーンショット 2018-04-03 12.25.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/baa75928-90e7-842f-a28a-dc280b4635b5.png">
[みんなのGo言語【現場で使える実践テクニック】](https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEGo%E8%A8%80%E8%AA%9E%E3%80%90%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%80%91-%E6%9D%BE%E6%9C%A8%E9%9B%85%E5%B9%B8/dp/477418392X)
まだ20ページくらいしか読んでない(｡･ˇ_ˇ･｡)
なので読み進めたがら記事を更新していこうと思ってます（更新頻度は未定）
#とりあえず環境構築！
brewでインストール

```:インストール
brew install go
```
GOPATHの設定

```:パスの設定
export GOPATH=$HOME/dev
export PATH=$PATH:$GOPATH/bin
```

#エディタ
エディタはよくわかんないので[ATOM](https://atom.io/)を使いました
Go言語用の支援ツールがあったので入れました

- [go-plus](https://atom.io/packages/go-plus)
- [godef](https://atom.io/packages/godef)

導入方法はググったら見つけました
@m0a の[記事](https://qiita.com/m0a/items/b7b27254a43d50b7aba2)を参考にさせていただきました



##Goで必要なもの

```:インストール
go get golang.org/x/tools/cmd/goimports
go get github.com/nsf/gocode
go get github.com/rogpeppe/godef
```
##ATOMで必要なもの

```:インストール
apm install go-plus
apm install godef
```

##で？どうなった？
イマイチわかってない、でも唯一便利なところが！
<img width="834" alt="スクリーンショット 2018-04-03 14.45.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/a72c8d61-4272-1b17-72cf-76d468887aa6.png">
上の画像のめちゃくちゃなコードですが(fmtのimportすらなくインデントも悪い！)
ファイルの保存をしたら
<img width="935" alt="スクリーンショット 2018-04-03 14.57.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/2009f6cf-b1d5-4187-a128-b6ee60402e7b.png">
綺麗になってる~しかもimportまで!

#とりあえずここまで
この記事を更新するか新しく記事書きます
Vue.js でマウスの右クリックイベントを指定するときのイディオム

`@click.right` とするだけではなかなか思い通りに動きません。

どうすればよいか簡単に言うと「Vue.js の最新版を使い `@click.right.prevent` と書いてその要素のスタイルに `user-select: none` を指定する」です。

<p data-height="265" data-theme-id="0" data-slug-hash="xWzKPw" data-default-tab="html,result" data-user="akicho8" data-embed-version="2" data-pen-title="Vue.js mouse click event check" class="codepen">See the Pen <a href="https://codepen.io/akicho8/pen/xWzKPw/">Vue.js mouse click event check</a> by Akira Ikeda (<a href="https://codepen.io/akicho8">@akicho8</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

1. Vue の最新版を使う
  - Vue 2.5.2 とかちょっと前のバージョンだとそもそもバグっていて動かない
  - Vue 2.5.16 だと動くことを確認
2. .prevent 装飾子を付ける
  - 付けないとブラウザのコンテキストメニューまで表示される
3. CSS で該当要素に `user-select: none` を指定しておく
  - Macのトラックパッドを二本指でタップすると右クリックしたことになる
  - そのとき、このスタイルを指定してないとクリックした部分のテキストが選択されてしまう
  - Bulma を使っている場合は `is-unselectable` クラスを指定すればいい
intra-mart実践入門の作成記録 #011 タイトルと表紙ができました。

# タイトル
## メインタイトル
intra-mart実践入門
## サブタイトル
中規模企業の社内システム自社開発
## 帯メッセージ１
スキルレベルに関係なく知りたい技術調査を削減できるサンプル集
## 帯メッセージ２
業務要件に集中するための実践的ノウハウ
## 注意
既存の投稿のタイトルも差替えます。

# 表紙
技術評論社のWEB+DB PRESS plusシリーズの表紙をリスペクトして以下のようなものにしました。
オライリーの動物本とどちらにしようか迷いましたが、本棚に多かった技術評論社のカバーを参考にデザインしました。
また、文字だけで構成されているので絵心のない私にも作りやすかったというのももう一つの理由です。
関係各所からお叱りを受けた場合はすぐに変更するつもりです。

![cover.jpg](https://qiita-image-store.s3.amazonaws.com/0/228081/22f9395f-af74-8b24-afb3-8f54dd9ac0f6.jpeg)
アンドロイドアプリを作る。（5日目）

先日から以下テキストで勉強中。

***TECHNICAL MASTER はじめてのAndroidアプリ開発 第2版 Android Studio 2対応***
![TECHNICAL MASTER はじめてのAndroidアプリ開発 第2版 Android Studio 2対応](https://images-na.ssl-images-amazon.com/images/I/51P6WpRZFAL._SX387_BO1,204,203,200_.jpg)


##テキストボックス
###ヒントを表示
```java
<EditText
   ~中略~
   android:hint="氏名を入力してください。"
   ~中略~
/>
```

##入力ウィジェット

```java
//スピナー取得
        Spinner sp = (Spinner)findViewById(R.id.spnOs);
        //スピナーに対してイベントスピナーを登録
        sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Spinner sp = (Spinner)parent;
                //選択項目を取得し、その値をトースト表示
                Toast.makeText(MainActivity.this,
                        String.format("選択項目：%s", sp.getSelectedItem()),
                        Toast.LENGTH_SHORT).show();
            }

            //項目が撰択されなかった場合の処理（今回は空）
            public void onNothingSelected(AdapterView<?> parent){}
        });
```
![sppner_dialog.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/185846/f48b8e22-6f76-e841-ae4a-c7509f7508d2.gif)

###日付
日付を取得する場合

```java
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd", Locale.JAPAN);
```
**注意**：月は`MM`と大文字にする。小文字だと変になる。

##何か作ってみようとした
ここまでやった内容で、何かアプリっぽい物を作ろうとした。

###イラスト屋の画像検索アプリ
イラスト屋のキーワード検索結果をWebViewで表示できるようにしたいと思ってやってみた。
しかし、`ERR_NAME_NOT_RESOLVED`となって表示できない。。。
![エラー](https://teratail.storage.googleapis.com/uploads/contributed_images/38f457e93eb0588ca70992f7fad72e03.png)
~~もし、心優しい方がいらっしゃいましたら、[tetailに投稿している](https://teratail.com/questions/120035)ので、教えてください！~~
teratailで回答をいただいたが、コード自体に誤りはなく、***ネットワーク環境問題***でした。

###じゃんけんアプリ
`ぐー`、`ちょき`、`ぱー`のボタンを押すと同時に、自分とCOMのじゃんけん結果を表示。
上部に勝敗履歴をカウントするアプリを作ろうとしました。
しかし、こちらは時間の制約で、判定結果を計算するところまでたどり着かず、後日に持ち越し。
![スクリーンショット 2018-04-03 14.23.24.png](https://qiita-image-store.s3.amazonaws.com/0/185846/a842a81e-f255-00ad-230e-0ad46dd61852.png)

##あとがき
試しにアプリを作ろうとしたが、まだまだ何か作れる段階ではないと思い知りました。
次回からは、第４章に進みリストの作成を学んでいきます。
コレクションオブジェクト/ファーストクラスコレクションについて勉強してみた

なんとなくAPEXを書いていたのですが、オブジェクト指向言語ですので、もう少しオブジェクト指向言語っぽく書いてみようと思いました。そこでコレクションオブジェクト/ファーストクラスコレクションなるものを初めて聞いたのでそれのメモ。

# 開発環境
APEX

# 対象読者
APEX書いているけど、オブジェクト指向っぽくない書き方をしている方

# コレクションオブジェクト/ファーストクラスコレクションとは？
コレクションを独自のクラスでラップすること。

# コレクションオブジェクト/ファーストクラスコレクションをすると何が良いの？
今まで以下のような同じ型のオブジェクトを複数持つ配列やコレクションを扱うコードが複雑になりがちだったのを一つのクラスで書ける。

・for文などループ処理のロジック
・配列やコレクションの要素の数が変化する（可能性がある）
・個々の要素の内容が変化する（可能性がある）
・ゼロ件の場合の処理
・要素の最大数の制限

要するにいままで適当に書いていたところを一つのコレクションに集約できるので、
保守がしやすいってことですね。

# 課題1
・取引先数を計算する機能を追加する

## 今までの書き方

```java
List<Account> accounts = new List<Account>;

// …（省略）

// 取引先数
return accounts.size();
```

## コレクションオブジェクト/ファーストクラスコレクションを使った書き方
```java
class Accounts {
  List<Account> accounts;

  Integer count(){
    return accounts.size();    
  }
}

```

# 課題2
・明細合計を計算する機能を追加する

## 今までの書き方

```java
List<Detail> details = new List<Detail>;

// …（省略）

// 明細合計
integer sum = 0;
for (Detail detail : details) {
  sum += detail.amount;
}
return sum;
```

## コレクションオブジェクト/ファーストクラスコレクションを使った書き方
```java
class Details {
  List<Detail> details;

  Integer sum(){
    sum = 0;
    for (Detail detail : details) {
      sum += detail.amount;
    }
    return sum;
  }
}

```
PowerAppsで、Excelからのテーブルデータから画像を使用する方法

# 概要
https://twitter.com/TaikiYoshidaJP/status/980842212295503872?s=20

ここ真似をしていたら牛丼が表示されなくて詰まったので、その対策。

# 対策
項目名の末尾に、`[iamege]`を追加する。データには、URLとか、相対パス(OneDriveを使用している場合)を書く。

# 参考
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/tutorial-working-with-images-in-excel
EC2にssh接続してもタイムアウトする場合の対処法

AWS未経験だったので入門として [0から始めるAWS入門](https://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde) をとおして触ってみたら
SSH接続ができず躓いたのでメモします。

## ポイント１：インターネットゲートウェイ
作成したVPCにインターネットゲートウェイが関連付けられてるか確認する。

## ポイント２：インターネットゲートウェイとのルーティング
ルートテーブルでインターネットゲートウェイとのルーティングが設定されているか確認する。

## ポイント3：ルートテーブルにサブネットが関連付けられいるか
自分はここが足りてなかったみたいです。
ルートテーブルの「サブネットの関連付け」タブで「編集」ー＞関連付けたいサブネットにチェックー＞「保存」してサブネットの関連付けを行ってください。

## 参考
[SSH 経由での EC2 Linux インスタンスへの接続に関するトラブルシューティング](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-ssh-troubleshooting/)
Djangoで画像が表示されない（staticエラー）

Djangoの内蔵サーバーやGunicorn使用時は、Adminやトップの**画像**は問題なく表示されていたが、AWSのサーバーにデプロイして、NginxとGunicornでhttp経由でも動くようにしたところ、画面やCSSが無効になってしまうという問題に直面したので、その解決経由をメモとして残します。

# 【原因】 
セキュリティ上の問題などから、Nginxなど（Apatchなども同様）のWebサーバーを使用した際は、静的ファイル（CSSなど）は読み込まれなくなってしまいます。
今回、トップ画面の一部の画像も静的ファイルとして(static)いたので、それも表示されなくなってしまっっていました。

#【実践項目】 
Django(1.1.3版) 静的ファイル(static files)を集める場所を指定し、そこから読み込むようにする 

```python:myproject/myproject/setting.pyに追記 
STATIC_URL = '/static/'　
STATIC_ROOT = os.path.join(BASE_DIR, 'static')　（←static filesが集まる場所を示します） 
```

```python:myproject/myproject/urls.pyに追加
from django.conf.urls import url, static
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) （読み込むようにします） 
```
上記変更後、`python3 manage.py collectstatic`を実行します。 これにより、ファイルをSTATIC_ROOTディレクトリに集め、ここを読み込んで静的ファイルがNginxなどでも動作するようになります。 
ほかにもいろいろやり方はありますが、今回はこれで解決しました。

#【参考リンク】
[django.contrib.staticfilesを使う](http://tokibito.hatenablog.com/entry/20120921/1348153563)　（一番参考になりました） 
[Django での static files の扱い方まとめ](http://hideharaaws.hatenablog.com/entry/2014/12/12/230825)　（理由を理解できました） 
[djangoでのstaticファイルが読み込まれない闇](http://nshiba.hatenablog.com/entry/2014/12/05/042018)
[Nginx+Gunicorn+AWSでDjangoのadmin画面が崩れているのを修正した時のメモ](http://kazsoga.com/nginx-gunicorn-aws-django-admin/)
[Django入門】画像などのstatic（静的）なファイルを使ってみよう](https://www.sejuku.net/blog/31179) 
[Nginx not serving static files for Django app! Help!](https://www.digitalocean.com/community/questions/nginx-not-serving-static-files-for-django-app-help)
BigQuery | bq コマンド でパーティション情報を保ったままカラム名を変更する


- パーティションの単位ごとに、一時テーブルに対して、元テーブルのデータを流し込む。
  - ( 参考 : [Bigquery | テーブルのパーティション日時を一覧する - Qiita](https://qiita.com/YumaInaura/items/92aeede01ad8a6309d19) )
- 全単位のコピーが終わったら、元テーブルを一時テーブルで置き換える。 ( `bq mv` 的なコマンドがないため、 `bq cp` `bq rm` などで代用する )

# コマンド例

`bq query` でクエリを発行して、その結果を一時テーブルに流し込んでいく。

```bash
bq query \
  --allow_large_results \
  --use_legacy_sql=false
  --time_partitioning_type=DAY \
  --destination_table=dataset.temporary_table\$20180401 \
    "SELECT * EXCEPT (original_column_name), original_column_name AS replaced_column_name FROM dataset.original_table WHERE _PARTITIONTIME = '2018-04-01"
```

これを日付分繰り返す。

## シェルで無理やり日付分を回した例

雑いので参考にする場合はご注意。

```bash
sql=$(cat << EOS
SELECT
 CAST(DATE(_PARTITIONTIME) AS STRING) AS date
FROM
  dataset.original_table
GROUP BY
  DATE
ORDER BY
  DATE ASC
EOS
)

sql=$(echo "$sql" | tr '\n' ' ')

bq query "$sql" | grep -E "[0-9]" | sed "s/|//g" | sed "s/ //g" > ./table_list.tmp
while read date; do
  partition_decorator=$(echo $date | tr -d "-")
  table=dataset.original_table\$"${partition_decorator}"
  echo "$table"
  bq query --allow_large_results --use_legacy_sql=false --replace --time_partitioning_type=DAY \
    --destination_table=dataset.temporary_table\$"$partition_decorator" \
    "SELECT * EXCEPT (original_column_name), original_column_name AS replaced_column_name FROM dataset.original_table WHERE _PARTITIONTIME = '${date}'"
done <table_list.tmp

rm table_list.tmp
```

# 環境

- BigQuery CLI 2.0.30








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Bigquery | テーブルのパーティション日時を一覧する

# クエリ

パーティション疑似列に対してクエリを発行。

```sql
SELECT
  _PARTITIONTIME as partition_time
FROM
  dataset.table
GROUP BY
  partition_time
ORDER BY
  partition_time ASC
```

# 結果

こんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8919ce45-c4e7-ebad-29de-6d8d19c1a2cd.png)

# 参考

- https://cloud.google.com/bigquery/docs/querying-partitioned-tables?hl=ja#the_95partitiontime_pseudo_column








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
w3c contrast ratio

### ダークスーツにワンポイントレッドは見えないことがある。
w3cのコントラスト基準は二色覚者をカバーしたものでありデザイン的とは違う。

```css
/*limit AAA*/
.AAA-white{background-color:#FFF;color:#777;font-size:18px;};
```
### w3cのAAA基準が文字サイズと文字言語によって違う。英字と漢字は推奨サイズが違う。
AAA達成基準、画像からsvgへの推奨、ピクトアイコン、白黒印刷の要点も、ここにある。
### 文部科学省の文字基準は18-22ポイントである。
30pxの文字がparagraph相当になるのはWEB向けではない。あくまで印刷物向け。

```css
@media print{ ... } 
```

### 参考
https://waic.jp/committee/
http://www.mext.go.jp/a_menu/shotou/kyoukasho/1282361.htm
https://www.webcolordesign.net/color_point/jis_accesibility/contrast_ratio_jis.html
タイタニック・チュートリアル説明文邦訳

# Titanic: Machine Learning from Disaster
## はじめに

[Kaggle](https://www.kaggle.com)を始める人は、大抵[タイタニック･チュートリアル](https://www.kaggle.com/c/titanic)から手を付けると思います。

タイタニック・チュートリアルの説明文の英語は、それ程難しくはありませんが日本語訳があった方が良いでしょう。

以下、それぞれの中見出しがタイタニック・チュートリアルページのタブに相当します。

## Overview
### Desctiption
#### Start here if...

新たにデータサイエンスや機械学習を始めたり、Kaggleのコンペへの簡単な導入を探しているのであれば、このタイタニック・チュートリアルから始めると良いでしょう。

#### Competition Description

タイタニック号の沈没事件は、歴史上最も有名な海難事故の一つです。1912年4月15日、タイタニック号はその処女航海中に氷山と衝突し海の藻屑と消えました。実に乗客と船員合わせて2224人の内1502人が死亡したのです。この悲劇は世界中に衝撃を与え、より安全な航海規則の導入を促しました。

この沈没事故が多くの人命を損なうこととなった一つの原因は、乗客・船員の人数に対して救命艇の数が充分でなかった事が上げられます。しかしそういった生存に関わる要素の欠落にも関わらず、女性、子供、上流階級といった幾つかの集団は他の集団よりも生存率が高かったのです。

このチャレンジでは、どういった種類の人たちがより生存率が高かったのかを詳細に分析する事が目的です。特に機械学習を用いて、乗客の悲劇からの生還を予測してください。

#### Practice Skills

* Binary classification (2値分類)
* Python and R basics

## Data
### Overview

タイタニック・チュートリアルのデータは2つのグループに分かれています。

* training set (train.csv)
* test set (test.csv)

トレーニング･セットはあなたが機械学習のモデルを構築するときに使うべきデータです。トレーニング･セットには、それぞれの乗客が生還したかどうかの結果も一緒に格納されています。例えば乗客の性別や社会階級といった特徴量を使ってモデルを構築する事もできますし、或いは特徴量エンジニアリングを行ない、新たな特徴量を作ることも可能です。

テスト･セットは、構築したモデルが未知のデータに対してどのように働くかを確認するために使うデータです。テスト・セットにあるデータには乗客が生還したかどうかの値が含まれていません。この値を予測する事が主たる目的になります。あなたが構築したモデルを用いて、テスト・セットに登場する彼ら彼女らがタイタニック号の悲劇から生存できたのか、を予測するのです。

gender_submission.csvというデータもあります。これは全ての女性の乗客について「生存」と予測した参考データです。このデータを試しにサブミットしてみて結果がどうなるか見てみると良いでしょう。

### Data Dictionary

|Variable	|Definition	|Key|
|:--------------|:--------------|:------------------|
|survival	|生存したかどうか|0 = No, 1 = Yes|
|pclass	        |チケットのクラス|1 = 1st, 2 = 2nd, 3 = 3rd|
|sex	        |性別            ||
|Age	        |年齢            ||
|sibsp	        |同乗している兄弟・配偶者の人数||
|parch	        |同乗している両親の人数||
|ticket	        |チケット番号    ||
|fare	        |乗客の運賃      ||
|cabin	        |客室番号        ||
|embarked	|搭乗港名        |C = Cherbourg, Q = Queenstown, S = Southampton|

### Variable Notes

pclass: 社会経済状況の価値尺度

1st = 上流
2nd = 中流
3rd = 下流

age: 1歳未満は小数。もしその1歳未満の乗客の年齢が推測値の場合、小数点以下は.5としてある。

sibsp: このデータセットは、同乗している以下の親類数を数えている。

Sibling = 兄弟、姉妹、継兄弟、継姉妹
Spouse = 夫、妻 (未亡人と婚約者は数えない)

parch: このデータセットは、同乗している以下の親類数を数えている。

Parent = 父、母
Child = 息子、娘、継息子、継娘
何人かの子供は乳母と一緒に乗船しているがこれらについてはparch=0としている。

## Rules
### One account per participant

一人で複数アカウントを使ってサブミットする事は禁止されています。

### No private sharing outside teams

自身が作成したコードを、チーム以外の人に私的に共有する事は禁止されています。しかしフォーラムを通じて全ての参加者に共有する事は可能です。

### Team Mergers

チームの合併はチームリーダーのみが実行できます。合併する両チームの合計サブミット数が許可されている最大数以下でなければいけません。一日にサブミット可能な最大数と現在進行中のコンペの日数の積が最大数になります。

### Team Limits

チームの人数上限はありません。

### Submission Limits

一日に可能な最大サブミット数は10回です。
最終的にサブミットしたものから5個を選んで最終結果として送信します。

### Competition Timeline

Start Date: 2012年9月28日 9:13 PM UTC

Merger Deadline: なし

Entry Deadline: なし

End Date: 2020年1月7日 12:00 AM UTC

このコンペの狙いは、機械学習の導入への手助けです。タイタニック号の悲劇の詳細はインターネット上を探せば見つかります。そこには生存者の情報もありますが……それを使って答えたりしないでくださいね。
jsdoでtensorflow.js

#概要
jsdoでtensorflow.jsやってみた。

#サンプルコード

```
const model1 = tf.sequential();
model1.add(tf.layers.dense({
    units: 1, 
    inputShape: [1]
}));
model1.compile({
    loss: 'meanSquaredError', 
    optimizer: 'sgd'
});
const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);
const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);
model1.fit(xs, ys).then(() => {
    model1.predict(tf.tensor2d([5], [1, 1])).print();
});
  
function predict(input) {
  return tf.tidy(() => {
    const x = tf.scalar(input);
    const ax2 = a.mul(x.square());
    const bx = b.mul(x);
    const y = ax2.add(bx).add(c);
    return y;
  });
}
const a = tf.scalar(2);
const b = tf.scalar(4);
const c = tf.scalar(8);
const result = predict(2);
result.print()

```

#成果物
http://jsdo.it/ohisama1/U5Sn

以上。
[メモ][Laravel]Pivotモデルについて一瞬つまづいたポイントメモ

# Pivotモデルについて一瞬つまづいたポイントメモ

この記事はPivotモデルを利用した多対多構成が、普通にドキュメントを読んでもわかりづらかったので自分的にわかりやすくしたメモです。
想定構成は**PHP7** **laravel5.5**となっております。

なお、基本的に以下のページを参照しています。
おそらく躓きそうなことの8割は以下のページを見れば解決するかと思います。
[Laravel 5.5 Eloquent：リレーション](https://readouble.com/laravel/5.5/ja/eloquent-relationships.html#many-to-many)
[Pivot tables and many-to-many relationships](http://laraveldaily.com/pivot-tables-and-many-to-many-relationships/)


## Pivotテーブルの名称を特殊なものにしたい。

pivotテーブルの名称をLaravel標準のlogal_forginではなく、自分で作成した名称のものにしたいとき、belongsToManyの第二引数にテーブル名を与えると行うことができる。

```php5
public function users()
{
    return $this->belongsToMany('App\Role', 'role_user');
}
```

Eloquentではクラスのプライベート変数にテーブル名を宣言することができるため、以下のようにやりたくなるが、それは正しくない。

```php5:Role.php
<?php
namespace App
use Illuminate\Database\Eloquent\Model;

class Role extends Model {
    public function users() {
         return $this->belongsToMany('App\Role')->using('App\RoleUser');
    }
}
```

```php5:RoleUser.php
<?php
namespace App
use Illuminate\Database\Eloquent\Relations\Pivot;

class RoleUser extends Pivot {
    protected $table = "role_user";
}
```

Pivotモデルは以下のように呼び出す場合にデータが格納されるモデルの指定であり、取得系には関係がない。
たとえPivotモデルでテーブル名を指定してあっても、実際に呼び出しているEloquentモデル側で指定してあるDBテーブル名が間違えていれば容赦なく呼び出しに失敗する。
<font color="gray">pivotモデルを利用したテーブルの指定方法があったら教えてください。複数個所で同一テーブル名指定したくないです……</font>

```php5:ActionController.php
$roles = Role::find(1)->users;
foreach ($users as $user) {
    debug($user->pivot);
}
```

また、たとえpivotテーブルをモデルとして指定してあっても、pivotテーブル内の他のデータを取得するためにはリレーション指定の時点で指定していなければ呼び出すことができない。

```php5:Role.php
<?php
namespace App
use Illuminate\Database\Eloquent\Model;

class Role extends Model {
    public function users() {
         return $this->belongsToMany('App\Role', 'role_user')->using('App\RoleUser');
    }
}
```
```php5:ActionController.php

$roles = Role::find(1)->users;
foreach ($users as $user) {
    debug($user->pivot->flag); //null
}

```

以下のようにすれば呼び出せる。

```php5:Role.php
<?php
namespace App
use Illuminate\Database\Eloquent\Model;

class Role extends Model {
    public function users() {
         return $this->belongsToMany('App\Role', 'role_user')->using('App\RoleUser')->withPivot("flag");
    }
}
```
```php5:ActionController.php

$roles = Role::find(1)->users;
foreach ($users as $user) {
    debug($user->pivot->flag); //1
}

```

しかしこのように指定した場合、べつにPivotモデルを指定していなくても値は同様に呼び出すことができる。

```php5:Role.php
<?php
namespace App
use Illuminate\Database\Eloquent\Model;

class Role extends Model {
    public function users() {
         return $this->belongsToMany('App\Role', 'role_user')->withPivot("flag");
    }
}
```
```php5:ActionController.php

$roles = Role::find(1)->users;
foreach ($users as $user) {
    debug($user->pivot->flag); //1
}

```

## 結論

結局Pivotテーブルを使う意味はあるのだろうか？
おそらく複雑な更新などを行いたいときに、モデル内に関数を増やしたい……などの時に使うことができるのかもしれないが、多対多構成用の更新メソッドも簡単なのはLaravel標準でついているため、そうとう複雑ではない限りは使うことはないように思う。（個人の感想です）
少なくとも「同じテーブル名を複数箇所で宣言したくない」という程度の用途には向かないことが判明したため、涙を呑んでモデルを削除することにする。
PyTorch公式チュートリアル Deep Learning with PyTorch #2 Autograd

# Autograd: automatic Differentiation (自動微分)
PyTorchにおける全てニューラルネットの中心は`autograd`パーケージであり、まず簡単にこれについて説明した後、一番最初のニューラルネットワークの学習を行う。

### 自動微分とは
自動微分とは元関数から数式処理（高校数学、大学数学でやったような微分演算）で導関数を導出する**数式微分**、近似的に数値計算により微分係数を導出する**数値微分**と異なり、**連鎖律**を用いて微分を導出する方法。
$f, g$を微分可能な関数とし、$f$が$g$の関数、$g$が$x$の関数となっている時、$f$の$x$についての微分は以下のように計算できる。
$$\frac{df}{dx} = \frac{df}{dg}\frac{dg}{dx}$$

## Variable
`autograd.Variable`はこの`autograd`パッケージの中心となるクラスであり、`Tensor`クラスをラップしているので、`Tensor`クラスのほぼ全ての演算を実行できる。全ての計算を実行したのち、`backward()`を呼ぶことにより、全ての勾配を自動的に計算することが可能。生のtensorを`.data`でアクセス可能であり、この変数は`Variable`クラスの`.grad`に蓄積される。
(tensorflowと比べるととてもデバッグしやすいですね！)

### Function
自動微分の実相においてもう一つとても重要なクラスが`Function`である。
`Variable`と`Function`は内部で接続され、有向非循環グラフ上で構築される。ユーザーが作成した場合を除き、全てのvariableは`.grad_fn`というアトリビュートをもち、その変数を作成した`Function`を参照できる。

微分を計算したい場合には、`Variable`に対して`.backward()`を計算すればよい。`Variable`がスカラーの場合、`.backward()`に引数を渡す必要はないが、それ以外の場合は`gradient`という引数を明示的に渡す必要がある。この`gradient`はサイズが一致している必要がある。

#### grad_fn
実際に`grad_fn`で変数からそれを生成した演算の参照が可能か確かめてみる。

```python
import torch
from torch.autograd import Variable #autgradパッケージからVariableクラスを参照する
x = Variable(torch.ones(2,2), requires_grad=True)
# 要素が全て1の2x2行列が生成される
y = x + 2 
# 要素が全て1+2=3となる2x2行列が生成される
print(y.grad_fn)


# <torch.autograd.function.AddConstantBackward object at 0x7f1faab77138>
```
つるのおんがえし「決して、この部屋をのぞかないで」〜LinuxのPermission deniedについて真剣に考える〜

![download-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/74851/f295d04f-aebf-9b80-7144-5833502cc71b.jpeg)


# この記事のゴール

この記事を読めば、

```bash
$ ls hoge
d rwx-----x. 1 owner  group 4096 Dec 22 15:48 hoge
```
この

```bash
rwx-----x
```
が読めるようになる（ハズ）です。


# あらすじ

おじいさんが罠にかかっているつるを見つけました。

苦しんでいるつるがかわいそうだったので、おじいさんは助けてやりました。

その日の夜は大雪になり、とても寒い夜でした。

コン、コン。家の扉が叩かれる音がします。

夜、一人のおんながおじいさんの家にやってきました。

そのおんなは一晩泊めてほしいといいます。

やさしいおじいさんはおんなを家に招き入れることにしました。


# 家に招き入れた

おじいさんは手元の端末でおんなをlinux userに追加しました。

```bash
[root@ie ~]# useradd tsuru
```

# おんながはたを織り始めた

おんなはいろいろ良くしてもらったお礼に、

はた（美しい布）をおりたいといいました。

おんな「はたをおりあげるまで、決してのぞかないでください」

```bash
[tsuru@ie ~]$ cd tsuru
```
といって、おんなはへやにはいっていきました。


# おじいさんは好奇心に耐えられなかった

おじいさんは震える手で端末にこう打ち込みました。

```bash
[jiisan@ie ~]$ cd tsuru
```

しかし、

```
-zsh: cd: tsuru/: Permission denied 
```

部屋には入れませんでした。

```bash
[jiisan@ie ~]$ ls tsuru
drwx------. 2 tsuru   tsuru  4096  3月 27 07:26 2018 tsuru
```

おじいさん「なるほど。。。こりゃ入れんわい」

おじいさんは納得しました。


# なぜ、入れなかったのか

まず、おじいさんがuseraddしたことにより、

tsuruディレクトリが作成されました。

![Untitled(3) (3).png](https://qiita-image-store.s3.amazonaws.com/0/74851/5e3fa417-1dc2-edc6-3f33-c3841fabf517.png)


useraddしたときにできるこの部屋の所有者は「tsuru」になります。

ですので、こうなります。

![Untitled(3) (4).png](https://qiita-image-store.s3.amazonaws.com/0/74851/9fcebe98-6479-2915-25e5-25314282e14d.png)


この部屋は、作成された時から以下の要件をみたしています。

・つる[owner]は部屋を自由にする（見れる、いじれる、入れる）ことができる

・おじいさんとおばあさん[other]は入れない

つまり、こういうことですね。

![Untitled(3) (5).png](https://qiita-image-store.s3.amazonaws.com/0/74851/a5b43783-e71e-f2ea-9f58-92a99758e48f.png)


もうすこしlinux風に書くとこんな感じです。

![Untitled(3) (7).png](https://qiita-image-store.s3.amazonaws.com/0/74851/cf5f1640-3341-571e-ebb2-a1262e0a809c.png)

※ ディレクトリに対してexecuteは「入れる」ことを表す
※※ ファイルの場合は「実行できる」ことを表す

さらに、linuxのファイルは「所有者」だけでなく「所有グループ」をという情報を持っています。

![Untitled(3) (11).png](https://qiita-image-store.s3.amazonaws.com/0/74851/5bae1f2b-2db6-8f6f-7c40-5a4595997d22.png)


これにより、

「つるの親族」というグループのユーザだけ部屋に入ることを許可できたりします。

useraddしたときにできる部屋の所有グループは、「tsuru」です。

![Untitled(3) (12).png](https://qiita-image-store.s3.amazonaws.com/0/74851/f1e1769b-ef1a-e57b-4808-db21eb1e5a26.png)

これで完成です。

ちょっと見方を変えて、、、

![Untitled(2) (5).png](https://qiita-image-store.s3.amazonaws.com/0/74851/bd0891f4-2182-5373-7bac-34fad49464cc.png)

ここでlsです！

![Untitled(2) (6).png](https://qiita-image-store.s3.amazonaws.com/0/74851/cdc10e74-e4c6-eb08-1edc-47fdcef8bb24.png)


「owner」ができること

「group」ができること

「other」ができること

をまとめたものを、パーミッションと言います。



# おじいさんは強硬手段に出た

中でなにをやっているのか、気になって仕方がありません。

じいさんの秘蔵のこれくしょんが、

つるによって紐解かれていしまっているかも知れません。

３日悩んでおじいさんは決心しました。

「パーミッションを変えよう」

 （つづく）

# 続きを書きました

[【つづき】つるのおんがえしで学ぶLinuxコマンド「決して、この部屋をのぞかないで」〜chmodとchown〜 ](https://qiita.com/carotene555/items/8058d6c2f1b82fe1c90f)
Element UI paginationの現在ページを強制的に変更させたい

Element UI Pagination
https://element.eleme.io/#/en-US/component/pagination

<img width="285" alt="スクリーンショット 2018-04-03 13.03.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/206385/058b730a-5895-741d-1668-ae8742f1a5f4.png">

## やりたいこと
el-paginationの現在ページ（画面上でfocusされているページ番号）を明示的に指定したい。

## ハマったポイント
現在ページを指定しているはずのcurrent-page.syncの変数を変更しても見た目上はページ移動しているように見えてしまう。

例えば、常に1ページ目を表示させたいのに、2とか3とかクリックするとそのページ番号がfocusされてしまいます。

## 原因
current-pageを変更しても次のDOM書き換えが起こるまで反映されない。

## 解決策
直接DOMで保持している変数を変更してやる。

$refsでel-paginationを指定して見るとinternalCurrentChangeというプロパティが存在し、これが画面上でfocusされているページ番号のようです。

```
<el-pagination
  ref="pagination"
  small
  layout="prev, pager, next"
  :total="50"
  :current-page.sync="currentPage">
</el-pagination>
```
```
var Main = {
  data () {
    return {
      currentPage: 1,
      internalPage: null
    }
  },
  mounted () {
    this.internalPage = this.$refs.pagination
  },
  watch: {
    currentPage () {
      /* ここでinternalCurrentPageを変更するとcurrent-pageも見た目も変更される */
      this.internalPage.internalCurrentPage = this.currentPage
    }
  }
}
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')
```

Demo
current-pageが常に1ページの時にinternalCurrentPage変更しない場合とする場合の動きを載せてあります。
https://jsfiddle.net/hsna/fwbmz1vm/
英単語略語と、単語の調べ方とか

## 略語
|省略単語|元英文|意味|
|---|---|---|
|ASAP|as soon as possible|出来るだけ早く|
|BTW|by the way | ところで|
|FYI|for your information|参考までに|
|Re:|regarding ～ |～の件|
|TBD|to be determined|後日決定|
|w/o| without| ～なしで|
|EDT|Eastern Daylight Time|東部夏時間|
|EST|Eastern Standard Time|東部標準時間|
|PDT|Pacific Daylight Time|太平洋夏時間|
|PST|Pacific Standard Time|太平洋標準時間|

## Urban Dictionary
https://www.urbandictionary.com/
英語圏の最新単語とか情報早い。

## googleで単語を調べる
① ダブルクオートで囲う。例）　"aaa bbb ccc" 
② ワイルドカードで幅を広げる。　例）"aaa * ccc"
③ AND で条件を加える。 例）aaa AND bbb
④ OR 条件でどちらか一方。　例） aaa OR bbb
⑤ マイナス記号をつけて、言葉の除外をする。　例）"aaa bbb ccc" -ddd
⑥ ファイル形式を限定する。　例）apple filetype:pdf
⑦ URLに含まれる文字列　例）Inurl:aaaa
⑧ 類似サイト　例） related:aaaa
⑨ 作者検索　例）Inpostauthor:和田卓人
git (checkout | branch | status)の代わりに git (co | br | st)を使って開発速度を2倍にしよう

株式会社Udzukiの@tsukakeiです．
普段はテスト自動化やWebアプリの開発を行っております．

# TL;DR
gitコマンドのエイリアスを設定して，
` $ git (checkout | branch | status)`
の代わりに 
` $ git (co | br | st)` 
を使いましょう！

# やり方
`~/.gitconfig` に以下の内容を書き込むだけ！

```
[alias]
  co = checkout
  br = branch
  st = status
```

たったこれだけでタイピング文字が ***40-50%*** 削減できます！！

|command|beforeの文字数|afterの文字数|
|---|---|---|
|checkout|12文字(git checkout)|6文字(git co)|
|branch|10文字(git branch)|6文字(git br)|
|status|10文字(git status)|6文字(git st)|

この記事を見たら今すぐにでもエイリアスの設定をしましょう！！

## 参考
[gitで便利なエイリアス達
](https://qiita.com/peccul/items/90dd469e2f72babbc106)
EXEファイルから日本語文字列を抽出する例

## はじめに

- macOS 上で行いたい
- OS 附属の strings は日本語に対応していない
- istrings や jstrings といった派生ツールがあるようだけど導入が大変そう(brew で見つからない)
- スクリプト言語だと融通が効く

ということで Ruby を使います。

## コード

```ruby
require "pathname"
require "kconv"
require "natto"

mecab = Natto::MeCab.new("-F%f[0]")
bin = Pathname("binary.exe").read.toutf8.scrub
bin.scan(/[\p{Han}\p{Hiragana}]{2,}/) do |e|
  parts = mecab.enum_parse(e).to_a[0..-2]
  if parts.size == e.size
    next
  end
  puts e
end
```

## 要点

1. kconv の toutf8 を使ったのはエラーになりにくいため
2. scrub で不正なコードを除去する(簡単に書けるの便利)
3. 漢字 または ひらがな が含まれる2文字以上の言葉が対象
4. 意味不明な漢字の羅列は MeCab に通したとき1文字ずつに分断される傾向があるので、分断された数と文字数が等しい場合は意味不明な文字列と見なしてスキップする
5. ここでは行なってないですが parts 配列の要素にある feature メソッドは "名詞" などの種類を返すので、それをうまく利用してフィルタしてもいい

## 実行結果

```
閙酣
鑵酣
鐫酣閧
(snip)
韶貲
鞨貲
靨貲頸
が間違っています
を選択して下さい
まだまだこれからですね
困ったなあ
負けたか
こんなはずじゃ
本当は負けず嫌いなんですよっ
の書き込みに失敗しました
```

それでも意味不明な漢字の羅列が大量に出てきてしまいますが、あらかじめわかっている言葉で検索すると日本語の塊にたどりつきやすいです。
object sort

### sorterにparamを使った比較式が必要。
```js
fn.oSort=(o,sorter)=>{return Object.keys(o).map(d=>o[d]).sort(sorter)}
```
```js
//smaller
let a=fn.oSort(obj,(a,b)=>{return a.num-b.num})
```
### 配列化するときにobject名は失われてしまう。paramに入れるなど考慮が必要。
```js
let fn={}
fn.oSort=(o,sorter)=>{return Object.keys(o).map(d=>o[d]).sort(sorter)}

let obj={
 'xxxx':{num:'1',data:'1xxx top' }
 ,'yyyy':{num:'4',data:'4xxx' }
 ,'zzzz':{num:'5',data:'5xxx' }
 ,'gggg':{num:'1',data:'1xxx middle' }
 ,'ppp':{num:'3',data:'3xxx' }
 ,'qqqq':{num:'1',data:'1xxx end' }
 ,'xxrega':{num:'0',data:'0xxx' }
}

let a=fn.oSort(obj,(a,b)=>{return a.num-b.num})
console.log(a);
/*
0:{num: "0", data: "0xxx"}
1:{num: "1", data: "1xxx top"}
2:{num: "1", data: "1xxx middle"}
3:{num: "1", data: "1xxx end"}
4:{num: "3", data: "3xxx"}
5:{num: "4", data: "4xxx"}
6:{num: "5", data: "5xxx"}
*/
```
DatadogでFargateをモニタリング

DatadogでFargateのモニタリングができるようになりました。

これまで、Fargateにdatadogのエージェント入れようとしても、ホストがマウントできないので、どうやってやるんだ？って感じでしたが、先日発表されたFargateの1.1でタスクメタデータのエンドポイントがサポートされたおかげでちゃんとできるようになったようです。
https://aws.amazon.com/jp/about-aws/whats-new/2018/03/aws-fargate-platform-version-1-1/

やりかたなどはこちらに。

https://www.datadoghq.com/blog/monitor-aws-fargate/

ここではTaskDininition書いてrun-taskする方法で書かれてますが、ecs-cliでサービスとして起動させてみました。
とりあえずいつもテストで使ってるWordpressのやつで。

```yaml:docker-compose.yml
version: '2'
services:
  wordpress:
    image: wordpress
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: 127.0.0.1
      WORDPRESS_DB_PASSWORD: password
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
  datadog:
    image: datadog/agent:latest
    environment:
      DD_API_KEY: {$DD_API_KEY}
      ECS_FARGATE: "true"
```
基本的にはタスク定義の中でDatadogエージェントをサイドカーで動かして、`ECS_FARGATE: true` だけで動くみたいです。 簡単です。

これを起動させると、

```bash
$ ecs-cli compose service up --launch-type FARGATE
```

<img width="1542" alt="スクリーンショット 2018-04-03 11.34.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/3246/ef535043-357f-e589-f8bd-e70c88bb67a9.png">

こんな感じでとれました。

↑のサイトではRedisのコンテナを動かして、`dockerLabels`のオプションをつけて、AutodiscoveryによるRedisのモニタリングをしています。
AutoDiscoveryは対応しているソフトウェアならちょこっと追加するだけで、ステータスがとれるみたいですね。
https://docs.datadoghq.com/agent/autodiscovery/
ecs-cliでは今のところ `dockerLabels` は対応していないっぽいので、この機能使うのであれば、TaskDininitionからつくる必要があると思います。

Fargateの懸念点が一つ改善されました。
【InstantApps】Feature moduleでprotobufが参照出来ない

InstantApps対応をするにはmulti module化は必須である。
実は[protobufのplugin](https://github.com/google/protobuf-gradle-plugin)も最近InstantAppsに対応したばっかりなので、まだまだハマリポイントは多い。

1moduleなら問題はないのだが、複数のfeature moduleでprotobufを使うと
generatedのdirectoryが解決出来なくなってしまうので、gradle側でdirectoryを追加してあげる必要がある。
しかし面倒なことにgeneratedのdirectoryは、flavorとbuild typeによってpathが異なる。
1つのflavorでもdebug buildとrelease buildがあるだろうから対応は必須となる。

普通なら以下のようにapplicationVariantsを使って指定したいが

```groovy
applicationVariants.all { variant ->

}
```
このコードはfeature moduleからは使えない。

そこで、各flavorとbuild type一覧を取得して指定してみる

```groovy

sourceSets {
    def buildTypes = android.buildTypes.collect { type -> type.name }
    def productFlavors = android.productFlavors.collect { flavor -> flavor.name }

    productFlavors.each { productFlavorName ->
        buildTypes.each { buildTypeName ->
            // Create variant and target names
            def targetName = "${productFlavorName}${buildTypeName.capitalize()}"
            main.java.srcDirs += "build/generated/source/proto/${targetName}/grpc"
            main.java.srcDirs += "build/generated/source/proto/${targetName}/javalite"
        }
    }
}
```

しかし、これも動作はしない。
なぜなら、srcDirに他のbuildで作成したファイルも参照してしまうので、同じクラスが重複してしまう。
毎回cleanすれば良いのだが、そんな面倒な事をしたくはない…

ということで、泥臭くtaskから現在のflavorとbuild typeを取得してやることにした。
以下のメソッドを作成

```groovy

/**
 * @return flavor + build type
 * e.g. prdRelease, devDebug
 */
def getCurrentTaskName() {
    String taskName = getGradle().getStartParameter().getTaskRequests().toString()
    Pattern pattern
    if (taskName.contains("assemble")) {
        pattern = Pattern.compile("assemble(\\w+)")
    } else if(taskName.contains("sideLoad")) {
        pattern = Pattern.compile("sideLoad(\\w+)InstantApp")
    } else if(taskName.contains("install")) {
        pattern = Pattern.compile("install(\\w+)")
    } else {
        pattern = Pattern.compile("generate(\\w+)")
    }

    Matcher matcher = pattern.matcher(taskName)
    if (matcher.find()) {
        return matcher.group(1).uncapitalize()
    } else {
        return "" // Not found
    }
}
```

gradleのtaskから正規表現でflavorとbuild typeを取ってきている。
`sideLoad(\\w+)InstantApp`というtaskは普段は見慣れないとは思うが、
InstantAppsのinstallを行ってくれるtaskである。

例えば、flavorが`Dev`環境でbuild typeが`Debug`の時の
Installedのアプリのtask名は `assembleDevDebug`である。
InstantAppsのtask名は `sideLoadDevDebugInstantApps`になる。
正規表現で取得した文字列は、そのままだと`DevDebug`のようになってしまうので、`uncapitalized()`で先頭を小文字にしている。
あとはsource setsにdirectoryを指定してあげれば良い

```groovy

sourceSets {
        def targetName = getCurrentTaskName()
        main.java.srcDirs += "build/generated/source/proto/${targetName}/grpc"
        main.java.srcDirs += "build/generated/source/proto/${targetName}/javalite"
}
```
Mini vMacをソースからビルド

MacBook Air 11inch用に少し横長の画面のMacIIがほしかったのでソースからビルド

## Xcodeでビルド

-  [ソースをダウンドード](http://www.gryphel.com/d/minivmac/minivmac-3.5.8/minivmac-3.5.8.src.zip)してunzip
-  `minivmac-3.5.8.src.dsk`をvMacにドラッグ
- `MnvM_b35`を実行
- 現れる編集ウィンドウに今回の設定を入力

```
-t mc64      { Macintosh OS X - x86-64 }
-m II        { Macintosh II }
-hres 640    { 水平解像度: 32の倍数 }
-vres 384    { 垂直解像度: 32の倍数 }
-depth 3     { 8 bit color }
-magnify 1   { スタート時に拡大表示 }
-sound 1     { サウンド機能オン }
-sony-sum 1  { Disk Copy 4.2形式のサポート }
-sony-tag 1  { Disk Copy 4.2形式のサポート }
-as 0        { AutoSlow機能オフ。MacIIの場合のデフォルトらしい }
-em-cpu 2    { 68020をエミュレート }
-mem 8M      { 搭載メモリ: 8MB }
-n "minivmac-3.5.8-II-640x384" { カスタム版のラベル名 }
-an vmac6438 { 最大8文字で、xcodeのプロジェクト名になる }
-e xcd       { 開発環境: Apple Xcode and Project Builder }
-ev 8210     { 開発環境バージョン: Apple Xcode 8.2.1 (マニュアル掲載の最新版) }
-cpu x64     { ビルド環境のCPU: Intel 64 bit }
-api cco     { ビルド環境のAPI: Cocoa for Macintosh OS X }
```

- `File`メニューから`Go`を選択して、XCode用のソースをダウンロード
- `tar xf minivmac-3.5.8-II-640x384.tar && cd minivmac-3.5.8-II-640x384`
- `open vmac6438.xcodeproj`
- 案内される自動変換を行い、`Run`すると以下のエラーが発生した

```
-fobjc-weak is not supported on the current deployment target
```

- `TARGET->vmac6438->BuildSetting->Apple LLVM 9.0 - Language - Objective C`で以下のオプションをクリア

```
Weak References in Manual Retain Release
```
- 再度、`Run` で警告はいっぱい出たが、とりあえず動く`Mini vMac`が作成された

## コマンドラインでビルド

こちらの方が簡単で早い。

- 設定値に`-cl`を追加するとコマンドラインでコンパイル可能なソースが作成される
- Makefile中の2箇所のSDKの指定パス `/Developer/SDKs/MacOSX10.6.sdk`を `/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk`に変更
- `make` で`Mini vMac`が作成された
【Javascript】HSL⇔HSY色空間変換クラス

#概要
この記事は、Javascriptを用いたHSL⇔HSY色空間の変換式を紹介しています。導入式の理論や説明は[こちら](https://qiita.com/lookman/items/d518f16c897c94bc4e78)からご覧ください。また、[前回](https://qiita.com/lookman/items/2b9169f79a7402beff6d)のRGB⇔HSL色空間変換クラスを前提として実装しておりますので、そちらもご参照ください。

#コード
```HSYColorSpace.js
class HSYColorSpace extends HSLColorSpace {
	constructor(r, g, b) {
		super(r, g, b);
		this.isHoldY = false; // public
	}
	initialize() {// @Override
		this._y = new Range(0);// contrast
		super.initialize();
	}
	static get _pr() {
		return 0.298912;
	}
	static get _pg() {
		return 0.586611;
	}
	static get _pb() {
		return 0.114478;
	}
	get y() {
		return this._y.get();
	}
	set y(newValue) {
		this._y.set(newValue);
		this.transformLuminosityFromContrast();
		this.inverseTransformation();
	}
	get l() {// setterとgetterはセットでOverrideしなければならない
		return super.l;
	}
	set l(newValue) {// @Override
		this._l.set(newValue);
		this.transformContrastFromLuminosity();
		super.inverseTransformation();
	}
	transformation() {// @Override
		super.transformation();
		this.transformContrastFromLuminosity();
	}
	inverseTransformation() {// @Override
		if(this.isHoldY)
			this.transformLuminosityFromContrast();
		else
			this.transformContrastFromLuminosity();
		
		super.inverseTransformation();
	}
	transformContrastFromLuminosity() {
		let c = this._coef;
		let l = this._l.get();
		
		if(this._l.isOver(0.5))
			this._y.set(l * (1 + c) - c);
		else
			this._y.set(l * (1 - c));
	}
	transformLuminosityFromContrast() {
		let c = this._coef;
		let y = this._y.get();
		
		if(this._y.isOver((1 - c) / 2))
			this._l.set((y + c) / (1 + c));
		else
			this._l.set(y / (1 - c));
	}
	get _pure() { // PureColorContrast: 純色(s = 1.0, l = 0.5)のコントラストy
		const self = HSYColorSpace;
		const pr = self._pr, pg = self._pg, pb = self._pb;
		const pmax = [pr,pg,pg,pb,pb,pr];
		const pmid = [pg,pr,pb,pg,pr,pb];
		//const pmin = [pb,pb,pr,pr,pg,pg];
		let i = this._h.interval;
		return pmax[i] + this._h.different * pmid[i];
	}
	get _coef() { // 計算を簡単に表記するための定数
		return this.s * (1 - 2 * this._pure); // S * 2 * (0.5 - pure)
	}
	static calc(r, g, b) {
		const self = HSYColorSpace;
		const pr = self._pr, pg = self._pg, pb = self._pb;
		return pr * r + pg * g + pb * b;
	}
}
```

コメントにも書いてありますが、プロパティ（getterとsetter）をOverrideする場合は、両方をOverrideする必要があります。片方、例えばsetterだけOverrideすると、getterは使用できなくなります。結果、getterの戻り値はundefinedとなります。