OmniAICreator/Qiita-1.07M huggingface dataset:
口数を考慮して抽選する

##複数口応募できます！なキャンペーンをやったら、思いの外抽選で苦戦したので備忘録
検索の仕方が悪いのかもしれませんが、意外と簡単にやる方法が出てこなかったので書きます。
結論としてはnumpyのrandomchoiceでいけました。

###まず抽選対象のリストを作ります。
```python:
import numpy as np
lottery=[[i,np.random.randint(1,20)] for i in range(20)]
print(lottery)
```
```python:出力
[[0, 13], [1, 3], [2, 15], [3, 3], [4, 7], [5, 2], [6, 2], [7, 9], [8, 11], [9, 16],
 [10, 17], [11, 10], [12, 13], [13, 18], [14, 18], [15, 3], [16, 4], [17, 2], [18, 12], [19, 9]]
```
通常は会員番号と口数の組み合わせが人数分揃っているはずです。
ここでは会員番号の代わりに連番をふり、口数はランダムで出力しました。

###抽選するためにデータを整形します。
```python:
lottery2=np.array(lottery).transpose()]
print(lottery2)
```
```python:出力
[[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
 [13,  3, 15,  3,  7,  2,  2,  9, 11, 16, 17, 10, 13, 18, 18,  3,  4,  2, 12,  9]]
```
とりあえずリストを反転させたいので、np.arrayを使って軸を入れ替えます。


###重みの作成
抽選の際は口数を重みとして読み込ませる必要があります。
重みの合計が1にならなければ行けないという制約があるようなので、

```python
weight=np.dot(lottery2[1],1/np.sum(lottery2[1]))
print(weight)
```
```python:出力
[ 0.06951872  0.01604278  0.0802139   0.01604278  0.03743316  0.01069519
  0.01069519  0.04812834  0.05882353  0.0855615   0.09090909  0.05347594
  0.06951872  0.09625668  0.09625668  0.01604278  0.02139037  0.01069519
  0.06417112  0.04812834]
```

###抽選する
準備ができたので早速抽選してみます。
今回は20人の中から3名抽選します。

```python:
winner=np.random.choice(lottery2[0],3,replace=False, p=weight)
print(winner)
```
```python:出力
[13  7 19]
```
無事3名が抽出されました。
ちなみに複数当選可にする場合はreplaceをTrueにします。

###抽選結果を固定する
random choice なので実行するたびに結果が変わります。
ただ、公正性を確保するために抽選プロセスを再現可能な状態にします。

```python:
np.random.seed(20)
winner=np.random.choice(lottery2[0],3,replace=False, p=weight)
print(winner)
```
方法はシンプルでrandom choiceする前にrandom.seedを挿入するだけです。
random.seedの引数に任意の数字を入れてやると、同じデータを読み込んでいる限り、何回やり直しても同じ数字が出力されます。（私はデータ数が20なので20みたいに決めました。）

###検証
ちゃんと重み通りに抽選されているか10,000回抽選してみて確認します。

```python:
counter=np.zeros(20)
for i in range(10000):
    winner=np.random.choice(lottery2[0],3,replace=False, p=weight)
    for i in winner:
        counter[i]+=1
p=counter/30000
print(p)
```
```python:出力
[ 0.07096667  0.0172      0.07656667  0.0171      0.03916667  0.01163333
  0.01126667  0.04936667  0.05983333  0.08226667  0.08793333  0.0536
  0.06886667  0.095       0.09276667  0.01783333  0.0224      0.01273333
  0.0631      0.0504    ]
```
```python:設定した重み
[ 0.06951872  0.01604278  0.0802139   0.01604278  0.03743316  0.01069519
  0.01069519  0.04812834  0.05882353  0.0855615   0.09090909  0.05347594
  0.06951872  0.09625668  0.09625668  0.01604278  0.02139037  0.01069519
  0.06417112  0.04812834]
```

ちゃんと重み通り抽選されているのが確認できました。
Laravel で Cannot allocate memory がでたときの対策

VPS で、Laravel の次の操作を行うとエラーが出ました。

```bash
composer require league/flysystem-aws-s3-v3
```

エラーメッセージ

```text
The following exception is caused by a lack of memory or swap, or not having swa
p configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-fai
led-errors for details

                                                     
  [ErrorException]                                   
  proc_open(): fork failed - Cannot allocate memory
```

次のページに対策があります。
[proc_open(): fork failed errors](https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors)

1) Swap を確認

```text
$ free -m
              total        used        free      shared  buff/cache   available
Mem:            983         159         705           3         119         691
Swap:             0           0           0
```

2) Swap を作成

```text
$ sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 13.3311 s, 80.5 MB/s
```

```text
$ sudo /sbin/mkswap /var/swap.1
mkswap: /var/swap.1: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=7e8e5b8d-436b-49e0-a9e0-7998b24f8679
```

```text
$ sudo /sbin/swapon /var/swap.1
swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.
```

3) Swap を確認

```text
$ free -m
              total        used        free      shared  buff/cache   available
Mem:            983         159          67           3         757         672
Swap:          1023           0        1023
```
GradleをProxy環境で利用する


共通的に使うので、以下の場所にファイルを作成します。

C:\Users\<ユーザー名>\.gradle\gradle.properties

```text
systemProp.http.proxyHost=<プロキシサーバ名>
systemProp.http.proxyPort=<ポート>
systemProp.https.proxyHost=<プロキシサーバ名>
systemProp.https.proxyPort=<ポート>
systemProp.http.nonProxyHosts=<プロキシサーバをつかわないアドレス等。カンマ区切り>
```
GoogleAPI SDK ServiceAccount認証コード（Ruby or Node.js）

Google (GSuite) の API を使ってゴニョゴニョするとき、認証が必要になります。今回は Service Account を使ってユーザに依存しない方法で認証をするやり方をメモしておきます。すごく彷徨ったので、未来の自分のために。

Service Account と認証に使う JSON ファイルの作成方法は、巷にあふれているので参照してください。

- https://cloud.google.com/iam/docs/service-accounts

## Ruby

```ruby
require 'google/apis/admin_directory_v1'
require 'googleauth'

# Service Account 作成時に作った認証 JSON ファイル
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = './client_secrets_sample.json'

scope = [
  'https://www.googleapis.com/auth/admin.directory.user'
]

authorization = Google::Auth.get_application_default(scope)
# sub に組織に所属するだれかのメールアドレスを指定する必要がある
authorization.sub = 'user@example.com'

service = Google::Apis::AdminDirectoryV1::DirectoryService.new
service.authorization = authorization

# あとは利用したいリソースを実行すれば OK
```

## Node.js

```typescript
import * as googleapis from 'googleapis'

const scope = [
  'https://www.googleapis.com/auth/calendar',
]

const jwtClient = new googleapis.google.auth.JWT(
  null,
  './client_secrets_sample.json',
  null,
  scope,
  'user@example.com', // Ruby と同様に sub 指定をする必要がある
)

jwtClient.authorize()

const calendar = googleapis.google.calendar('v3')

calendar.calendarList.list({
  auth: jwtClient, // 実行時に都度渡す
}).then((res: any) => {
  console.log(res.data.items)
})
```

Node.js のほうでは application_default を使った認証がうまく行かなかったので普通に JWT で認証させています。
【Ruby】特異メソッド・特異クラスを理解する

#概要
Rubyの特異メソッドについてまとめました。

#特異メソッドとは？
特異メソッドとは**１つのインスタンス固有のメソッド**のことを指します。
特定のインスタンスに特別な性質を持たせたい場面に活躍します。
特異メソッドは`def オブジェクト名.メソッド名`で定義できます。

#実例
以下のコードにおいて`Movie`クラスから作成された２つのインスタンス`obj1`,`obj2`の両方がクラス内のインスタンスメソッド`i_method`を実行可能です。
しかし、`obj1.s_method`の形で定義された`s_method`は`obj1`のみでしか実行できません。
これは`s_method`は`obj1`のみが持つ**特異メソッド**として定義されているからです。

```ruby
class Movie
  def i_method
    p 'instance method'
  end
end

obj1 = Movie.new
obj2 = Movie.new

def obj1.s_method
  p 'singlton method'
end

obj1.i_method #=> 'instance method'
obj2.i_method #=> 'instance method'
obj1.s_method #=> 'singlton method'
obj2.s_method #=>  undefined method `s_method' for #<Movie:0x00007fc2fc842c38> (NoMethodError)

```
特異メソッドとは何か、どのように定義するか理解しました。
そこで終わらず、**特異メソッドはどんな仕組みで実現されているのか**まで理解します。

#特異メソッドの正体

上記のように`def オブジェクト名.メソッド名`でメソッドを定義するとRubyインタプリンタは**特異クラス**（特定のオブジェクト固有のクラス）と呼ばれるクラスを作成して継承チェーンに組み込みます。
ですので、実態としてはこの**特異クラス**に定義されているメソッドが特異メソッドであり、それ故に特異クラスに対応した特定のオブジェクト以外はそのメソッドを実行できないということになります。
オブジェクトが持っている特異クラスは`Object#singleton_class`メソッドによって確認する事ができます。

```ruby
class Movie
  def i_method
    p 'instance method'
  end
end

obj1 = Movie.new

def obj1.s_method
  p 'singlton method'
end

p obj1.class.method_defined?(:s_method) #=> false
p obj1.singleton_class.method_defined?(:s_method) #=> true
```
以上の例からも`s_method` は`Movieクラス`には定義されておらず、特異クラス内に定義されている事がわかります。

#注意点
上記で**特定のオブジェクト固有のクラスを作成**すると表記しましたが、特異クラスに対応するインスタンスは、特異クラスが生成された後も生成元をスーパークラスとして指します。
これは特異クラスはあくまでもインタプリタの内部で使用するクラスであり、__ユーザーに意識させたくないクラス__であるためです。

```ruby
class Movie
  def i_method
    p 'instance method'
  end
end

obj1 = Movie.new

def obj1.s_method
  p 'singlton method'
end

p obj1.class #=> Movie
#生成元のMovieを返す。
p obj1.instance_of?(Movie) #=> true
#Movieクラスのインスタンスであるか試すとtrueが返る。
SClass = obj1.singleton_class
p obj1.instance_of?(SClass)
#シングルトンクラスのインスタンスであるか試すとfalseが返る。
```
Arduino-esp32 4.2inch_e-Paper_Module

千石通商などでも売っている電子ペーパーモジュールをESP32で動かしました。
![s-IMG_8877.jpg](https://qiita-image-store.s3.amazonaws.com/0/165672/467d17c2-3dcb-b586-43ab-0ef8510e5032.jpeg)

<4.2inch> https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-58US
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165672/e9c221f6-d96c-ecc4-5e69-9dccf4920242.png)

<2.9inch> https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-58WJ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165672/cf73d767-9ba6-e8ed-da7e-8e6e7c4431bd.png)

Arduinoでの、基本的な動かし方は以下のページを参照
https://www.waveshare.com/wiki/4.2inch_e-Paper_Module
https://www.waveshare.com/wiki/2.9inch_e-Paper_Module

ESP32向けの変更についてはこちら
https://garretlab.web.fc2.com/arduino/lab/esp32_epd/index.html

4.2インチは上記のリンクを参考にさせていただき動きました。
2.9インチについては、以下のリンクを参考にしました。

サンプルを動かすと、epd2in9とepdpring　というライブラリを使用することになります。


他のライブラリについては、以下のものを使っている例もありました。
https://github.com/ZinggJM/GxEPD

ピン設定についてはこちらを参考にさせていただきました。
https://qiita.com/nanbuwks/items/14257cf5f9edd192b8ec
[Angular] Angularフレンドリーな管理画面(Admin Dashboard)フレームワーク

Angularでいい感じに使えそうな管理画面フレームワークを探してみました。

2018年6月時点の情報です。

# ngx-admin

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/160d429d-453e-4130-1b2d-00565a8fecf2.png)


* [公式サイト](https://github.com/akveo/ngx-admin)
* [デモ](http://akveo.com/ngx-admin/#/pages/dashboard)
* GitHubスター数: 12,093
* Angularバージョン: 6
* レイアウト: Bootstrap

Angular 6ベースです。
あらかじめ3つのテーマを持っていて、切り替えて使用できます。
UIコンポーネントは同じ作者の[Nebular](https://github.com/akveo/nebular)を使用しています。
レイアウトはBootstrapを使用しています。

よくコンポーネント化されていて、少ない記述量で画面を作れます。その代わり、最初に理解するのが大変かもしれません。


# SB Admin Material version

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/7fc60758-77be-1a16-627c-d6c6311b01df.png)


* [公式サイト](https://github.com/start-javascript/sb-admin-material)
* [デモ](https://rawgit.com/start-javascript/sb-admin-material/master/dist/login)
* GitHubスター数: 11
* Angularバージョン: 6
* レイアウト: Angular Flex-Layout
 
Angular 6ベースです。
[SB Admin](https://github.com/start-angular/SB-Admin-BS4-Angular-6)のAngular Materialバージョンです。
スター数的にはMaterialじゃないほうが人気あるようです。
レイアウトは[Angular Flex-Layout](https://github.com/angular/flex-layout)を使用しています。

あまりコンポーネント化されておらず、記述量が多くなりがちです。その代わり学習コストは低いです。


# Material Dashboard Angular2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/42b8e98c-8a1c-a39b-4055-24021fe4face.png)

* [公式サイト](https://github.com/creativetimofficial/material-dashboard-angular2)
* [デモ](https://demos.creative-tim.com/material-dashboard-angular2/dashboard)
* GitHubスター数: 366
* Angularバージョン: 5
* レイアウト: Bootstrap

Angular 5ベースです。
有料版もあります。
FlutterでVisibility widgetを作る

Mediumの[Managing visibility in Flutter](https://medium.com/flutter-io/managing-visibility-in-flutter-f558588adefe)という記事で、FlutterでVisibilityを制御するためのカスタムWidget、その名も`Visibility`が紹介されてます。

[Githubはこちら](https://gist.github.com/lukef/864ede59ce44eb5a9dc3a3126852f5ed#file-visibility-dart).

このVisibility Widgetを作ってしまえば、色々なところで再利用できて便利ですね。

上記のカスタムVisibility widgetでは子widgetに対して以下4つの可視性を設定できます。

- Visible
	- 普通に見えている状態
- Invisible
	- 見えてはいないけど、領域は確保されている状態
- Offcreen
	- 画面上に領域は無いけれどもWidget自体は生成されていて、サイズ情報などは取得できる状態
- Gone
	- 見えていないし、領域も確保されておらずサイズもない状態

`Offscreen`は、例えばアニメーションの最後に使われるWidgetで、そのタイミングまでは見えないし領域も確保したく無いけれど、**事前にサイズだけは取得したい**という時などに便利だそうです。


ただ**注意点**として、最初の状態で見えないWidgetは、**そもそもWidgetTreeに含めない方が良い**と筆者は言っています。

プラクティスとしては以下の感じです。

```dart
List<Widget> views = [];
if (shouldBeIncluded) {
  views.add(myView);
}
// use views later
```

また、
>Opacity widgets can be super expensive so use Invisible sparingly

とも筆者は言っています。

~~ここの文脈がちょっと私にはよく分からないのですが、単に`Opacity` widgetを使って可視性を制御するよりは、筆者が紹介しているVisibility widgetのInvisibleを使う方が（レンダリングコスト的に）まだマシということでしょうか。~~
~~(Visibility widgetを使ったInvisible時にも、以下のように`IgnorePointer`widgetの子widgetに`Opacity`が使われているので、少し混乱しています。)~~

下記のように、invisibleの場合は`Opacity`ウィジェットを使って不可視にしているのですが、この**`Opacity`はコストがかかるので、invisibileは控えめに使ってね**、と言っています。
(@sankentou さん、ご指摘ありがとうございました。)

```dart
else if (visibility == VisibilityFlag.invisible) {
      return new IgnorePointer(
        ignoring: true,
        child: new Opacity(
          opacity: 0.0,
          child: child,
        ),
      );
    } 
```
Python | random

**random.random( )**
　0.0～1.0までのfloat値を取得

**random.uniform(x,y)**
　x～yまでのfloat値を取得

**random.randint(x,y)**
　x～yまでのint値を取得

**random.choice(param)**
　param内から一つの要素を取得

**random.shuffle(array)**
　array内の要素をシャッフル
Timerコンポーネントで動的にフローを変更する

# はじめに
ASTERIA WARPではTimerコンポーネントを使って、あるフローから別のフローを非同期に実行することができます。
通常は`実行するフロー`プロパティにフローを指定するのですが、条件によって実行するフローを変えたいことがあります。例えば、ユーザーによって変えるとか、時間帯によって変えるとか、接続先によって変えるとか。
そういうときは、マッピングでフロー名自体を`実行するフロー`に渡せば簡単にできてしまいます。

# 環境
* Windows 10
* ASTERIA WARP 1712

# フロー
普通はこんな感じで直接`実行するフロー`を指定します。
![timer_normal.png](https://qiita-image-store.s3.amazonaws.com/0/41603/7ed9a337-d6d7-f2a7-6b63-6c1c714cad3b.png)
動的に指定するにはこんな感じでマッピングすればよいです。もちろんプロパティ式も利用可能
![timer_dynamic.png](https://qiita-image-store.s3.amazonaws.com/0/41603/4002aa8f-afcc-1ec7-50e2-b3209319c390.png)
マッパーの中はこんな感じです。ここでは、フロー変数でフロー名を渡してます。
あるコードを使って呼び出すフローを変える場合は`Table`関数を使うこともできますし、`Embed`関数で条件を組み合わせてフロー名を組み立ててもいいでしょう。
![mapping_dynamic.png](https://qiita-image-store.s3.amazonaws.com/0/41603/dfefa6e4-40b4-11d6-94ff-5a0d4e2b96c5.png)

# 値の引き渡し
ここで、フローを呼び出すときに何かしらのパラメータを渡したいことがありますよね。
フローを直接渡した場合は、パラメータタブに呼び出されるフローの公開フロー変数が見えるようになりますので、ここにマッピングするだけです。しかし、`実行するフロー`を動的に指定した場合、どのフローが呼ばれるかわからないのでこの手は使えません。
そんなときには、入力ストリームを使います。入力ストリーには`ParameterList`というキーバリューを渡すためのストリームがありますのでこれを使えばOKです。
実は、上のマッピングで気づいた人もいるかも知れませんが、ここではその手法を使ってます。
ちなみに、受け側の定義も同じストリーム型にして置かなければなりません。中身はフィールドの定義は異なってても構いません。例えば、呼び出し側ではA,B,Cを渡すんですが、呼び出される側はA,Bだけとか、A,Cだけという定義でもいいです。ただ、混乱を招くので、ストリーム定義を使って共有しておいたほうがいいと思います。

# つまりASTERIA流のDI？
ここではTimerコンポーネントを使いましたが、他に`FlowInvoker`とか`NextFlow`でも同じようにフロー名を動的に変更できます。
`Branch`や`Switch`だと、接続先やバリエーションが増えるたびにメインフローを書き換えないといけませんが、このやり方だと、メインフローのメンテナンスはほぼやらずに、バリエーションを増やすことができるので便利です。
OculusGOでEasyMovieTextureできるサイズ

# 概要

知見というより、実験のメモです。

## 問題
OculusGOでEasyMovieTextureを使った360度ムービーを見ようとしたら失敗しました。
他のAndroidプロジェクトではまず問題なく動いていたのですが、
どうしてもGOでは動かない。
具体的には、動画再生を実行しようとすると動作が止まる。

## 解決

とりあえず今回は動画のビットレートを落とすことで対応できました。
GearVRよりもどうやら許容量が小さいらしく、350MBほどあると再生できないようです。
 **250MBでは再生できる** のを確認しました。

## 情報提供お願いします

とりあえず今回は急ぎで再生しなければならず、
詳しい実験をしたり、考察する時間が取れていないようですが、
「俺はこれくらいのサイズでも動いたぜ！」とか、
「この辺りを直すとうまくいくよー」などの情報があれば、
コメントで提供していただけると助かります。


---

### 2018/06/28 追記
さっそく情報提供いただきました、izmさん、ありがとうございます！！

> 問題が発生している原因は「ビットレート、コーデック、解像度」のどれか
https://twitter.com/izm/status/1012162329981509632

だろうとのこと。
ちなみにアドバイスくださったizmさん、この本に書いたはずーとのことです。
まだ読んでなかった（申し訳ありません）ので、さっそくポチりました。
VRコンテンツ開発ガイド 2017   西川 善司 
https://www.amazon.co.jp/dp/4844366661/ref=cm_sw_r_tw_dp_U_x_HTenBbXC2CN1T



また、より具体的な情報提供もいただきました、脱着さんありがとうございます！！


>自分がやるときは30～80Mbpsの間、H265がエンコードできるならそっち、できないならH264で出す。
A's Video Converterでハードウェアエンコードが自分の中では一番手早い。
解像度の意味のサイズなら4096x2048以上はやったことない。
https://twitter.com/removablesystem/status/1012161453153849345

とのこと。
動画周りは不勉強なので、もっと勉強しないと。。。！
ラズパイ USB挿入でスタートアップ時に起動するプログラムを選択

# 説明
ラズパイをテレビにつないでVLCで音楽を聞いたりギターのエフェクターに使ったりしていたんですが、常にVLCを自動起動していて使わないときはいちいち消してました。
音楽はUSBメモリに入れていて違うデバイスを使うときは使わないので、ラズパイ起動時にUSBメモリが挿入されていた時にVLCを起動するようにしたところ便利でした。

そこでUSBオーディオ変換アダプタを挿入していたらPureDataを実行するようにもしてみました
# 自分の環境
本体
Raspberry Pi Zero W, Windows 10

ソフト
"RASPBIAN STRETCH WITH DESKTOP", Python3, Windows 10

# コード

```python:usb-autostart.py
#!/usr/bin/python3
import time
import os
import sys
import usb

# 右がベンダー 左が製品 どちらも10進数であることに注意！ 変数名は各自で変えてください
checkmic = (3190, 5663)
checkusb = (13624, 2305)

while True:
    # USBのデバイスをリストにするが、二重リストになっているのでフラットにする。
    usblist = [b.devices for b in usb.busses()]
    usblist = [e for ilist in usblist for e in ilist]
    usblist = [(b.idVendor, b.idProduct) for b in usblist]

    if checkmic in usblist:
        # マイクなら
        os.system('pd')
        break

    if checkusb in usblist:
        # USBメモリーなら
        os.system('vlc')
        break

    else:    #何もヒットしなかったら実行しない
        break
```
# 詳細
このコードはUSBデバイスが挿入時にシャットダウンするもので本来はwhileループで常に指定のデバイスがないか確認してました。
起動時に一回だけでいいのでアレンジしました
元のコードはこちらをご覧ください
[Raspberry piに特定のUSB機器を差し込むと電源を落とすデーモンをPythonで作る](https://glorificatio.org/archives/1757)

ちなみにループ内のifのところを増やしたら対応するデバイスを増やせます、削れば減らすこともできます。
これを一度実行してちゃんと動くか確認してからautostartに登録します、
これはこちらをご覧ください
[Raspberry PiでPythonプログラムを自動的に起動させる．(autostart)](http://masa-flyu.hatenablog.com/entry/2017/09/23/160300)

書き方は
@/usr/bin/python3 /home/pi/usb-autostart.py
と書きました(念のためフルパス)

# 注意点
whileループの下のコメントアウトの書いてある通り10進数で書く必要があるので16進数から変換する必要があります、各自で調べてください。
(今はそういったサイトがたくさんあって驚いた)

Pi Zero Wは通信USBポートが一つなのでヒットするデバイスが複数あった場合にはなにが起きるか検証できてません。

import usb と書いたのですがこのモジュールは入っていたか覚えていません、ここでエラーが出てしまったら

pip3 install usb 
と実行してみてください

万が一「動かないよー」ということがあれば環境とやったことを添えてコメントをください、遅くなるかもしれませんが確認してから返信します。

#参考になったサイト
[Raspberry piに特定のUSB機器を差し込むと電源を落とすデーモンをPythonで作る](https://glorificatio.org/archives/1757)
[Raspberry PiでPythonプログラムを自動的に起動させる．(autostart)](http://masa-flyu.hatenablog.com/entry/2017/09/23/160300)
Azure環境にRDP接続しようとすると認証エラー

デモ用として社内部門に貸出しているAzureサーバーにログインしようとしたら下記ような「CredSSP 暗号化オラクルの修復」エラーが...。Windows 10のアップデートによるセキュリティ強化のため、というのは知っていたけど実際にエラが出るのは初めてでした。

<img width="401" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/14768/a2ab43b6-06d6-3b4b-4857-81e70a90387c.png">

さて、通常のサーバーであればWindows Updateをすれば良いのですが、そもそもAzure上の仮想マシンにログインできなくて対応方法に迷ったのでメモしておきます。

# 簡単な解決方法

一番簡単なのは接続元のWindows 10のセキュリティ条件を下げます。

## Windows 10 Proの場合

+ 「gpedit」グループポリシーエディタを起動します。
+ [コンピューターの構成]-> [管理用テンプレート]-> [システム]-> [資格情報の委任]

<img width="616" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/14768/3d79ba88-72e9-baa1-21ec-e34b56d513d1.png">

+ 「有効」にして「脆弱」を選択すればOKです。

<img width="514" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/14768/f4c27735-faad-8d4f-1732-02d58a810c8a.png">

## Homeの場合

+ コマンドラインで以下を入力して完了。

> REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2

# Azureな解決方法

この方法しか無いとおもったらAzureは以下の方法があるようです。自分はやらなかったので参考まで。

+ Azure シリアル コンソールを使用してこの更新プログラムをインストールする方法
+ リモート PowerShell を使用してこの更新プログラムをインストールする方法 

https://support.microsoft.com/ja-jp/help/4295591/credssp-encryption-oracle-remediation-error-when-to-rdp-to-azure-vm

# CredSSPってそもそも何？

CredSSP = Credential Security Support Provider (CredSSP) 
このプロトコルに2018/3に脆弱性に関するアドバイザリーが出ています。この脆弱性対策のために、今回の変更は入ったようです。

CVE-2018-0886 | CredSSP のリモートでコードが実行される脆弱性
https://portal.msrc.microsoft.com/ja-jp/security-guidance/advisory/CVE-2018-0886

# 参考リンク

https://blogs.technet.microsoft.com/askcorejp/2018/05/02/2018-05-rollup-credssp-rdp/
Google Maps API Geocoding Service で緯度経度を取得しその場所を表示する

##やりたいこと
Geocoding Serviceを使って画面から入力された場所へ移動したい

##コード

```sample.html
<div>
	<label><input type="text" id="addressText"></label>
	<button id="search">検索</button>
<div>
```
こんなの↑があったとして表示したい場所を入力し検索ボタンを押下するとします（適当）。

```gmapsample.js
$(document).on('click', '#search', function () {
	const place = $('#addressText').val();
	getLatLng(place);
});

function getLatLng(place) {
	const geocoder = new google.maps.Geocoder();
	geocoder.geocode({
		address: place
	}, function(results, status) {
		//成功
		if (status == google.maps.GeocoderStatus.OK) {
			//同じズーム値のまま
// 			map.panTo(results[0].geometry.location);
// 			map.setCenter(results[0].geometry.location);
			//表示領域を調整
          	map.fitBounds(results[0].geometry.viewport);
		//失敗
		} else {
			alert('Geocode was not successful for the following reason: ' + status);
		}
	});
}
```
画面から入力された値をGeocoderに渡して結果を取得し移動するという流れです。
画面からの入力は「東京」とか「ダイバーシティ」とかどこかの住所とかを想定しています。
移動の箇所ですが、今のズーム値のまま表示したい場合は`map.panTo(results[0].geometry.location);`や`map.setCenter(results[0].geometry.location);`とするといけます。
また、表示領域を調整していい感じに表示したい場合は`map.fitBounds(results[0].geometry.viewport);`とするといけます。

ちなみに、Geocoding Serviceは非同期です:zap:

参考：[Geocoding Service](https://developers.google.com/maps/documentation/javascript/geocoding)
メモ帳とPHPとBOM付き

## 概要
最近、PHPのフレームワーク（CodeIgniterやLaravelなど）を使ってWindows機で開発するケースが増えてきました。
ある環境では正常に動き、ある環境ではsession発行時にエラーなど、謎の現象が突然発生し、困惑していたところ、また優秀な後輩に教えてもらったので、忘れないようにメモを残します。
※半年前くらいに別件で教えてもらっていたのに、完全に飛んでました。。

## 現象
利用しているPHPのファイルのどれか1つにでもBOM付きがいると、ヘッダー、生成した画像、さらにはJSONにBOMが入り込んでしまい、結果、扱えず（生成した画像は画像として認識できない、JSONはajaxでエラーなど）、色々なエラーを誘発していました。

## 原因
Windowsのメモ帳で開いて、そのまま保存するとBOM付きになるんですね。
普段、Macで開発しているので、全然知らなかったです。。
Kotlin: DslMarker

## DSL の書き方

Kotlin で DSL を書く場合のサンプルコードです。

```kotlin
class A {
    var valueA: String? = null
    var b: B? = null
    
    fun b(init: B.() -> Unit): B {
        val b = B()
        b.init()
        this.b = b
        return b
    }
}
    
class B {
    var valueB: String? = null
    var c: C? = null
    
    fun c(init: C.() -> Unit): C {
        val c = C()
        c.init()
        this.c = c
        return c
    }
}
    
class C {
    var valueC: String? = null
}
    
fun a(init: A.() -> Unit): A {
    val a = A()
    a.init()
    return a
}
```

このように書くと、次のように クラスA のオブジェクトを作ることができます。

```kotlin
a {
    valueA = "A"
    b {
        valueB = "B"
        c {
            valueC = "C"
        }
    }
}
```

## @DslMarker

上のサンプルでは、次のようなコードも書けてしまいます。

```kotlin
a {
    valueA = "A"
    b {
        valueB = "B"
        c {
            valueA = "A"
            valueC = "C"
        }
        b {
            valueA = "A"
            valueB = "B"
            b {
                valueB = "B"
            }
        }
    }
}
```

具体的な問題項目は次の通りです。

* B, C を定義するブロックの中で A の属性が代入されている。
* B を定義するブロックの中で、さらに B を定義する関数とそのブロックが記述されている。
    * B は B をプロパティにもたないのに

これを Kotlin 1.1 から導入されているアノテーション `@DslMarker` が解決します。 `@DslMarker` はDSLを作成する際の、スコープを制御するために使えるアノテーションです。 このアノテーションは、アノテーションクラスに付与します。

`@DslMarker` を付けたアノテーションクラス(`DslMarkerTest`)を作成し、 DSLを生成するクラスに付与します。 クラス A, B にアノテーション`DslMarkerTest`を付与します。

```kotlin
@DslMarker
annotation class DslMarkerTest
    
@DslMarkerTest
class A { ... }
    
@DslMarkerTest
class B { ... }
    
class C { ... }
```

こうすると、上のコードがエラーになります。

(この記事は[拙ブログ](http://improve-future.com/kotlin-dsl.html)から抜粋・編集したものです。)
「~」という名前のファイル/フォルダを消す

# やりたいこと

何かの拍子にできてしまった「~」という名前のファイル/フォルダを消したい。  
しかし、

```shell
$ rm -r ~
```

とやるとホームディレクトリ直下を全部破壊してしまう

# 試した環境

dockerのcentos7コンテナ上

```shell
$ docker pull centos:7
$ docker run -it --rm centos:7 bash
```

# 解決方法

```shell
$ rm -r \~
```

もしくは

```shell
$ rm -r ./~
```
DockerComposeを使って手軽に開発環境を構築する＋BindAddressの小話

# はじめに
PHPのSlimというフレームワークを使って開発するにあたり
Dockerで環境を構築した方が自由度が高くていいよねということで、
その実現にあたり残しておきたいことや注意点などをまとめました。
参考になれば幸いです。

# 概要
docker-composeを使って「CentOS7＋PHP＋MariaDB」の環境構築を気軽にできるようにする

# 実行環境

| 項目 | 詳細 |
|:-----|:----|
|機種|MacBook Pro (Retina, 15-inch, Mid 2015)|
|OS|macOS Sierra(10.12.6)|
|Docker|17.12.0-ce|

DockerとDockerComposeインストールの参考：[MacにDocker](https://qiita.com/sakasa/items/d32f2cab50a597b5eb50)

# 構築する環境
### バージョン

| システム | バージョン | Docker Port | Published Port |
|:-----|----:|----:|----:|
|CentOS|7(Latest)|||
|Apache|2.4.6|80|8081|
|SSHD|7.4|22|8022|
|PHPのビルトインwebサーバ||8080（起動時オプションによる）|8082|
|PHP|7.1(yumでのLatest)|||

### ボリューム
Dockerはコンテナを停止するとデータは残らない
そのため、永続させたい場合にはローカルフォルダをマウントしておく必要があります。
また、開発にあたってはサーバにログインしなくても
気軽にエディタを使って編集できるようにという意図もあります。

|Docker Folder|Local Folder|
|:-----|:-----|
|/var/www/html|~/data-html|


# この記事の対象
* dockerで気軽に環境のビルド・リビルドを繰り返したい人
* docker-composeを使ってみたい人

# 実行方法
### 起動
1. cloneまたはZipダウンロードする
`git clone https://github.com/tmasu/docker-compose-centos-php.git`
[GitHub-tmasu/docker-compose-centos-php](https://github.com/tmasu/docker-compose-centos-php)

2. カレントディレクトリを移動
`cd docker-compose-centos7-php`
3. コンテナビルド
`docker-compose build`
4. コンテナ起動
`docker-compose up`

### SSHログイン
デフォルトのパスワードはrootになっています

```
ssh root@localhost -p 8022
```

### MySQLログイン

```
mysql -u root
```

### Slimのテストアプリ作成とビルトインwebサーバ起動
/var/www/html配下に作成すれば、ローカルのマウントされたフォルダ内のためローカルのエディタなどで直接編集することができます。

[app-name]は各自で書き換えください

```bash:slimでのアプリ作成とサーバ起動
cd /var/www/html/
composer create-project slim/slim-skeleton [app-name]
cd [app-name]
php -S 0.0.0.0:8080 -t public public/index.php
```
上記の実行後にブラウザで下記のURLにアクセスするとページが表示されます。
`http://localhost:8082/`

### サーバ上のファイルを直接編集
`docker-compose-centos7-php`配下のdata-htmlというフォルダ内を編集することで
サーバ内の/var/www/html配下を直接編集することができます。

# 注意

### BindAddressについて
PHPのビルトインwebサーバを起動する際に、
最初はSlimの公式ドキュメント通りに下記のようにしていたのですが、
これでアクセスしてもエラーページが出るのみでアクセスすることはできません。

```shell:誤
php -S localhost:8080 -t public public/index.php
```
アクセスするためには下記のようにする必要があります。

```shell:正
php -S 0.0.0.0:8080 -t public public/index.php
```

これはBindAddressの指定となり、サーバがどのアドレスを指定された時に
アクセス受け付けるのかということを指定するためのものになります。
* `localhost`とすると`127.0.0.1`となりサーバ内からのアクセスのみ受け付けます。
* `0.0.0.0`とすると全てのアクセスを受け付けます。

# 参考
今回の記事作成にあたり参考にさせていただいたページ
[Bind Addressの意味がようやく分かった(κeenのHappy Hacκing Blog | Lispエイリアンの狂想曲)](https://keens.github.io/blog/2016/02/24/bind_addressnoimigayouyakuwakatta/)
[Docker コマンドチートシート](https://qiita.com/wMETAw/items/34ba5c980e2a38e548db)
[Docker composeことはじめハンズオン](https://qiita.com/TsutomuNakamura/items/7e90e5efb36601c5bc8a)
[docker-composeを使うと複数コンテナの管理が便利に](https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)
monaca localkitの自動トランスパイルが重すぎるので、コマンドラインを叩いてトランスパイルする方法

##monaca localkitの自動トランスパイルを使わない方法

monaca localkitでアプリ開発をしていますが、トランスパイルが重くてよくmonacaアプリが固まってます。その時はシンタックスエラーも表示されず・・・あれ？ってなります。

![スクリーンショット 2018-06-28 9.55.35.png](https://qiita-image-store.s3.amazonaws.com/0/266846/64965150-d935-3add-9f5d-f8dab3c83163.png)

monaca localkitの自動トランスパイル機能を使わずにコマンドラインから都度都度叩く方法はこちらです。

参考：[docs.monaca.io](https://docs.monaca.io/ja/products_guide/monaca_cli/overview/#トランスパイル処理-コード変換)

monaca cliをインストールしてない場合は入れておきましょう。

```bash
$ npm install -g monaca
```
後は、プロジェクトのルートフォルダで以下のコマンドを実行するだけです。

```bash
$ monaca transpile
Running Transpiler...
Build completed in 9.749s
```

ビルドにかかった時間なども表示されるのでいい感じですね。
以下引用です。詳しくは公式のドキュメントを参考にしてください。

>monaca transpile: プロジェクトに対してトランスパイラーを実行します。--watch オプションを付けると、ソースコードが更新 ( または保存 ) されるたびに、トランスパイラーが自動で実行されます。
>monaca preview: --watch オプション付きのプレビューです。このコマンドを実行すると、HTTP サーバーが起動し、アプリのコンテンツを表示してくれます。

monaca localkitはなんか動作が怪しいのでもうちょっとなんとかして欲しい。
[Django] ファイルアップロード機能の使い方 [クラウドストレージ編]


## この記事について

前回「[基本設定編](https://qiita.com/okoppe8/items/86776b8df566a4513e96)」に続き Django のファイルアップロード機能（FileField、ImageField）の使い方の解説です。今回は  django-storages の使い方を Amazon S3 を例に説明します。

## 参考


- [naritoブログ：Django、静的ファイル、メディアファイルをAWS S3で管理](https://torina.top/detail/452/)
- [How to Setup Amazon S3 in a Django Project](https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html)

## django-storages について

`django-storages`はクラウドストレージをメディアファイルの保存先に使うためのパッケージです。

django-storages 公式：[github](https://github.com/jschneier/django-storages)/[gitdocs](https://django-storages.readthedocs.io/)

対応するストレージサービス等は以下の通りです

- Amazon S3
- Azure Storage
- DropBox
- Google Cloud Storage
- Apache Libcloud
- FTP/SFTP

## Amazon S3 での動作

django-storagesを利用するとメディアファイルのURLと保存先は以下の様になります。URLはAmazon S3より直接参照するものになります。

||ファイルの保存先の基点|ファイルのURLの基点|
|:--|:--|:--|
|非利用時|MEDIA_ROOT|MEDIA_URL|
|利用時|Amazon S3 バケット|Amazon S3 バケットのURL|

※django-storages利用時、MEDIA_ROOTとMEDIA_URLの設定は動作に影響を与えません。

### セキュリティ対応

デフォルトの動作では、メディアファイルのURLはAmazon S3 の「署名付きURL発行機能（Pre-Signed URL）」を使って有効期限を付けたものになります。一定時間後（※）にアクセス不能になるURLなので、URL流出の心配はありません。

参考：[S3にて Pre-Signed URLを発行する](http://blog.serverworks.co.jp/tech/2017/07/04/s3_presign/)

逆にURLをパーマリンクとして使いたい場合は、バケットをパブリックアクセス可能にしたうえで設定「AWS_S3_CUSTOM_DOMAIN」にバケットのURL（もしくはRoute53で取得した独自ドメイン）を指定してください。署名付きURLではなくパーマリンクになります。

※有効期限はデフォルトで1時間(3600)。AWS_QUERYSTRING_EXPIREで変更可能。

## 設定手順

### １．Amazon上の設定

クラウド上で以下の設定を終えてください。

- Amazon S3にバケットを作成する。
- Amazon IAMでユーザーを作成する。
- Amazon IAMでグループを作成し「AmazonS3FullAccess」またはカスタムポリシーを作ってグループに割り当てる。
- 作成したユーザーをグループに所属させる。

英語ですが[こちらのサイト](https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html)に詳しい作業手順があります。

Djangoの接続設定として以下の情報を使います。

- ユーザーのアクセスキー
- ユーザーのシークレットキー
- バケット名

### ２．django-storagesのインストール

プロジェクトに「django-storages」と「boto3(Python用 Amazon SDK)」をインストールします。

```shell:コマンド
pip install django-storages
pip install boto3
```

### ３．django-storagesの設定

設定ファイルにdjango-storagesを利用するための設定と１で控えておいたアクセスキー等を設定します。

```python:settings.py
INSTALLED_APPS = (
    ...
    'storages',
    ...
)

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_ACCESS_KEY_ID = 'Your Access Key ID'
AWS_SECRET_ACCESS_KEY = 'Your Secret Key'
AWS_STORAGE_BUCKET_NAME = 'bucket name'

```

これで設定完了です。

ファイルアップロードを試すと、ファイルがAmazon S3上に保存されることが確認できると思います。django-storagesではさらにキャッシュやファイル圧縮、同名ファイルアップロード時の動作の設定が可能です。詳しくは[公式ドキュメント](https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html)を参考にしてください。
atomでEC2など外部サーバー上のファイルを編集する

# "remote-ftp"のインストール


atomの環境設定から"remote-ftp"をインストールします。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/148373/1ff1059a-2245-18a2-c01a-e5f01d3e9d18.png)









## 作業ディレクトリの作成


設定ファイルや、リモートで編集するディレクトリ/ファイルの置き場が必要です。

ちゃちゃっと作成します。


```
$mkdir sftp-work
$cd mkdir sftp-work
$atom ./
```





## 設定ファイルの作成


リモート接続先を設定します。

パッケージから "Remote FTP" の "Create SFTP config file" を選択します。



![image.png](https://qiita-image-store.s3.amazonaws.com/0/148373/22c4ef65-1c52-a7b9-ed33-a1ffd6f2448d.png)




すると設定ファイルのテンプレが作成されます。

以下のように編集します。



EC2に接続したい場合、不明な部分はAWSのEC2Managementを見るとわかります。

{
    "protocol": "sftp",
    "host": "{接続先 ホスト}",
    "port": 22,
    "user": "{ログインユーザー名}",
    "pass": "{未使用なら空文字}",
    "promptForPass": false,
    "remote": "{接続時に開くディレクトリ(デフォルトはroot)}",
    "local": "",
    "agent": "",
    "privatekey": "keyのpath",
    "passphrase": "",
    "hosthash": "",
    "ignorehost": true,
    "connTimeout": 10000,
    "keepalive": 10000,
    "keyboardInteractive": false,
    "keyboardInteractiveForPass": false,
    "remoteCommand": "",
    "remoteShell": "",
    "watch": [],
    "watchTimeout": 500
}






# 接続してみる


接続してみます。

今度はパッケージから"Toggle"を選択します。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/148373/87455c60-031d-ba62-c0b5-0313ab9192bc.png)



すると、普段ディレクトリの階層が表示される位置に、次のようなものが表示されます。




![image.png](https://qiita-image-store.s3.amazonaws.com/0/148373/5ab16402-2bdc-e2aa-808e-3871e35331c2.png)



ここから "connect" を選択し、無事接続が完了すると接続先のディレクトリ階層が表示されます。

あとはそこからファイルを選択して直接編集をすることができます。
webpackとwebpack-serveで静的なWeb環境を作る(deprecated)

`webpack-serve` さん。メンテモードに入った `webpack-dev-server` の後継らしいのですが周りであんまり使っている人がいないので、自分が手元で使っている最低限の構成を書いておきます。

追記: `webpack-serve` も 2系にバージョンアップし、細かいところで挙動が変わっていたりするので、なるべく公式ドキュメントをあたってください。

追記: webpack-serveは開発が止まり、webpack-dev-server の開発が再開しました。したがってwebpack-dev-server を使っていきましょう。

## インストールする

```bash
npm inint -y
npm install --save-dev webpack webpack-cli webpack-serve
```

## webpack.config.js を作成する

- webpack4からは設定ファイルがなくても動くが、コマンドラインオプションで bind とかいっぱい書くと package.json のスクリプトがでかくなってコミット差分が読むのつらいので結局あった方がよいという学びを得た。
- output や entry もデフォルト値があるが、明示的に書いておいたほうがメンテしやすかった。
- mode指定は [webpack-serve のREADME](https://github.com/webpack-contrib/webpack-serve#setting-the-config-mode) 参照。なお、「webpackのmodeを自動的に設定したい」というイシューは[けっこう前からあがっている](https://github.com/webpack-contrib/webpack-serve/issues/44)のだが閉じられたまま進行している。

```
const path = require('path')

module.exports = {
    mode: process.env.WEBPACK_SERVE ? 'development' : 'production',
    entry: path.resolve(__dirname, "index.js"),
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'main.js'
    }
}
```

## serve.config.js を作成

- `webpack.config.js` に `serve` オプションで書けるのだけど、独立ファイルの方がなにかと便利なのでわける。
- `open: true`, `port:8080` はオプション。

```
const serve = require('webpack-serve');
const config = require('./webpack.config.js');
const argv = {}
const options = { config, content: 'public/' ,open: true, port:8080 }

// serve({}, { config });
serve(argv, options);
```

## src/index.js 

```index.js
var content = document.getElementById("content");
content.innerHTML = "this is content";
```

## public/index.html 

```index.html
<div id="content"/>
<script src="/main.js" defer></script>
```

## 起動

```bash
npx webpack-serve
```

<img width="364" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/17911/354d0cbd-7041-b2a6-c8b1-feeb2425ad01.png">

起動できた。webpack使っているのは src/ 以下のJSファイルのみで、特に変換も何もしていない状態。

webpack-serve は webpack-hot-client を利用しているため、`src` 内のファイルを更新すると自動的に再ビルドが行われ、ブラウザで表示しているコンポーネントが書き換えられる。
Linuxの仕組み~システム構造とカーネル~

# Linuxシステムの主要な構造
##Linuxカーネル
Linuxは厳密にはカーネルというOSの核となる部分を指す。
カーネルはOSの機能として最も重要であり、ハードウェアコントロールやアプリケーションの動作環境・実行状態の管理・ファイルシステムの管理などの機能を持っている。

##コマンドとシェル
コマンドはLinuxカーネルの機能を利用するソフトウェアの総称であり、シェルと呼ばれる機能を使ってコマンドを使用する。

##デーモン
デーモンは裏方で動作するソフトウェアです。基本的にサーバー関連のソフトウェアの多くがデーモンの形で実行される。
ちなみに、Linuxで使われるデーモンは悪魔ではなく、ダイモンという神々と人間との仲介役を果たす神霊を指す。

##ライブラリ
ライブラリはシステムコールを使ってカーネル機能を呼び出すものである。
コマンドやアプリケーションはカーネルを直接呼び出さず、ライブラリを仲介してカーネルの機能を利用している。

#Linuxカーネル動作
Linuxカーネルはイベント駆動型になっており、イベントがカーネル動作を引き起こす作りになっている。
カーネルに伝えられるイベントは以下の３種類である。

- ハードウェア割込み
- CPU例外
- システムコール

また、カーネル内部には各イベントごとに「ハンドラ」と呼ばれるプログラムが用意されている。
「ハンドラ」はイベント発生を受け取った場合、カーネル機能を利用して、目的の処理をするプログラムである。

##システムコールの仕組み
ファイルを読み込むプログラムを例にして説明する。
プログラミングで read() というファイルを読み込む命令があります。
このread()が実行されると、read()システムコールを実行することになります。そしてそのシステムコールはライブラリのread()システムコール用のプログラム(ラッパルーチン)を呼び出します。
ラッパルーチンが呼び出されると、CPUに対して**割込み命令(int命令)**をだします。
割込み命令を実行すると、CPUはそのとき実行していた処理を一旦中断してカーネルの**システムコールハンドラ**を起動します。
つまり、**カーネルの機能を割り込み命令で呼び出す**のがシステムコールの役割なのです。
システムコールハンドラが起動した後は、read()システムコールに対応するsys_read()プログラム(サービスルーチン)を呼び出します。
この**sys_read()サービスルーチン**によって、HDDからデータを読み出して、呼び出し元のソフトウェアにデータが渡ってくるのです。
ちなみに、システムコール経由でカーネル機能を利用するメリットは、ハードウェアに対する命令用のプログラムを書く必要がなくなることやソフトウェアを簡単に移植できるといったことがあります。
チーム開発する上で必須だと思うツール

ツール名とそのツールを使うメリットについて書いていきます。
基本的に定番ツールで世の中一般的に使われているものだと思います。


## Github Enterprise

https://enterprise.github.com/home

### 使うメリット

- Pull Request機能を使ってソースコードをレビューする文化が生まれる
- Projectやissue機能を使ってタスク管理ができる
- Wikiにを使って社内共有事項を書いておくことができる(環境構築手順とかを書いておくとか)
- 正直これからの時代Gitを使えるエンジニアでないと他で通用しなくなるので必須だと思う

### Pull Request

https://blog.qnyp.com/2013/05/28/pull-request-for-github-beginners/

- ブランチに対してマージする前にチームでレビューしあうこと
- ソースコード一行単位でレビューを書くことができるので、ソースコードの品質を保てる
- Pull Requestを送り合うことで誰かの書いたコードを読むことができるので、どんな風に実装したとかの情報に目を通すことができるので自分の実装してない機能なのにどんな風に実装されているか知れる

### Project issue

http://blog.teratail.com/entry/github-projects

- Pull Request　と issueを連携することができるのでここでタスク管理ができる
- 今なんのタスクが終わってなくて、なんのタスクが終わっているのか一覧で把握できる

### Wiki

https://qiita.com/suzuki-hoge/items/1d6022cca177e2d96bb

- リポジトリ内での共有事項を明記しておけば後から入った人にも素早く情報共有できる
- 手順書などいちいちExcelやWordで作るよりも圧倒的に軽くて素早く作ることができる

### 価格

- 10人分の1年間のライセンス料金が大体40万円を切るくらい
- 正直Githubは結構高いです。でもその分多機能でかなり使いやすいし、バグを見たことがない。
- GHEだと運用コスト(サーバー代とか)かかるのでgithub.comの方を使用する場合はもう少し安い
- 参考： https://github.com/pricing
- 参考： https://enterprise.github.com/features#pricing


## Slack

https://slack.com/intl/ja-jp

### 使うメリット

- 情報共有がスピーディーになる(メールより何倍もはやい)
- リマインド機能があるのでやりたいことがあったりしたらときに設定しておくと忘れない
- CIの通知や、CrashlyticsでクラッシュしたときにSlackと連携しておくと通知してくれるので障害に気付きやすい
- Githubとも連携できるのでPull Requestや、Wikiに記述したら通知がくるように設定しておける
- Bot機能を使ってドキュメントの場所を記憶させておく方法があるらしい(参考:http://mercan.mercari.com/entry/2018/04/10/163322)


### 価格

https://slack.com/intl/ja-jp/pricing

- 年契約すると一人当たり月850円


## CIツール

- jenkins: https://jenkins.io/
- CircleCi: https://circleci.com/
- travis: https://travis-ci.org/

### 使うメリット

- 使いこなすとリリースの自動化ができるので楽
- ローカルでビルドしてリリース作業しているとどうしてもミスが起こりやすい。なのでクラウドでビルドさせることで個人差がなくなりミスがなくなる。
- リリースミスを減らすという意味でもかなり重要

### 価格

- CIはサービスによってまちまち。
- Jenkinsなら自分でサーバーを用意して設定する必要があるが、Jenkinsの使用自体は無料


## 総括

上にあげた３つのツールはもう世の中一般的に使われているものでだいたいどこの現場にいっても使われています。
ほとんどのツールが有料ですが、これらのツールに投資した方がミスや、障害を確実に減らせ、かつ開発速度は圧倒的に上がりますので導入を検討すべきです。
IE11で<!--DOCTYPE html-->と表示される場合はその前にheader出力していないか確認

`<!DOCTYPE html>`と書いたのに
`<!--DOCTYPE html-->`と出力される怪奇現象に遭遇。

なんだろって思ったら
`header('X-UA-Compatible: IE=EmulateIE8');`って命令をしていたのを忘れていた。
ここをheader出力を迂回して期待通りになった。
古いiOSでログイン/ログアウトができなかった

`Rails 5.1`
# iOSでログインできない

iOS8,9など、古いOSの一部ブラウザでログインできない問題発生。
色々検証したのだけど、jQueryが読み込まれていない。
理由はわからないのだけど、`assets`に`jQuery-x.x.x.min.js`を入れて
コンパイルしているのが原因だった模様。
jQueryのバージョンは同じでも、`CDN`から呼び出すことで解決。
また、変数宣言`let`は使えなかったので`var`に修正。

# iOSでログアウトできない
ほっとしたのもつかの間、
iOS8,9など、古いOSの一部ブラウザで今度はログアウトできない問題発生。
[ここ](http://d.hatena.ne.jp/tkuro/20130123/1358920686)にもあるように、ログアウトリンクはjQueryを使って`delete`を投げている。
このjQueryがうまく働いていないようなので、上記ページを参考に手書きしてみたけど、やっぱり`get`しか投げられない。
どうやら古いOSの一部ブラウザでは`put`や`delete`を投げられない場合があるらしい。

ということで、結局`get`用のメソッド `logout`を作って強引に解決致しました。
AWS Cloud9 でPython3を使うための設定

# Pythonとpipのバージョンを確認する
Cloud9のターミナルで下記のコマンドを実行して、現在設定されているPythonとpipのバージョンを確認してください。

```
$ python -V
Python 2.7.14
$ pip -V
pip 9.0.3 from /usr/lib/python2.7/dist-packages (python 2.7)
```

# AWS Cloud9の設定を変更
AWS Cloud9の画面左上から「Preferences」を選択してください。
![01_AWS Cloud9の設定を変更.png](https://qiita-image-store.s3.amazonaws.com/0/131520/387f1b2d-01c7-90d7-e2ee-1256b9c7423e.png)

左のメニューから「Python Support」を選択してください。
![02_AWS Cloud9の設定を変更.png](https://qiita-image-store.s3.amazonaws.com/0/131520/dc14266c-c04b-5728-162e-f5427a133ec6.png)

「Python Version」の項目を「Python2」から「Python3」に変更してください。
![03_AWS Cloud9の設定を変更.png](https://qiita-image-store.s3.amazonaws.com/0/131520/ba6afff3-5725-2046-87dd-92a548f20d21.png)


# pythonのaliasを変更
標準設定ではaliasがPython2.7を利用するように設定されているので、Python3.6を利用するように変更します。

```
$ vi ~/.bashrc
変更前
alias python=python27

変更後
alias python=python36
```

aliasの設定を反映させるために下記のコマンドを入力してください。

```
$ source ~/.bashrc
function
```

# update-alternativesを実行
pythonコマンドを実行した際にPython3.6を利用するように設定します。
標準ではPython2.7を利用するように設定されているので、Python3.6を利用するために「2」を入力して切り替えてください。

```
$ sudo update-alternatives --config python

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/python2.7
   2           /usr/bin/python3.6

Enter to keep the current selection[+], or type selection number: 2
```

# Pythonとpipのバージョンが変更されいることを確認
下記のコマンドを入力しpythonとpipのバージョンが「2.7」から「3.6」に切り替わっていることを確認してください。

```
$ python -V                                                                                         
Python 3.6.5
$ pip -V
pip 9.0.3 from /usr/lib/python3.6/dist-packages (python 3.6)
```
以上です。
Visual Studioを立ち上げずにビルドするバッチを作ったので公開

## 1. はじめに

「Gitに最新ソースプッシュしたから動作確認しておくれーーー」ってなったとき、
今使っているPCのスペックがイマイチで、Visual Studioの起動にとても時間がかかっていました。
いちいち起動してビルドするのが面倒だったので、MSBuildを使って(なるべく)汎用的に使えそうなバッチを作ってみました。

## 2. GitHub

[sln_builder](https://github.com/i-tanaka730/sln_builder)

## 3. ユーザー変数についての説明

```
rem MSBuildのパス
set MSBUILD_PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
```

MSBuildのパスを設定します。
Windows7以降は標準でインストールされているようですが、古い場合等は以下からインストールできます。
https://www.microsoft.com/ja-JP/download/details.aspx?id=48159

```
rem ソリューションファイルのパス
set SOLUTION_FILE=C:\xxxxx\xxxxx.sln
```

ソリューションファイルのパスを設定します。


```
rem ビルド構成 (debug / release)
set BUILD_CONFIG=debug

```

ビルド構成を設定します。
デバッグビルドの場合は「debug」、リリースビルドの場合は「release」を設定してください。


```
rem ビルド種類 (build / rebuild)
set BUILD_TYPE=build
```

ビルド種類を設定します。
ビルドの場合は「build」、リビルドの場合は「rebuild」を設定してください。

```
rem 最新ソース取得有無 (true / false)
set PULL_SOURCE=false
```

最新ソースを取得するかどうかを設定します。
最新ソースを取得する場合は「true」、取得しない場合は「false」を設定してください。


```
rem ブランチのパス
set BRANCH_PATH=C:\xxxxx
```

最新ソースを取得するブランチのパスを設定します。
最新ソースを取得する場合は設定必須、取得しない場合は設定不要です。


```
rem ブランチの名前
set BRANCH_NAME=xxxxx
```

最新ソースを取得するブランチ名を設定します。
最新ソースを取得する場合は設定必須、取得しない場合は設定不要です。
LAN線の種類についてのまとめ

#はじめに
このブログには授業で習ったことのまとめや、感想などをまとめて記事にしています。

今回は自分用のメモとしてLAN線の種類をまとめました

#LANの種類

・**CAT7A**
・**CAT7**
・**CAT6A**
・**CAT6**
・**CAT5e**

---

![cat_speed.png](https://qiita-image-store.s3.amazonaws.com/0/249281/8c07996a-ff38-607c-ecbf-e603c1758948.png)
引用元：サンワダイレクト

---

##CAT7A
通信速度：10Gbps
伝送帯域：1000MHz
構造：ScTP

---

##CAT7
通信速度：10Gbps
伝送帯域：600MHz
構造：ScTP

---

##CAT6A
通信速度：10Gbps
伝送帯域：500MHz
構造：UTP

---

##CAT6
通信速度：1Gbps
伝送帯域：250MHz
構造：UTP

---

##CAT5e
通信速度：1Gbps
伝送帯域：100MHz
構造：UTP

---

##最後に
LAN線にもやっぱり色々種類あるんだなー…
もう少し深く勉強して行こうと思います('ω')
DockerでPython(Anaconda)環境を1から構築するぞ！

# 概要
DockerにプレーンなCentOSを入れてPython環境を構築する。
なぜAnacondaかというデータサイエンスに必要なライブラリが入っているため。(Pandas,NumPy あたりを使う予定)


# 環境
CentOS Linux release 7.5.1804 (Core)

補足
macOS High Sierra 10.13.5
Docker 18.03.0-ce-mac60 (23751)

# 構築
まず、新しいパッケージを利用するようにEPELリポジトリをインストールし、Python(Anaconda)をインストールする。

## EPELリポジトリのインストール

まず、CentOSのパッケージは古いものが多いので、EPELリポジトリをインストールする。
> yum install -y epel-release

インストール後、設定を変更する。

```/etc/yum.repos.d/epel.repo
[epel]
enabled=0
```

※priorityを設定してEPELを優先して使う方法もあるが、オプション付与で対応する。

```:例
 yum install -y --enablerepo=epel git
```

## Python(Anaconda)のインストール
Anacondaをインストールするために、まずpyenvをインストールする。
pyenvはGitHubから取得するため、gitコマンドをインストールして、pyenvをクローンする。

> yum install -y --enablerepo=epel git

> git clone https://github.com/pyenv/pyenv.git ~/.pyenv

pyenvをクローンできたら、使用しているシェルにpyenvの設定を追加する。
bashの場合はbashrcファイルに以下を追加する。

``` ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```


最新バージョンのAnacondaをインストールする。
インストールできるバージョンは以下のコマンドで確認。

> pyenv install -l | grep anaconda


現時点で（2018.6.28)最新のバージョンは **anaconda3-5.2.0** だったので、このバージョンをインストールする。

・・・と、その前に、Anacondaをインストールするには**bzip2**が必要なのでyumでインストールしてから、Anacondaをインストールする。

> yum install -y --enablerepo=epel bzip2

> pyenv install anaconda3-5.2.0

インストール後、AnacondaのPythonを使うように設定を変更する。

```:変更前
python --version
Python 2.7.5
```

変更

> pyenv global anaconda3-5.2.0

> pyenv rehash

```:変更後
python --version
Python 3.6.5 :: Anaconda, Inc.
```

以上で、Python(Anaconda)導入までは完了です！


あとがき
Anacondaをインストールしたので、condaコマンドが使えるようになっています。
NumPyなど使う場合はこちらのコマンドでインストールできます。


## Dockerfile
今回紹介したDocker環境は下記Dockerfileを参考にしてください。

```:Dockerfile
FROM centos:latest
MAINTAINER libra_lt
RUN \
    yum install -y epel-release && \
    yum install -y --enablerepo=epel git && \
    yum install -y --enablerepo=epel bzip2
RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv
RUN \
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc && \
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc  && \
    echo 'eval "$(pyenv init -)"' >> ~/.bashrc  && \
    echo 'LANG=ja_JP.UTF-8' >> ~/.bashrc  && \
    echo 'export LANG' >> ~/.bashrc
RUN ["/bin/bash", "-c", " \
    source ~/.bashrc && \
    pyenv install anaconda3-5.2.0 && \
    pyenv global anaconda3-5.2.0 && \
    pyenv rehash \
    "]
```

# 参考

データサイエンティストを目指す人のpython環境構築 2016　-　@y__sama 様
https://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c
RHEL7でOracle12cの自動起動

RHEL7でOracle12cの自動起動がなかなか出来なかった。。。

基本は下記のサイトを参考。
https://www.server-world.info/query?os=CentOS_7&p=oracle12c&f=6

でも起動できない。
systemctlがどうなっているかを確認した。
`#systemctl status`

下の方に
dbora.service -> '/org/freedesktop/systemd1/unit/dbora_2eservice'

dbora.service - SYSV: Oracle Database Server
   Loaded: loaded (/etc/rc.d/init.d/dbora)
   Active: failed (Result: exit-code) since 木 2018-06-28 07:56:31 JST; 4min 27s ago
  Process: 739 ExecStart=/etc/rc.d/init.d/dbora start (code=exited, status=2)

 6月 28 07:56:31 aaa systemd[1]: Starting SYSV: Oracle Database Serv....
 6月 28 07:56:31 aaa dbora[739]: /etc/rc.d/init.d/dbora: 行 45: 一...
 6月 28 07:56:31 aaa dbora[739]: /etc/rc.d/init.d/dbora: 行 50: 構...
 6月 28 07:56:31 aaa systemd[1]: dbora.service: control process exit...2
 6月 28 07:56:31 aaa systemd[1]: Failed to start SYSV: Oracle Databa....
 6月 28 07:56:31 aaa systemd[1]: Unit dbora.service entered failed s....
Hint: Some lines were ellipsized, use -l to show in full.

何かエラーがあるようで、
#Oratabの編集を行った。
自動起動するインスタンスの選択 
/etc/oratab を編集して、自動起動したいインスタンスの最終フィールドを Y に変更する

`vi /etc/oratab`
...
ORCL:/u01/app/oracle/product/〜/db_1:Y    ← ORCLは自動起動するインスタンス

できた！
mxtoolbox でアドレスが引けない時の調べ方

[MXtoolbox](https://mxtoolbox.com) でアドレスが引けないというトラブルがあった時の調べ方です。
自分の端末で dig で調べてアドレスが引けるのに、[MXtoolbox](https://mxtoolbox.com) では、引けないというようなケースです。
その違いは、MXtoolbox が　かなり上位の　DNSサーバーに問い合わせをしているのに、自分の端末は近くの DNSサーバーに問い合わせをだしているということです。

そこで、上位のサーバーを探します。

1) 例えば、*.net というドメインだと

```text
$ dig net. NS

;; ANSWER SECTION:
net.			172242	IN	NS	h.gtld-servers.net.
net.			172242	IN	NS	i.gtld-servers.net.
net.			172242	IN	NS	l.gtld-servers.net.
net.			172242	IN	NS	m.gtld-servers.net.
net.			172242	IN	NS	a.gtld-servers.net.
net.			172242	IN	NS	k.gtld-servers.net.
net.			172242	IN	NS	j.gtld-servers.net.
net.			172242	IN	NS	c.gtld-servers.net.
net.			172242	IN	NS	e.gtld-servers.net.
net.			172242	IN	NS	b.gtld-servers.net.
net.			172242	IN	NS	g.gtld-servers.net.
net.			172242	IN	NS	f.gtld-servers.net.
net.			172242	IN	NS	d.gtld-servers.net.
```

この中のどれかのサーバーに dig をかければ、MXtool と同じ結果が得られます。

```bash
dig sample.net @a.gtld-servers.net. +norec
```

2) 例えば、*.org というドメインだと

```text
$ dig org. NS

;; ANSWER SECTION:
org.			86400	IN	NS	b0.org.afilias-nst.org.
org.			86400	IN	NS	b2.org.afilias-nst.org.
org.			86400	IN	NS	d0.org.afilias-nst.org.
org.			86400	IN	NS	c0.org.afilias-nst.info.
org.			86400	IN	NS	a2.org.afilias-nst.info.
org.			86400	IN	NS	a0.org.afilias-nst.info.
```

この中のどれかのサーバーに dig をかければ、MXtool と同じ結果が得られます。

```bash
dig sample.org @b2.org.afilias-nst.org. +norec
```
Pythonを使いGCPでlinebotを動かす（2）

シリーズ２回目です。今回と次回で、main.pyを完成させます。
今回は、最初の待受画面を表示する部分のプログラムを書きたいと思います。
↓メッセージを受け取った場合に、こういうのを表示させます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/266780/65d3a71d-2df6-c8f0-7871-61a3deaad80c.png)


さっそく、コードを見てみましょう。

# main.py
###

```python:main.py

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):

### 相手のプロフィールを取得
    profile = line_bot_api.get_profile(event.source.user_id)

### コンファームテンプレートメッセージを作る
    
    confirm_template_message = TemplateSendMessage(
        alt_text='Confirm template',
        template=ConfirmTemplate(
        text=profile.display_name+'さん\nアンケートにご協力ください。',
        actions=[
            PostbackAction(
                label='YES',
                data='yes',
            ),
            MessageAction(
                label='NO',
                text='no')
        ]
    )
)

### コンファームテンプレートメッセージを送る
    line_bot_api.reply_message(
            event.reply_token,confirm_template_message
            )
```
冒頭の２行

```python:main.py

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
```
は、lineでMessageevent（普通のメッセージを送信された場合）が起こった場合に、def以下の関数を実行するという意味です。
コンファームテンプレートというのは、冒頭の画像のように、上半分に本文、下半分に選択肢１＋選択肢２という形で構成されるメッセージです。コンファームテンプレートの構成要素のうち、textには本文を入力します。actionsには、選択肢を入力します。上のコードでは、PostbackActionとMessageActionを入力しています。
このあたりについて、よくわからないという方は
基本概念の説明
↓
[line公式ドキュメント](https://developers.line.me/ja/docs/messaging-api/message-types/)
pythonによる実装の仕方
↓
[line-bot-sdk-python](https://github.com/line/line-bot-sdk-python)

をご参照ください。

上のコードのコンファームテンプレートは、YESと書かれたボタンを押すと、yesというポストバックが送信され、Noというボタンを押すとnoというメッセージが送信されるというものになっています。noというメッセージが送信されると、Messageeventが発生するので、再び、上で書いたdef以下のコードが実行され、同じコンファームテンプレートが送られます。
一方、yesというポストバックが送信されると、ポストバックとメッセージは違うものなので、Messageeventは起こりません。したがって、上で書いたdef以下のコードは実行されません。

次の記事では、このポストバックが送信され、ポストバックイベントが起こった時の処理を書いていきます。
GPSの研究　その32

#概要
GPSを理解したかった。
GNSS-Radarを設置してみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/55a540da-c56b-a7e8-1d4e-fda469e23df1.png)


#成果物

http://jsdo.it/ohisama1/EyOY

以上。