OmniAICreator/Qiita-1.07M huggingface dataset:
逆引きwhere.or

[ActiveRecord::QueryMethods.#or](http://api.rubyonrails.org/)の使い方が理解しにくいので、整理してみました。

ActiveRecordの`where`の引数に文字列でWHERE句を渡せば、なんでも表現できますが、シンタックスハイライトが効かなかったり、静的解析を行えないので、できるだけSQLを文字列で記述したくないです。

## where.or 基本形

```ruby
Model.where(a).or(Model.where(b))
# SELECT * FROM "users" WHERE (a OR b)
```

実際に動かしてみると、こんな感じ

```ruby
User.where(name: "taro").or(User.where(email: "taro@example.com"))
# SELECT  "users".* FROM "users" WHERE ("users"."name" = $1 OR "users"."email" = $2)
```

以降では、わかりやすくするために前者の表記で記載するので、適宜読み替えてください。

## チェーン形式

```ruby
Model.where(a).or(Model.where(b)).or(Model.where(c))
# SELECT * FROM models WHERE ((a OR b) OR c)
# つまり、 SELECT * FROM models WHERE (a OR b OR c)
```

単純に全ての条件を`or`なら、チェーンで繋いでいけばいいです。

## andと併用

### `(a && b) || c`

```ruby
Model.where(a).where(b).or(Model.where(c))
# SELECT * FROM models WHERE (a AND b OR c)
```

`and`と`or`が混在すると、演算子の優先度と同じように`&&`が優先されるため、単純に繋げると、`or`は後から評価されます。

### `a && (b || c)`

```ruby
Model.where(b).or(Model.where(c)).where(a)
# SELECT * FROM models WHERE (b OR c) AND a
```

`or`を優先したい場合、ActiveRecordでは、評価の優先順をチェーンメソッドの並び順で表現するようです。
自分は、これをよく使う場面があります。例えば、公開終了日を表す`end_at`が`null`を許可する場合、公開中のデータを取得するには`WHERE start_at <= :time AND (:time <= end_at OR end_at IS NULL);`といったことが行いたくなります。

### `(a && b) || (c && d) || (e && f)`

最後に、こんなことがしたい場合は、以下のようになります。
ここまでくると、SQL直書きの方がマシですね。。。

```ruby
Model.where(a).where(b).or(User.where(c).where(d).or(User.where(e).where(f)))
# SELECT  "users".* FROM "users" WHERE (a AND b OR (c AND d OR e AND f)) 
```

他にも`or`の表現パターンが見つかったら追記していきたいと思います。
Scalaの良さ(メリット)とは？


# Scalaとは
プログラミング言語の一種
JVM上で動作し、Javaをシームレス(違いを意識しなくて良い)に利用できる
Scalaのコンセプトは`オブジェクト指向`と`関数型`の統合
Javaをベースとしたオブジェクト指向言語の上に、関数型の機能を表現している

## オブジェクト指向
オブジェクトはモノ
クラスは設計図(分類)
モノに要素(データ,プロパティ)と機能(処理,メソッド)が付いているというイメージ

### 三大要素
#### 継承
特徴を共有すること

#### カプセル化
意味:機能とデータの範囲を明確にすること

#### ポリモーフィズム
使い分け

## 関数型
「データに何らかの処理を加えていく」の連続で組み立てていくもの

### 特徴
#### immutable(不変)
値が不変(val)

#### 副作用がない
本来するべきことを作用とすれば、作用に伴って別のことをしてしまうのが副作用
つまり、特定の処理は同じことをしてくれる

#### 関数はファーストクラス(第一級)
ファーストクラス(第一級)とは、関数を型として扱える
文字列型とか数値型とかと同じにみなせる

## おまけ
### 関数とメソッドの違い
`関数`:引数に依存する。引数が同じなら常に同じ値を返し、引数が変わったら別の値を返す。
`メソッド`:オブジェクトと関連づいている。オブジェクトの操作をメソッドという

# Scalaのメリット
## Javaとの互換性
ScalaはJavaとの互換性を第一に考えられた言語
ScalaからJavaのAPIを呼ぶことができる

## 非同期プログラミング、並行・分散プログラミング
### Future
非同期の計算を実現するライブラリが標準である
非同期プログラミングにより、スレッド数を超えるようなクライアントの大量同時のアクセスに対応

#### 非同期とは
送信側と受信側のタイミングの一致（同期）を気にせずにデータをやり取りすること。つまり、はやい。

### Akka
並行・分散プログラミングのためのライブラリ
Akkaにはアクターというスレッドより小さい単位の実行コンポーネントがあり、このアクター間の通信により並行・分散プログラミングをおこなえる。

### 並行・分散とは
１度に複数の手続きが実行される

## パターンマッチ
Scalaのパターンマッチにはフォールスルーがない
フォールスルーはメリットよりも、バグであると考える方が多数

### フォールスルーとは
switch文においてbreakを省略した書き方。
以下のような処理があった際に

```
switch (value) {
	case 0:
		System.out.println(“0″);
	case 1:
		System.out.println(“1″);
		break;
	default:
		System.out.println(“-1″);
		break;
}
```

value = 0 なら
0
1

value = 1 なら
1

value ≠ 0 ≠ 1 なら
-1

のように本来ならvalue = 0 なら0と返したい所でであるが、0 1を返していまう。

今のところはこのくらい
もうちょっと勉強していきたい

# 参考
[ドワンゴオリジナルの、新卒エンジニア向けの研修資料](https://dwango.github.io/scala_text/)
【Microsoft Tech Summit 2017】HoloLens, WinMR 関連セッションまとめ

2017 年 11 月 に開催された Microsoft Tech Summit 2017 の HoloLens, Windows Mixed Reality 関連のセッション情報のまとめ記事です。公開ビデオ、公開スライド情報などをまとめています。セッションは近日公開予定だそうなので、現時点では、基調講演のみまとめております。セッションが公開され次第、随時更新予定です。

**関連記事**: [HoloLens, Windows Mixed Reality 関連セッションまとめ (de:code 2017)](https://qiita.com/HoloDevJP/items/891c9968ee767db10cab)


#TL;DR
この記事を読むことで、Microsoft Tech Summit 2017 の各プレゼンテーション、セッションの要点が分かります。ざっと確認していただき、気になったところだけ詳細を参照することで、効率よく HoloLens, Windows Mixed Reality 技術情報を学べます。

**対象読者**: HoloLens, Windows Mixed Reality ITPro, 開発者

# Microsoft Tech Summit 2017 とは
Microsoft Tech Summit 2017 は 2017 年 11 月 8-9 日に開催された日本マイクロソフトのインフラエンジニア、アーキテクト、IT 戦略に関わる方向け有償イベントです。

**公式サイト**: [Microsoft Tech Summit 2017](https://www.microsoft.com/ja-jp/events/techsummit/2017/)

## Microsoft Tech Summit 2017 全体のセッション資料/動画一覧
近日公開予定です

## 基調講演 - 変化のとき、進化のとき ITイノベーションがもたらす価値 -
動画: https://www.youtube.com/watch?v=KwYYykTHng0
資料: 無し
発表者: 複数
難易度: 初級者向け

### HoloLens & WinMR 関連発表内容
- [[9:30 - 15:40](https://youtu.be/KwYYykTHng0?t=9m30s)] 三菱ふそうトラック・バス株式会社の紹介。HoloLens を使用したソリューションの動画
- [[31:20 - 33:35](https://youtu.be/KwYYykTHng0?t=31m20s)] Microsoft PowerPoint に 3D オブジェクトを配置するデモンストレーション
- [[33:50 - 42:20](https://youtu.be/KwYYykTHng0?t=33m50s)] Windows Mixed Reality プラットフォームに関する概要。Mixed Reality とモダン ワークプレイス、ファーストラインワーカー に関する活用シナリオと動画
- [[42:21 - 51:10](https://youtu.be/KwYYykTHng0?t=42m21s)]小柳建設株式会社 Holostruction のライブ デモンストレーション
- [[1:37:18 - 1:45:48](https://youtu.be/KwYYykTHng0?t=1h37m18s)] 平野社長による Mixed Reality における日本最新動向。MRPP (Mixed Reality Partner Program) 参加企業の紹介動画
Cookieでマルチサービスでアクセス制御

## 概要

たとえば、

- git.example.com - GitLab
- wiki.example.com - pukiWiki
- md.example.com - hackMD
- portal.example.com - 普通のWebサイト
- redmine.example.com - redmine

のようなたくさんのサービスが同じドメイン上で動いているとき、アクセス制限をかけたい！でも全部のサービスでBASIC認証を入れるのは手間！かといってセッションを用いた認証を挟もうにもサービスに手を加えたくない！
そんなときの解決策として、1つ思いついて実装してみたのを記録に残そうと思います。
（まあどうせ誰かのn番煎じなんだろうけど、一応検索して見つからなかったので）

結論から言うと、Cookieを用いてApacheの`mod_rewrite`で制御する、それだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71557/2a1afc19-fc74-b53e-8fbc-ef034963008b.png)

## 前提
- **通信がhttpsであること**
- 普通にWebサーバが動いていること

## 実装
### Cookieの値の設定
```
> vi /etc/httpd/conf.d/0-auth.conf

#値は適当
Define COOKIE_KEY key=pass
```
この`Define`と出会うまで1時間かかりました。
### vertualHostの設定
```
> vi /etc/httpd/conf.d/hoge-vhost.conf

<virtualHost *:443>
## その他の設定 ##
    #認証
    RewriteEngine On
    RewriteCond %{HTTP_COOKIE} !${COOKIE_KEY}
    RewriteRule ^.*$ https://portal.example.com/login.php
## その他の設定 ##
</virtualHost>
```
`portal.example.com`のconfだけ`RewriteCond %{REQUEST_URI} !login\.php`も条件に追加しないと爆発する。
RedirectじゃなくてRewriteを使うことに2時間かけて気づきました。

### フォーム認証の書き方
```php:login.php
setcookie("key","pass",time()+3600*2,"/","example.com",true,true);
```

あとはcronとかで何日かに一回`0-auth.conf`の`pass`と、`login.php`の`pass`を違う文字列に置き換えます。
以上、簡単ですね。

## 安全性
**Cookieに鍵となる文字列を入れてしまって不正アクセスされないの？**
というところにだいぶ悩みました。
結論としては、

- HttpOnly属性をtrueにしてXSS攻撃を防ぐ
- Secure属性をtrueにして通信路での漏洩を防ぐ
- 鍵となる文字列を何日かに一回更新する

の三点をやれば良いんじゃないかなぁっていう感じです。たぶん

鍵となる文字列をユーザ側に保存するという点では通常のフォーム認証やセッションと同じだけど、
ここで問題になるのは全ユーザが同じ文字列を持つという点で、でもそれってBASIC認証でも同じだよねって

~~情報セキュリティスペシャリスト受かってもこれぐらいの自信しか持てない~~

## 最後に
BASIC認証、iOSだとID/PWが保持できなかったりしてくそめんどくさいですね。
代替案としてこんなのを考えてみましたが、セキュリティ的にどうなのでしょうか…HttpOnly無視されたらXSSで詰みそう…
同じことやってる人がみつけられなかったのでもしかしたら致命的な欠陥があるのかもしれません。コメント欄で教えていただければ幸いです。
Java文字コード

みなさん文字コードって嫌いですよね。
Java8になってUTF-8がデフォルトになったという話もありましたし、
今更ですが、Javaでの文字コード使用するサンプルを書けたらなと思います。

#どのような時に文字コードを意識しないといけないか
まず、どんな時に文字コードを意識する必要があるのか。
それは、自身のJavaアプリケーション以外からインプットがあったりアウトプットがあるときです。
###インプットの例
サーバクライアントシステムでのクライアントからの入力データ
CSV等の外部ファイル読み込み

###アウトプットの例
サーバクライアントシステムでのサーバからの返却
ファイル書き出し
DB登録

#文字コードを使用する処理
ほかにもたくさんあると思いますが、よく使用するものを紹介します。

##String.getBytes
文字列をバイト形式で取得する関数です。

```java
"TEST".getBytes(StandardCharsets.UTF_8);
```

このように、getBytesの引数に文字コードを指定します。こうすることで文字列「TEST」をUTF-8として解釈し、バイト形式に変換できます。
このgetBytes関数は、引数に何も指定しないこともできます。
その場合は、実行環境でのデフォルトの文字コードが使用されます。
その値を確認したい場合は、以下のコードを実行すると確認できます。

```java
System.out.println(System.getProperty("file.encoding"));
```

デフォルトの文字コードを変更したい場合は、以下のオプションを実行時に指定してください。

```java
-Dfile.encoding=〇〇
```

##Stringのコンストラクタ
Stringのコンストラクタにbyte[]と文字コードを受け取り、指定した文字コードの文字列を取得できます。

```java
byte[] byte1 = "TEST".getBytes(StandardCharsets.UTF_8);
String encorded = new String(byte1, "MS932");
```

このコンストラクタも文字コードを指定しない場合、実行環境でのデフォルトの文字コードが使用されます。

##ファイルの読み込み
ファイルの読み込みにも多くの方法がありますが一つだけ抜粋します。

```java
try {
    BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(""), StandardCharsets.UTF_8);
} catch (IOException e) {
    // TODO 自動生成された catch ブロック
    e.printStackTrace();
}
```

Files.newBufferedReaderで読み込み対象のファイルを指定して、第二引数に文字コードを指定します。
この関数は文字コードの省略が可能で、その場合は、どの環境でもUTF-8となります。（Java8かららしい）
こんな風になっています。

```java
public static BufferedReader newBufferedReader(Path path) throws IOException {
    return newBufferedReader(path, StandardCharsets.UTF_8);
}
```

#最後に
では、本日はここらで終わりたいと思います。
Files.newBufferedReaderはデフォルトがUTF-8、getBytesやStringのコンストラクタは環境によってデフォルト値が変わります。
使用する関数によって、デフォルト値が違うので注意してください。
まぁどんな時でも文字コードは指定すべきだと思いますが。。
UnityのGetCompornentはMonobehavior上には置いてはいけないらしい？

Unity上で何かに力を加えたりするのにRigidbodyを呼び出し、Addforceなどを使用すると思いますが、そこで躓いたので書きます
多分めちゃくちゃ初心者ゆえのミスなんですが、初心者はみんな躓くんじゃないかなと思ったので書きます
**何より私がつまづいて、キレかけたのでかきます！**

#GetCompornentはMonobehaviorに置いたらキレそうになる
私の書いたコードは以下のとおりです

```Unity.cs
public class UniversalGravitation : MonoBehaviour {
    public GameObject rocket;
    Rigidbody rocket_body = rocket.GetComponent<Rigidbody>();
    // Use this for initialization
    void Start () {
    }
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKey(KeyCode.D))
        {
            rocket_body.AddForce(0, 100, 0);
        }
	}
}
```
まあrocketという名前のGameObjectのRigidbodyを取り出して、キーボードの”D"が押されてる間100の力を加えるという意味で書いてます
publicに指定しているrocketに力を加えたいオブジェクトをUnity上で関連付ければ動くはずだと思ったわけです

しかし以下のエラーが出てきました(´・ω・`)

```error
A field initializer cannot reference the nonstatic field,method,or property
```

まあわけわかめですわ(；´∀｀)
で、いくつか読んだ本に書いてたサンプルコードを思い出したわけです
（´-`）.｡oO（あれ？そういえばGetCompornentってStart()上にあった気が
ということで少し書き直しました

```Unity.cs
public class UniversalGravitation : MonoBehaviour {
    public GameObject rocket;
    Rigidbody rocket_body; //←ここを定義だけにした
    // Use this for initialization
    void Start () {
    rocket_body = rocket.GetComponent<Rigidbody>(); //←Start()上で代入した
    }
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKey(KeyCode.D))
        {
            rocket_body.AddForce(0, 100, 0);
        }
	}
}
```

こうしたら、動いた～～
なんかStart()上で書き直したらうまくいきました

##まとめ
原因はわかりませんが、GetCompornetをMonobehavior上に置くとerrorがでて、Start()上に置くとうまくいきました

もしかしたら、Monobehavior上では変数定義だけにして、Start()上で初期化するのがいいのかもしれません(・・;)
たぶん初心者ゆえのわけわかめミスなのですが、プログラムを日常的に触っている人からすると当然でしょ？的な話な気もします
しかし、私がつまづいたのでつまづくかたもいると思ったので書きました
参考になってくれたら嬉しいですし、原因など詳しい話があったらそれも聞いてみたいです

ここまでお読み下さりありがとうございました
Vimでvim-lldbを使えるようにするまでの道のり

※特別な理由がないならneovim+lldb.nvimを使ったほうが絶対いいです。
[neovim + clang + lldbでC++開発環境構築メモ(自動補完、文法チェック、デバッガフロントエンド)](https://qiita.com/grainrigi/items/bd75639085e754795ed4)
どうしてもvimを使わないといけない人向けに一応書いときます。

---

vimでlldbを使いたいな～と思ってプラグインを探してみると、よさげなのがヒットしたので導入しようと思ったら泥沼にはまった。
再導入の時に絶対忘れる気がするので備忘録として導入方法を書いておく。

なお、該当のプラグインはこちら
https://github.com/gilligan/vim-lldb

まずは普通に導入してみる。自分はdeinを使っているので以下の一行を.vimrcに追加した。
```.vimrc
call dein#add('gilligan/vim-lldb')
```

・起動すらしない(g:loaded_lldb = 0)
・has('python') = 0だからダメっぽい
・そういえばUbuntu版vimではpython2は切られていた
・2,3共存させるにはオリジナルビルドを作らないといけないらしい
参考:http://h-miyako.hatenablog.com/entry/2014/11/11/070536
・hg updateで切り替えるとなんかうまくいかなかったので別フォルダへのcheck outを推奨
・pip入れようと思ったらzlibがないといわれる
・zlib1g-dev入れて、Modules/Setupのzlibの行をコメントアウトしてみる
・ビルドしたけど今度はSSLがないらしい
・sslの行もコメントアウト、再ビルドしたらうまくいった
・ビルド完了、起動してみる
・pythonInitで失敗と出る
・import lldbに失敗しているらしい
・lldbというのはLLVM debugger本家のpythonバインディング
・なぜ失敗したかというと、オリジナルビルド版pythonにlldbが入っていなかったから
・python-lldb自体はインスコされているのでPYTHONPATHに追加すればOK
・パスを通して、起動してみるとまたもやエラー
・インタプリタでimport lldbをやってみる
・\_lldbがロードできなかったらしい。なんじゃそりゃ
・soのsym linkが壊れているとかなんとか。
参考:http://stackoverflow.com/questions/30869945/how-to-import-lldb-in-a-python-script
・書いてある通りにやってみる、けどまたエラー(undefined PyUnicodeUCS4_AsUTF8String)
・どうやらpythonをucs4対応でビルドしないといけないらしい。やれやれ。
参考:http://stackoverflow.com/questions/33795982/undefined-symbol-pyunicodeucs4-fromstringandsize-with-tensorflow-on-heroku
・今度はsixモジュールがないそうだ。ここまで来るとなんでもできそうな気がしてくる
・正常にインポートされたようだ。vimを起動してみる
・エラーもなく起動。適当に「:Lshow」とか打ってもコマンドなしにはならないので大丈夫そうだ。

やれやれ。

:Ltargetでコンパイル済みファイルを選択。
ブレークポイント設定は仕掛けたい行で:Lbreakpoint。
実際使ってみると、まずrunが遅い。nextもかなりもっさりしている。
これならvimshellとかでlldb動かしたほうが速いような…
Travisでdistブランチにプッシュするのにハマった事メモ

基本的に下記記事を元に作業したが、コケたのでその補足記事です。
https://torounit.com/blog/2016/01/20/2176/
まずは↑を読んで下さい。

---

とりあえずどこまで成功しててどこで失敗したかは deploy.sh に

~~~
echo '_|＼○_ﾋｬｯ ε=＼＿○ﾉ ﾎｰｳ!!'
~~~

とか書いておけば、Travisの job log 見に行って進行具合を確認できる。

それで、pushでコケてる事がわかった。

## GitHubのトークンが必要

まず、GitHubにプッシュするのだからトークンが必要

https://github.com/settings/tokens

から発行する。

## 発行したトークンとリポジトリで secure を生成

トークンはそのままGitHubに上げるファイルに書くわけにはいかないので暗号化する。

~~~
travis encrypt -r オーナ名/レポジトリ名 "GH_TOKEN=トークン"
~~~

と言いたい所だが、 travisがローカルにインストールされていないと当然コケる。

~~~
gem install travis
~~~

だと色々コケたので、

~~~
sudo gem install travis -n /usr/local/bin/
~~~

にてインストール

そうすれば先程の

~~~
travis encrypt -r オーナ名/レポジトリ名 "GH_TOKEN=トークン"
~~~

を叩けば secure が得られる。
Node.jsとMongoDBのインストールメモ Mac版


##Node.jsインストール

###1. インストーラを使う場合
https://nodejs.org/ja/

公式ページからインストーラーをダウンロードする。
すでに古いバージョンのNode.jsが入っている場合なぜかうまくいかなかったので、
その場合以下のnvmでのインストールを試してほうが良いかもしれないです。

###2. nvmでインストールする場合

nvmをインストール

```
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
```

インストール済みNode.jsのバージョンを表示

```
$ nvm ls
```

インストール可能なNode.jsのバージョンを表示

```
$ nvm ls-remote
```

バージョンを指定してインストール

```
$ nvm install 8.9.1
```

使用するバージョンを切り替える

```
$ nvm use 8.9.1
```

```
$ node -v
v8.9.1
```

## MongoDBインストール

###1. インストール
Macの場合、brewでインストールするのが楽。

```
$ brew update
$ brew install mongodb
```

###2. データ書き込み用ディレクトリ作成
以下に書いてある通り、MongoDBがデータを書き出すディレクトリを作成。
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

```
$ mkdir -p /data/db
```

ディレクトリを作ってからでないと、起動時に
「Failed to connect to 127.0.0.1:27017, reason: errno:61 Connection refused」
のようなエラーが出ました。
ディレクトリに書き込み権限が無い場合もエラーが出るのでその場合はchmodで権限付与してください。

###3. MongoDB Node.js Driverを入れる
Node.jsからMongoDBを使うためには、MongoDB Node.js Driverを入れる必要があります。
以下のようにインストールします。

```
$ sudo npm install mongodb --save
```

###4. MonboDBを起動する
以下コマンドで起動できます。環境構築はこれで終わりです。

```bash:
$ mongod
```

###5. MongoDBを使ってみる
Node.jsからMongoDBを使う前に、MongoDBがどういう物か理解しておくとスムーズです。
以下にまとまっていますので、mongo shellを使って一通りコマンドを実行してみることをお勧めします。
おかげさまでだいぶ理解できました。

[MongoDB超入門](https://qiita.com/saba1024/items/f2ad56f2a3ba7aaf8521)




Node.jsからMongoDBを使う方法はMongoDB driverのドキュメントを見てください。

[MongoDB driver公式](http://mongodb.github.io/node-mongodb-native/2.2/quick-start/quick-start/)

以下もとても参考になりました。
[Node.js+Express+MongoDBでREST APIをつくる](https://qiita.com/itagakishintaro/items/a1519998a91061cbfb1e)
開発用PCにSQL Expressを入れたらmax server memoryを設定しておこう

PC入れ替えた際とかによく忘れるのでメモ
メモリ使用量が妙に多くて変だな、と思ったら高確率でコレだった気がする…

SQL Server Management Studioで以下を実行

```sql:T-SQL
sp_configure 'show advanced options',1 --詳細設定の許可
go
reconfigure
go
sp_configure 'max server memory', 2048 --(MB)
go
reconfigure
go
sp_configure 'show advanced options',0 --元に戻す
go
reconfigure
go
```

※本番環境で忘れる方がもっとダメだけど…インストーラのオプションで設定させて欲しい…

【参考】 [DO’s&DONT’s #12: やった方がいいこと – max server memory を設定する](https://blogs.msdn.microsoft.com/jpsql/2012/02/05/dosdonts-12-max-server-memory/)
raspberry piとAK-020を自動で接続してくれるスクリプトを自動で作ってくれるスクリプト

#raspberry piとAK-020を自動で接続してくれるスクリプトを自動で作ってくれるスクリプト
企業等でIoTをしようとなってラズパイを使う時は複数台セットアップしますが、色々面倒だったので、shスクリプトにしました。
ちなみに2回以上実行したら壊れたりします。
[(Raspbian) AK-020で3Gモデム自動接続(毎回のejectとmodprobeなし)](https://qiita.com/aquahika/items/dc7d8ad8f481414d3528)
の記事を参考にしました。というより、この記事を自動化しました。

#以下のスクリプトで実行できます。
ちなみにsh scriptを書いていたのですが、raspberry piはshスクリプトは/bin/dashにリンクされているらしいです。

```bash:bash
git clone https://github.com/takashiAg/rasp_aka_020 ~/ak020
bash ~/ak020/rasp_aka_020.sh
```

#githubで公開してます。
[github](https://github.com/takashiAg/rasp_aka_020/blob/master/rasp_aka_020.sh)で公開してます。

```sh:setup.sh
#!/bin/bash
sudo apt-get install -y wvdial usb-modeswitch
echo -e '[Dialer Defaults]\nInit1 = ATZ\nInit2 = AT+CFUN=1\nInit3 = AT+CGDCONT=1,"IP","soracom.io"\nDial Attempts = 3\nModem Type = Analog Modem\nDial Command = ATD\nStupid Mode = yes\nBaud = 460800\nNew PPPD = yes\nModem = /dev/modem\nISDN = 0\nAPN = soracom.io\nPhone = *99***1#\nUsername = sora\nPassword = sora\nCarrier Check = no\nAuto DNS = 1\nCheck Def Route = 1\n'|sudo tee /etc/wvdial.conf

echo -e 'noauth\nname wvdial\nusepeerdns\nreplacedefaultroute\n' | sudo tee /etc/ppp/peers/wvdial

cat /lib/udev/rules.d/40-usb_modeswitch.rules |sed -e '$d' |sudo tee /lib/udev/rules.d/40-usb_modeswitch.rules
echo -e "#ABIT AK-020\nATTRS{idVendor}==\"15eb\", ATTRS{idProduct}==\"a403\", RUN+=\"usb_modeswitch '%b/%k'\"\n\nLABEL=\"modeswitch_rules_end\""|sudo tee -a /lib/udev/rules.d/40-usb_modeswitch.rules
#sudo sed '/^LABEL="modeswitch_rules_end"/i #ABIT AK-020\nATTRS{idVendor}==\"15eb\", ATTRS{idProduct}==\"a403\", RUN+=\"usb_modeswitch "%b/%k"\n' /lib/udev/rules.d/40-usb_modeswitch.rules | sudo tee /lib/udev/rules.d/40-usb_modeswitch.rules

#cat /lib/udev/rules.d/40-usb_modeswitch.rules |sed -e '$d'|

echo -e "DefaultVendor = 0x15eb\nDefaultProduct = 0xa403\nTargetVendor = 0x15eb\nTargetProduct = 0x7d0e\nStandardEject = 1" | sudo tee /etc/usb_modeswitch.d/15eb:a403

cat /etc/rc.local |sed -e '$d' |sed -e '$d' |sudo tee /etc/rc.local
echo  -e "sudo modprobe -v option\n\
echo \"15eb 7d0e\" |sudo tee /sys/bus/usb-serial/drivers/option1/new_id\n\
echo waiting for modem device\n\
for i in {1..30}\n\
do\n\
  [ -e /dev/modem ] && break\n\
  echo -n .\n\
  sleep 1\n\
done\n\
[ \$i = 30 ] && ( echo modem not found ; exit 1 )\n\
sleep 3\n\
wvdial > /home/pi/wvdial.log 2>&1 &\n\
exit 0" | sudo tee -a /etc/rc.local

echo -e "ATTRS{../idVendor}==\"15eb\", ATTRS{../idProduct}==\"7d0e\", ATTRS{bNumEndpoints}==\"03\", ATTRS{bInterfaceNumber}==\"02\", SYMLINK+=\"modem\"" | sudo tee /etc/udev/rules.d/10-soracom.rules

echo -n |sudo tee /home/pi/wvdial.log 
sudo chmod +w /home/pi/wvdial.log
```

#最後に
普通に複数台作るときはSDカードをコピーすればよいですね。
なんてこった
DockerfileでCOPYかADDをするときにホスト側は絶対パスだとエラーになる

dockerでホストのディレクトリをコンテナにマウントしようと思ってDockerfile内で

```
COPY /path/to/dir /path/to/dir
```
としてdokcer buildしたら

```
/var/lib/docker/tmp/docker-builderXXXXXXX/path/to/dir no such file or directory
```

と言われてしまった。ADDでも同様の結果に。ADDとCOPYの違いは[こちら](https://qiita.com/hihihiroro/items/0956326d6731bc927166)
どうやらDockerfileでCOPYするときはホスト側のpathはdocker build時に指定したディレクトリからの相対パスで指定する必要があるらしい。逆にコンテナ側は絶対パスで書く必要がある。気をつけましょう。
[メモ]フルパスからファイル名までディレクトリの色々

#状況
ファイル選択時に、選択以外の操作(作成、削除、変更等)を制御したかったため、
フォルダダイアログでフォルダ選択->フォルダ内の指定拡張子ファイル取得->ファイル選択
という手順を踏んでいたら、ディレクトリ操作系をまとめといたら便利だと思った。
#困ったこと
特になし。

#解決？
以下、色んなディレクトリ操作
・フルパスからフォルダ名、ファイル名を取得

    Dim fullpath As String = "C:\test\test.txt"
    Dim filedir As String = System.IO.Path.GetDirectoryName(fullpath)
    Dim filename As String = System.IO.Path.GetFileName(fullpath)

・System.IO.Path名前空間からチョコをもらえなかった人用

    Dim fullpath As String = "C:\test\test.txt"
    Dim find_lastslash As String = fullpath.LastIndexOf("\") + 1
    Dim filedir As String = fullpath.Substring(0, find_lastslash)
    Dim filename As String = fullpath.Substring(find_lastslash, fullpath.Length - find_lastslash)

・フォルダ内の全ファイル名取得(フルパス)

    Dim filedir As String = "C:\test\"
    'Or Dim filedir As String = "C:\test" 
    Dim allfile() As String = System.IO.Directory.GetFiles(filedir)

・フォルダ内の指定拡張子ファイル取得(フルパス)(ex. csv拡張子)

    Dim filedir As String = "C:\test\"
    'Or Dim filedir As String = "C:\test" 
    Dim csvfile() As String = System.IO.Directory.GetFiles(filedir, "*.csv")

・指定フォルダ以下の全ファイル取得(フルパス)

    Dim filedir As String = "C:\test\"
    'Or Dim filedir As String = "C:\test"
    Dim allfile() As String = System.IO.Directory.GetFiles(filedir,"*",System.IO.SearchOption.AllDirectories)

#使用方法
コピペ。
世の中便利なコードはたくさん溢れていることを考えると、
僕のような微妙な立ち位置のプログラマなんていらなくなっちゃうね。
2017.11.15追記
ゴミ箱は扱いが特殊で、Cドライブ直下を参照してC:$Recycle.Binを読み込んじゃうとエラー吐いちゃうと、コメントいただきました。
まだ解決策見つけてないので、見つけたら修正しまうす。

コメントもらえるなんて僕は幸せもんだぁ。

VB.NET用の便利コードは下記。
https://github.com/keuxkeu/useful-codes-for-vb.net
まとめたものを追加していくので、気が向いたらどぞ。
(大体未完成品)
office365のアプリランチャーに任意のアプリを登録する

社内ポータルに使えないかと検証してみた。
webアプリとしてgoogleのリンクを登録してみる。
※Azure ADはAADと略します

#0. やること
①アプリを登録して
②ユーザを割り当てて
③確認する


#1. アプリの登録
AADにアプリを登録する。
登録とは、AAD様が認証認可を連携する相手として認識することである。
※登録＝ランチャー表示ではないことに注意

Azureポータル>AAD>アプリの登録>新しいアプリケーションの登録
<img src ="https://qiita-image-store.s3.amazonaws.com/0/183242/8a60e3e5-e022-765e-cf1f-4c53219f3963.jpeg" width=50%>

名前：google(任意のアプリ名）
アプリケーションの種類：Webアプリ/API
サインオンURL：https://www.google.co.jp/
[作成]をクリック
<img src ="https://qiita-image-store.s3.amazonaws.com/0/183242/8ae60d61-9165-dfac-9662-a1db80d9da2e.jpeg" width=50%>

これでAAD様にアプリをご認識いただける。

#2. ユーザの追加
このアプリを使える人を設定する。
メニュー>エンタープライズアプリケーション
<img src ="https://qiita-image-store.s3.amazonaws.com/0/183242/8ff59e78-268b-5077-4c26-c8af99440607.jpeg" width=50%>

すべてのアプリケーション>google
<img src ="https://qiita-image-store.s3.amazonaws.com/0/183242/1b8df64d-c942-3271-8f01-d13e625d5f09.jpeg" width=50%>

ユーザとグループ>ユーザーの追加
<img src ="https://qiita-image-store.s3.amazonaws.com/0/183242/6911a953-fbc1-dce4-78dc-af8b790859b5.jpeg" width=50%>

ユーザーとグループ>好きなのを選択
<img src ="https://qiita-image-store.s3.amazonaws.com/0/183242/2c4a3e0d-ef35-06c1-f6d4-6f4437eb887f.jpeg" width=50%>

#3. 確認
割り当てたユーザーで365にログイン。
すべてのアプリで確認する。見れた。
<img src ="https://qiita-image-store.s3.amazonaws.com/0/183242/97672f4c-609c-675c-2fae-6214aeecc4b8.jpeg" width=50%>



#4. わかったこと
・ランチャー表示可能なのはWebのみ
・nativeは起動後の認証連携のみ
・MS的にはユーザじゃなくてユーザー


#99. 感想
・webとnativeが混在する世界でのランチャーのベストプラクティスとは
・AADからスタートメニューが制御できればいいのに
・いい感じの画像キャプチャツールあったら教えて下さい
・次はSAML連携してみたい
[AzureADの割り当てと表示が紛らわしい]
(https://qiita.com/surume07/items/0d3e74ee357847267cec)
AWSでPythonを使用したLambdaを作ってみる

# 今回のお題
とりあえずAWSのLambdaでPythonが動くことを確認します。

# サービス作成
## AWSにログインし、サービスからLambdaを選択 > 関数の作成を押下します。
![Lambda.png](https://qiita-image-store.s3.amazonaws.com/0/204329/6ef6a686-0642-9a47-a43b-1534b4622ff1.png)

## 一から作成を押下します。
![２.png](https://qiita-image-store.s3.amazonaws.com/0/204329/4285472e-3a87-2ddd-86b8-8bd181b4cccc.png)

## 基本的な情報を入力
名前はとりあえずlambda_python_testと入力。
ロールについては、一先ず既存のロールを選択し、関数の作成を押下。
<img width="1006" alt="スクリーンショット 2017-11-14 22.11.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/b0f87319-b5b0-392c-1156-2de5c4dcc89b.png">

## 関数ができました
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3230343332392f36633632326435662d656162662d323234632d386332372d6261633939393965343334632e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/204329/3ae585ec-36ea-34c9-9278-6a239c765848.png)


## ランタイムでPython 2.7を選択する
ランタイムを変えると、デフォルトのハンドラが設定され、簡単な内容の処理が記載されます。
<img width="982" alt="スクリーンショット 2017-11-14 22.14.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/6f0d68e2-d25a-50ea-5bb2-98ad1588c51f.png">

## 画面上部の保存してテストを押下します。
<img width="1008" alt="スクリーンショット 2017-11-14 22.15.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/425d2cdd-54c2-d1a0-7627-29c92b37abe3.png">

## 使用するパラメータを設定する。
今回は特にパラメータを使用しませんが、空だとエラーになるので適当にJSON形式を入力して作成ボタンを押下します。
<img width="814" alt="スクリーンショット 2017-11-14 22.18.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/56a163b0-6389-2f2c-dff7-cdb8c21aedc0.png">

## テストを押下してみる
元の画面に戻るので、テストボタンを押下する
<img width="601" alt="スクリーンショット 2017-11-14 22.19.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/29f039ce-9372-fc64-5b69-e4cc431a42f0.png">

## 結果がログに出力される
デフォルトで設定されているreturnの値が表示されました。とりあえず、pythonが動きました。
<img width="1001" alt="スクリーンショット 2017-11-14 22.20.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/204329/56c37e3e-95f8-c620-ddfb-cc2467d32fff.png">
Gitで過去のコミットをやり直す

`git rebase`を使う

##修正したいコミットのIDを確認

```
git log
```

##修正したいコミットを指定
修正したいコミットの一個前のコミットIDを指定する
そして少し待つ

```
git rebase -i <commit>
```

`-i`は`--interactive`の略で、対話的にリベースする

##修正したいコミットを`edit`に変更
以下のように指定したコミットより後のコミットが表示される


```
pick gh21f6d ヘッダー修正
pick 193054e ファイル追加
pick 84gha0d README修正
```

`pick`の部分を`edit`に変える

```
edit gh21f6d ヘッダー修正
pick 193054e ファイル追加
pick 84gha0d README修正
```
保存は`ctl + x`の後、yes/noを聞かれるので`Y`を押してエンター

##ファイルを修正
タイトルだけ変えたい場合はここでは何もしない

##修正を反映

```
git commit --amend
```

##`rebase`を実行

```
git rebase --continue
```
こんな感じの文章が出てくる

```
$ git rebase --continue
Successfully rebased and updated refs/heads/refactoring.
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
error: The last gc run reported the following. Please correct the root cause
and remove .git/gc.log.
Automatic cleanup will not be performed until the file is removed.

warning: There are too many unreachable loose objects; run 'git prune' to remove them.
```

(参考)
https://www.backlog.jp/git-guide/reference/log.html
VBAでクリップボードに画像を送る（手抜き版）

今時.NET、そしてPowerShellの動かないWindows PCはそうそう無いだろうということで、PowerShellを使って何とかする。


```vbnet:VBAでクリップボードに画像を送る
Sub ClipImage(ByVal imagePath As String)
    Const PS_PARAMS$ = "PowerShell.exe -NoProfile -Sta -WindowStyle Hidden ", _
          EXEC_CMD1$ = " -Command Add-Type -AssemblyName System.Windows.Forms,System.Drawing;[System.Windows.Forms.Clipboard]::SetImage([System.Drawing.Bitmap]'"
    Call VBA.Shell(PS_PARAMS & EXEC_CMD1 & imagePath & "')")
End Sub
```

```vbnet:使用イメージ
Call ClipImage("C:\hoge.png")
```

```ps1:PowerShellでやっていること
# 必要なアセンブリロード
Add-Type -AssemblyName System.Windows.Forms,System.Drawing
# クリップボードに画像を送る
[System.Windows.Forms.Clipboard]::SetImage( #
    # 文字列を[System.Drawing.Bitmap]にキャストしようとすると
    # [System.Drawing.Bitmap]::FromFile 相当の処理がPowerShellから呼ばれる。
    [System.Drawing.Bitmap]' ここに引数のimagePathが埋め込まれる '
)
```

見ての通りエラー処理、不正な文字列の検知などを一切行っていないので
使用は自己責任でお願いします。

なお、ExcelやPowerPointなどの文書ベースのOfficeなら画像を形状として文書内に取り込めるため
画像を挿入してCopyメソッド使った方が早いと思われます。

```vbnet:参考PowerPoint版
Sub ClipImagePpt(ByVal imagePath As String)
    Const ppLayoutBlank& = 12, msoFalse& = 0, msoTrue& = -1
    With VBA.CreateObject("PowerPoint.Application")
        With .Presentations.Add
            With .Slides
                If .Count = 0 Then Call .Add(1, ppLayoutBlank)
                .Item(1).Shapes.AddPicture(imagePath, msoFalse, msoTrue, 0, 0).Copy
            End With '.Slides
            .Saved = msoTrue
            .Close
        End With '.Presentations.Add
    End With 'VBA.CreateObject("PowerPoint.Application")
End Sub
```
BoxファイルをVagrant Cloudにアップロードして環境の共有

ちょこちょこ詰まったので覚え書き程度に。
## boxの出力

```
$ vagrant package
```

## Vagrant Cloudアカウント作成
- vagrant cloud ( https://app.vagrantup.com ) にアカウントを作成。
- 新しいboxを作成（名前だけでOK）
- versionを作成（同上）

## Boxファイルのアップロード
- add a providerを選択
- providerを選択（たぶんvitualboxでおｋ）
- Boxファイルをアップロード
- Box画面のreleaseボタンをクリック

## vagrantfileに記述してinit

```
$ vagrant init username/boxname
```

## 詰まったところ
- The box you're attempting to add dosen't support the probider...
    - Providerは間違ってないか（vagrantのデフォルトはvirtualbox）
    - releaseボタンを押しているか（押してないと使えない）
Jupyter Notebook の恐るべきmagicコマンド

Jupyter Notebook のmagicコマンドには
%%file <hogehoge.py>  
(これはセルのスクリプトをファイルに落とす)
や
%load <hogehoge.py>
(セルにスクリプトを読み込む)
があり、とっても便利だと思っていたが、
%rep <cell number>
(一度評価したセルを呼び出して、新規セルを生成)
には驚いた。よく考え込まれている。
セルの連続範囲を指定したら、期待通りのことが
起こった。連続範囲のセルがまとまって、直下のセルが生成された。
試していないが、不連続なセル範囲も行けるんとちゃうだろうか。
まさにmagicという名に相応しいコマンド群である。感服つかまつった。
ES6時代の巻き上げ（hoisting）

JavaScriptの直感的に理解しづらい挙動として、巻き上げ（hoisting）があります。しかも、ES6で加わった`const`や`let`は、従来と一味違った挙動を示します。

# ES5での巻き上げ

ES5で宣言できるものとして、`var`による変数の宣言と、`function`による関数宣言がありますが、この2つは巻き上げで挙動が違ってきます。

## `var`

`var`は関数スコープですが、**変数宣言だけ**関数トップにあるものとして処理され、初期値の代入は元の位置で実行されます。

```js:varの巻き上げの例
// 区別のために、同じ変数を外側でも宣言

var i = 7;

function foo(){
  // var i; はここにあるのと同じ扱いに

  console.log(i); // undefined
  
  var i = 'hello';
  console.log(i); // hello
}

console.log(i); // 7

foo();
```

## `function`

`function`で書き始める**関数宣言**の場合、スコープの中ならどこでも呼ぶことができます。`var`のような「名前だけあって`undefined`」ということにはなりません。もちろん、`var f = function(){...};`のような関数式の場合は、代入より前に呼ぶことはできません。

```js:functionの巻き上げ
function test(){
  inner1(); // 呼べる
  inner2(); // 呼べない
  
  function inner1(){
    console.log('inner1');
  }
  var inner2 = function(){
    console.log('inner2');
  };
}
```

# ES6では

ES6でも、従来の`var`や`function`の挙動は変わりませんが、新しく加わった`let`や`const`は挙動が違ってきます（なお、どちらもスコープに関する挙動は同じです）。

これらはよく「巻き上げがない」と言われますが、（それを巻き上げと呼ぶかどうかは別として）宣言前の同一スコープにも影響します。では、先程の`var`の例を`let`にしてみましょう。

```js:varをletにしただけ
// 外側はvarでもletでも同じだけど、気分的に
let i = 7;

function foo(){

  console.log(i); // さあ、どうなる？
  
  let i = 'hello';
  console.log(i); // hello
}

console.log(i); // 7

foo();
```

「さあ、どうなる？」の部分は、`let`の宣言が上に影響しないなら、外側の7になると思うかもしれませんが、実際には**`ReferenceError`**となってしまいます。このように、代入前に`let`や`const`の変数をアクセスして`ReferenceError`となるのは、Temporal Dead Zoneと呼ばれます（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_と_let_に関するエラー)）。なお、本来エラーになるものだからか、Babelで正確にコンパイルされないこともあるようなので、お気をつけください。

あと、あくまで`ReferenceError`となるかは「代入と参照のコードの実行タイミング」によるもので、「コードの記載位置」とは**別物**です。少し前に @raccy さんの[記事](https://qiita.com/raccy/items/aac3b8e3981564bbd1fa#comment-add77d3f131e5421190c)でのやり取りで知った話ですが、

```js
const f = () => {
  console.log("call f");
  g(); // 後から定義する関数を書いても問題が無い。
};
const g = () => {
  console.log("call g");
};
// main
f(); // 最後に実行する。
```

のように、あとから定義される変数を参照しても、宣言が実行されてからしか呼ばれない関数の中にあるのであれば、特に問題はありません。逆に、`function()`の巻き上げを使うなどして、`const`より下に書いた関数を`const`の実行前に呼べば`ReferenceError`となります。
ディスクイメージのサイズを大きくする

# この記事は
ラズパイのSDイメージを弄っていたら、もとのイメージの空き領域が足りなくなったときのためのTipsです。
といっても、ほぼ先人の記事の[ディスクイメージのサイズを大きくする。ここでは3GB増やしてみる。](http://d.hatena.ne.jp/sayounaraarigatou/20091210/1260452679)の焼き直しです（sayounaraarigatouさん、ありがとうございます！）。


## 手順
not_enough.imgのrootfsパーティションを1GiB増やして、enough.imgを作ります。

```
# 空イメージファイルの作成
$ truncate -s 1GiB empty.img

# イメージファイルの結合
$ cat not_enough.img empty.img > enough.img

# 空きループバックデバイスの確認
$ losetup -f
/dev/loop0

$ sudo losetup /dev/loop0 enough.img

# ループバックデバイスの設定状況の確認
$ losetup -a
/dev/loop0: []: (enough.img)

# パーティションテーブルの確認
$ sudo fdisk -lu /dev/loop0
Disk /dev/loop0: 2.9 GiB, 3054501888 bytes, 5965824 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd8cd040f

デバイス     起動  Start 最後から セクタ  Size Id タイプ
/dev/loop0p1        2048   133119  131072   64M  c W95 FAT32 (LBA)
/dev/loop0p2      133120  5965823 5832704  2.8G 83 Linux


# パーティション設定
$ sudo fdisk  /dev/loop0

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ): d
パーティション番号 (1,2, default 2): 2

Partition 2 has been deleted.

コマンド (m でヘルプ): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (2-4, default 2): 2
First sector (133120-5965823, default 133120): 
Last sector, +sectors or +size{K,M,G,T,P} (133120-5965823, default 5965823): 

Created a new partition 2 of type 'Linux' and of size 2.8 GiB.

コマンド (m でヘルプ): t
パーティション番号 (1,2, default 2): 2
Partition type (type L to list all types): 83

Changed type of partition 'Linux' to 'Linux'.

コマンド (m でヘルプ): p
Disk /dev/loop0: 2.9 GiB, 3054501888 bytes, 5965824 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd8cd040f

デバイス     起動  Start 最後から セクタ  Size Id タイプ
/dev/loop0p1        2048   133119  131072   64M  c W95 FAT32 (LBA)
/dev/loop0p2      133120  5965823 5832704  2.8G 83 Linux

コマンド (m でヘルプ): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: 無効な引数です

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).


# ループバックデバイスの削除
$ sudo losetup -d /dev/loop0

# マウントして確認するとまだ増えていない
$ sudo mount -o loop,offset=68157440 enough.img work/mnt
$ df
/dev/loop0                    1805620    1789236          0 100% work/mnt

# resize2fsで増える
$ sudo resize2fs /dev/loop0
$ df
/dev/loop0                    2838548    1789236     901532  67% work/mnt

```

## 参考ページ
- [ディスクイメージのサイズを大きくする。ここでは3GB増やしてみる。](http://d.hatena.ne.jp/sayounaraarigatou/20091210/1260452679)
- [Linuxでrawディスクのimageファイルを扱うあれこれ（空ファイル作成、パーティション作成、マウントなど）](http://vorfee.hatenablog.jp/entry/2016/01/16/170654)
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part 3-3,4,5

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part3-3 facebook登録のレイアウトを整える

#自己課題
- facebookログインのテキストに"btn btn-facebook"classを追加。
- cssを追加。
- navbarの変更。facebookでログインしているとき,画像と名前が表示、それ以外の時はemailが表示されるようにせよ。

#part3-4 プロフィールページの作成
プロフールを表示するために新たなページを作らないといけない。

##routes.rbに「resources :user」と追記。
すると、

    user_index GET      /users(.:format)                         users#index
               POST     /users(.:format)                         users#create
      new_user GET      /users/new(.:format)                     users#new
     edit_user GET      /users/:id/edit(.:format)                users#edit
          user GET      /users/:id(.:format)                     users#show
               PATCH    /users/:id(.:format)                     users#update
               PUT      /users/:id(.:format)                     users#update
               DELETE   /users/:id(.:format)                     users#destroy

が追加される。

    resources :users, only: [:show]
（users　複数形に注意）
とすると、userのshowアクションのみが生成される。

    user GET      /user/:id(.:format)                     user#show

ちなみに、ここへのパスは「user_path(current_user)」になる。:idとあるので一人一人分けないといけない。

##新しいページを作りたいと思ったら。

routes->controller->viewを作る流れじゃ。

#自己課題
- navbar上のログアウトの上にプロフィールへのリンクを作成。
- プロフィールを追加したいため、routesにuser　resourcesを追加。使用するのは、showだけ。
- navbarにリンクを追加。
- userコントローラーファイルを作成。
- viewを作成。

#part3-5 プロフィールページ

##facebookの画像を大きくするには？
配布されたshow.html.erbを写す。

すると、画像が荒いのが表示される。自分の場合はfacebookログインが実装できなかったのでエラーが表示。

[ここ](https://stackoverflow.com/questions/10532425/get-user-profile-large-picture-from-facebook-with-omniauth-in-devise-2-0)見れば解決。

##文字列の中に変数を入れる時。
      user.image = "http://graph.facebook.com/#{auth.uid}/picture?type=large"

　#{---}の中に入れる。

##cssについて

    .profile-full {
      width: 30%;
    }

    @media (min-width: 992px){
     .profile-full {
        width: 100%;
        }    
    }  
992px以上の時は、要素の中で１００％、それより小さい時は３０％の大きさで表示。 

#自己課題
-　show.html.erbを写す。
-　画像がない時の処理を追記。
-　cssを写す。
Babel6系でextendsしたクラスにinstanceofを使う方法

### 確認したバージョン
babel-core v6.26.0
babel-plugin-transform-builtin-extend v1.1.2 

## babel6系でコンパイルするとinstanceofが正しく効かない
```js
class CustomError extends Error {};

console.log(new CustomError() instanceof Error);       // true
console.log(new CustomError() instanceof CustomError); // false!!!
```

### 原因
英語ダメなので詳しく読めてないですが、6系のバグの様です。
https://github.com/babel/babel/issues/3083

## 回避方法
### 1.prototype上書き
```js
class CustomError extends Error {};
CustomError.prototype = Error.prototype; // ここ！

console.log(new CustomError() instanceof Error);       // true
console.log(new CustomError() instanceof CustomError); // true♪
```
※色々試してみたのですが、なぜこれで直るのかまでは追えませんでした、、、教えて偉い人！

### 2.プラグインを入れる
[babel-plugin-transform-builtin-extend](https://www.npmjs.com/package/babel-plugin-transform-builtin-extend)
.babelrc

```json
{
    "plugins": [
        ["babel-plugin-transform-builtin-extend", {
            globals: ["Error", "Array"]
        }]
    ]
}
```

## まとめ
- babel6系で、extendsしたクラスにinstanceofをかけても正しく動かない
- 上記の回避方法を2つ紹介
- 個人的には方法1で[対象のissue](https://github.com/babel/babel/issues/3083)のリンクを貼るのを採用

## 参考リンク
- [対象のissue](https://github.com/babel/babel/issues/3083)
- [MDN instanceof](https://developer.mozilla.org/ja/docs/JavaScript/Reference/Operators/instanceof)
- [図で理解するJavaScriptのプロトタイプチェーン](https://qiita.com/howdy39/items/35729490b024ca295d6c)
- [prototypeと\_\_proto__](http://please-sleep.cou929.nu/20100929.html)

## 余談
babelのバグなので、chromeで直接実行すると意図通りに動くことを確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5514/e8408577-35ef-820b-1a7e-42c07904c2e9.png)
golang.tokyo #10 sessionメモ

# はじめに
[golang.tokyo #10 x WomenWhoGoTokyo](https://golangtokyo.connpass.com/event/70162/)の参加メモです。

# セッション
## テキスト審査 in Pairs 
- 不正ユーザー（業者）防止のためテキスト審査をする必要がある背景
- ワードフィルタ = 形態素解析による単語一致
- 形態素解析は[kagome](https://github.com/ikawaha/kagome)を利用
- 部分一致によるスコアリング
    - 単語に対して点数をつけて閾値を越えるとNGと判定される
    - 「FとX」など怪しい言葉も対応
- ワードフィルタリングは機械学習との併用、現在はエンジニアがチューニングを受け持っている。
- deeplearningでやるには失敗ケースが少ないため、データをためていくことが必要。


## interfaceとの付き合い方
- しっかりとした型付け言語のため柔軟な取り扱いが難しい印象を最初受ける。
- json.Marshalでinterface型を引数に取れる。
- [empty interface](https://tour.golang.org/methods/14)


## メルカリカウルのマスタデータ更新
- @tenntenn さん
- google app engineを採用
- サービス性質
    - 製品のカタログ情報を持つ、外部のデータを利用
    - 毎日バッチで更新
    - Cloud SQL（MySQL）にて管理
    - サイズの大きいtsv形式のファイルを想定
    - Google Cloud Storageに保存 -> Google App Engineのcronジョブ

### 課題
- ファイル分割
    - URL Fetchの制限があるため、ファイルの分割処理が必要
    - Task Queueは並列処理のため更新順番に決まりがない
    - 冪等性の担保

- 文字コード変換

### 対策
- 分割方法
    - 固定長で分割
    - 1レコードの最大サイズ+バッファで分割
    - 改行をまたぐことを想定して、同じ箇所を少しかぶるように分割

- 文字コード変換
    - [golang - encoding japanese](https://godoc.org/golang.org/x/text/encoding/japanese)
    - Transformer実装（難易度高）
        - 出力・入力で長さが違う可能性
        - バッファのサイズが足りないかも
        - EOFが来るかも
        

       
## rubyエンジニアがgoでウェブアプリを書いてみた
- @hoshitocat さん
- 広告集計API
- GunocyのAPIは、micro framework: kamiが多い
- gracefulにする必要がある
- [FileListner](https://golang.org/pkg/net/#FileListener)
- [einhorn](https://github.com/stripe/einhorn)

## 高精度の名寄せシステムを高速で動作させる
- @dproject21 さん
- reflect PKGは遅い
- protocolBuffer, MessagePKGとかにしたほうがいい
- golangでの正規表現も遅い
    - unicodeパッケージが活躍

- githubからライブラリ選定時はrune対応しているかどうかをチェックする
- stringsパッケージでruneに対応していない、必要であれば内製する。
TERASOLUNA5.x(=SpringMVC+MyBatis)のJUnitテストの概要


## 1. はじめに

今回はTERASOLUNA5.x（=SpringMVC+MyBatis）アプリにおけるJUnitテストの概要について、自社の研修にて説明している内容を紹介したいと思います。
TEASOLUNA5.xの各コンポーネントを対象にテストを行います。各コンポーネントの説明については「[５分で分かるTERASOLUNA5.x ！](https://qiita.com/5zm/items/4bdcd22074963d5ecc74)」を参照ください。

**（前提と方針および注意事項）**

* 今回説明するテスト方法は、コンポーネントを結合しているが、全て「単体テスト」と呼ぶこととする。必要であれば各自のPJの定義に従って読み替えること。
* 可能な限り、実際に動作させる環境に合わせることとする。
* ソースコードだけでなく、設定（コンフィグレーション）も検証対象とする。
* 可能な限りモックは利用せず、末端のコンポーネントからテストしつつ結合する積み上げ方式とする。


**（再掲）各コンポーネントとデータと処理の流れ**
<img src="https://qiita-image-store.s3.amazonaws.com/0/195748/ea113904-e6b0-bd08-1a07-dd7cf73c799e.jpeg" width="100%">

**各コンポーネントと単体テストの対象範囲**
<img src="https://qiita-image-store.s3.amazonaws.com/0/195748/9fc045c4-eba4-ee3a-c85c-e00ae1eee152.jpeg" width="100%">

## 2. 単体テスト①（オプション）
* RepositoryインターフェースとMapperファイルの動作確認を行うための単体テスト
* 実際にMapperファイルを読み込んでDBアクセスを行うため、Mapperファイルの内容についても検証可能
* MapperファイルやSQLの内容が複雑な場合に実施する

## 3. 単体テスト②（必須）
* Serviceを実行し、関連するドメイン層のコンポーネントを実際に動かして動作確認を行う単体テスト
* 業務ロジックはドメイン層に記述するため、業務ロジックのテストという意味で単体テスト②は必ず実施すべきである
* トランザクション境界はServiceのメソッドのため、トランザクションについても確認可能である

## 4. 単体テスト③（条件に応じて）
* FormとValidationの動作確認を行うための単体テスト
* 独自のValidationを実装した場合に実施する
* Formの入力チェック仕様を、JUnitのテストとして効率的に確認したい場合にも利用する

## 5. 単体テスト④（オプション）
* mockmvcを利用し、アプリケーションサーバにデプロイすることなく、SpringMVCのアプリケーションの動作を再現して行う単体テスト
* アプリケーション層およびドメイン層のコンポーネントを実際に動かして動作確認を行うため、デプロイした状態とほぼ同様の環境を実現することができる
* Tiles、JSPを利用したビューについてはレンダリングが行われないため、mockmvcのテストでも対象外となる
* JSONでデータをやり取りするいわゆるRESTful Web Serviceの場合、mockmvcでレスポンスのJSONも検証することができる

## 6. さいごに

今回はTERASOLUNA5.x（=SpringMVC+MyBatis）アプリにおけるJUnitテストの概要について説明しました。
実際のJUnitテストの実装方法についてはこれから記事にしていく予定ですが、ここでは、ほとんどのコンポーネントをJUnitのテストとして実装できることを覚えてもらえれば十分です。
JUnitのテストであればいつでも[コマンド一つで簡単に実行できる](https://qiita.com/5zm/items/80464aa3698bb660bf5b)ため、できるだけJUnitテストでテストできるようにしていきましょう。
Database for AI - Grakn.aiことはじめ part 1 - エンジニアマインドでいじれるグラフDB

##はじめに
会社ではチャットボットの担当で、現在はアーキテクチャを念頭に置きつつも各ピース（ソリューション等）を評価している。色々試していると、どの技術もどのプラットフォームも方向性が似たり寄ったりで、かつボットを「賢く」するという点にはあまり注力していない。結局インテリジェンスはバックエンドサービスから来るもので、それはボットの責任範疇では無い、といってしまえばそれまでかも知れないけど。

データサービスはともかく、オペレーションやプロセスをボットでやろうとすると既存技術では案外上手く嵌らないことが多い。業務フローはルールエンジンやフローになるだろうし、条件の判定にはリレーショナルなデータストアへのクエリが合ってるし、じゃあどちらにもあてはまらないロジック的なものはどうしよう？となって構成が随分煩雑になってしまう。特にボットの様にユーザーのコンテキストがころころ変わったり（「いいや、やっぱやめて医療系の商品が知りたい」）、エンジンを跨いだコンテキストが出てきたり（「ところでさっき選んだ商品の年齢上限は？」）、雑多なコンテキスト管理をコントローラーで管理すると煩雑になりダイアログを追えなくなる。やっぱり柔軟で、ある程度何でも入れれるような「賢い箱」が欲しい。何かないものか…

という経緯で、グラフデータベース、中でも[Grakn.ai](https://grakn.ai)というエンジンを試してみることになった。

##Grakn.aiとは
Grakn.aiはHaikal Pribadiさんが2015に開発したグラフデータベースで、オープンソースとして公開されている（[GitHub](https://github.com/graknlabs/grakn))。ライセンスはGPL-3.0。開発母体はGraken Labs。データ構造はグラフモデルだが、普通（？）のグラフデータベースとは趣向がやや異なる。

「Database for AI」というコピーが付いているが、今はAIと付けていれば注目されるというのもあるので大目に見てやって欲しい。
####特徴
1. データ層の上にオントロジー層を定義出来る。
2. エンティティに継承が適用できる。（Customer extends Person的な）
3. リレーションが1対1ではなく、複数定義出来る。（Marriage: husband / wife / priest / ring的な）
4. 既存のリレーションから、暗に関連性を定義出来る。（country-state-cityの場合cityはcountryに属する、的な）

グラフというとセマンティックウェブのような集合知をグラフ化したものを想像しがちだが、Grakn.aiはそれとは異なる。あくまでデータストアであり、制約を駆使する事によって未知の関連性を導き出すことが（可能）というのが正しい。あらゆるタイプのメタデータを一元管理出来るというも本来の趣旨からは外れるが、メタデータをリレーショナルでは無い形で（しかもオブジェクト指向っぽく）モデリング出来るのって結構使える。

この1が結構キモで、これまでドメイン毎にグラフ設計にはそれなりの専門知識を要していたが、オブジェクト指向的な発想でモデリング出来る。（Grakn.aiの人も、「これはグラフ的に考えない方がいい」と言っていた。）実際には継承はあってもアグリゲーション/コンポジションの概念が無いのでモデリングの方法は異なる。振る舞いの概念も希薄なのでインターフェースの定義も無い。ただ「発想」は近くて、まずはエンティティの定義を継承の概念からするというのが正で、この段階である程度Inference（演繹）の当たりを付けながらモデリングしていく。

2と4を上手く組み合わせてオントロジーを構築すると、明示的に定義していない関連性が導かれる。まぁ平たく言うとこれが「ナレッジ」（Inference）とよばれるGrakn.aiの強みである。グラフ理論にはInference Graphというこの発想をメインに据えた概念もあるが、Grakn.aiは違う。あくまで「グラフをエンジニアリング出来る」というのが売り。

####システム構成
- Jetty / Groovy / Akka / Antlr / Jackson / etc.
- TinkerPop
- Cassandra
- Redis
- Kafka (0.17でコアから削除）
- Zookeeper（0.17でコアから削除）

基本的にJavaで書かれており、生データへのアクセスはTinkerPopに依存している。その下のデータ層が変わってもTinkerPopを載せ替える事はまずないだろうとの事。但しまだ0.xの状態であり、かつリファクタリングを超えたアーキテクチャ変更も結構頻繁になされているで先は不明。
####環境
全てのライブラリを含んだzipとして公開されている。（当然自分でビルドも可）基本的に展開してシェルを叩けば動かすことが出来る点はお手軽。サポート環境はMax OSとLinux。Windowsでは残念ながら動かないが、何とかしようかと検討中との事。起動時にはCassandra、Redis起動後にGraknを起動させるが、設定を変更させて既存Cassandraへの展開も（もちろん）可能。

ただしJAVA_HOMEは設定する必要あり。またJava 8のみサポートされている。（Java 9 はCassandraがサポートしていないので動かない。）
##次回
使える環境がWindowsしかないので、まずはAzureにLinuxのVMを立ち上げて設定、その後テストデータを読み込んでグラフを愛でるところまでをカバーしようと思う。
Macの内蔵のApacheにPHPのバージョンを切り替えて適用する


以前使ったコマンドが残っていたので、備忘録して記事にします。
PHPを`5.5` <=> `7.0`のバージョン切り替えて、Mac OSXの内蔵のApacheに適用した例です。
もう少し色々あったと思いますが、思い出したら更新します。


```Terminal
// PHP5.5
$ln -nfs /usr/local/bin/Cellar/php55/5.5.38/bin/php /usr/local/bin/php
// PHP7.0
$ln -nfs /usr/local/php5-7.0.14-20170114-204712/bin/php /usr/local/bin/php
```

```Terminal
$ ls -lt /etc/apache2/
total 216
-rw-r--r-- 1 root wheel 20905 Feb 4 21:48 httpd.conf
drwxr-xr-x 4 root wheel 136 Feb 4 21:01 other
drwxr-xr-x 35 root wheel 1190 Oct 6 11:50 extra
drwxr-xr-x 5 root wheel 170 Oct 6 11:49 users
-rw-r--r-- 1 root wheel 20867 Sep 7 16:50 httpd.conf~previous
-rw-r--r-- 1 root wheel 1338 Sep 7 16:12 server.crt
-rw-r--r-- 1 root wheel 887 Sep 7 16:12 server.key
-rw-r--r-- 1 root wheel 13077 Aug 9 08:35 magic
-rw-r--r-- 1 root wheel 53262 Aug 9 08:35 mime.types
drwxr-xr-x 4 root wheel 136 Aug 9 08:35 original
-rw-r--r-- 1 root wheel 20785 Jul 1 2015 httpd.conf.pre-update
```

```Terminal
$ ls -lt /etc/apache2/other/
total 8
lrwxr-xr-x 1 root wheel 32 Feb 4 21:01 +php-osx.conf -> /usr/local/php5/entropy-php.conf
-r--r--r-- 1 root wheel 194 Aug 9 08:35 php5.conf
```

## 関連リンク
* [Mac内蔵のApacheのPHPのバージョンを変更する](https://qiita.com/SRAUFactory/items/2589ed9c72684ab0af7d)
* [Mac内蔵のApacheにシステム環境変数を反映する](https://qiita.com/SRAUFactory/items/7222c20d36b5b81d497b)
ASP.NET > aspcore2 > Windows Server にてAPS.NET Core2 アプリケーションをホストする

# APS.NET Core2 アプリケーションをホストする

Visual Studioで ASP>NET Core webアプリを作成し、Windows ServerのIISで動かす事をめざします。

## VisalStudioでアプリを作成
VisalStudioからAngularテンプレートを使ってアプリを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/bd89aa51-d873-97d0-c6af-06f1cb9ce746.png)

ちなみにIE11で動作可能にするにはcore-jsをpackage.jsonに設定する必要があります。
https://github.com/aspnet/JavaScriptServices/wiki/Supporting-Internet-Explorer-11-(or-older)



## 最初のデプロイ

VisalStudioからAngularテンプレートを使って作成したアプリを、Windows ServerのIISに置きました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/edd3a59d-65cf-ed3d-b22b-36977bb8b212.png)

あぁ無情です。何のエラーなのかさっぱり分かりません。


## Windows Serverでの環境構築

### .NET Core実行環境の作成
.NET CoreのWindows Server Hosting (.exe) をダウンロード
https://www.microsoft.com/net/download/windows
インストールを実行します。（要OS再起動）

### 再度アクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/2f70d442-4bbc-d714-3723-1a4cfd10dc26.png)

画面が変わりましたがエラーが表示されてしまいました。
しかしひとまずasp.net coreは動いているようです。

```
Error.
An error occurred while processing your request.

Development Mode

Swapping to Development environment will display more detailed information about the error that occurred.

Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application.

Most likely because I had the environment variable ASPNETCORE_ENVIRONMENT set to Development as seen in Figure 2.
```

↓この辺とかを参考にしましたが原因がよく分からず。
https://blogs.msdn.microsoft.com/benjaminperkins/2017/06/21/asp-net-core-with-entity-framework-core-aspnetcore_environment/

ASPNETCORE_ENVIRONMENT=Developmentになってるからこの画面が表示されているのでは？と解釈して試行錯誤するも原因掴めず。


よくよく内容を見てみると、エラーが起きているから、ASPNETCORE_ENVIRONMENT=Developmentにしてから確かめなさい。という意味でした。

ということで、web.configのaspNetCoreに以下の設定を追加

```
<aspNetCore processPath="dotnet" arguments=".\MarketingMetric.Web.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" >
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
  </environmentVariables>
</aspNetCore>

```

再度実行

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/ac84678e-f0c2-1310-4e53-6ca273a8e80e.png)

エラー内容が詳細に表示されました。
どうやらWindows Serverにnode.js環境が無い事が原因のようです。


### Node.jsのインストール

ここを参考にさせていただきインストール
https://qiita.com/ksh-fthr/items/fc8b015a066a36a40dc2

nodistとnode.jsをインストールする
core2でangularテンプレートを実行するにはnode.jsがサーバーに必用な模様


## 再度実行

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49910/0234043f-37df-6636-9361-97af8d25bf88.png)

OSを再起動した後に無事にasp.net coreアプリケーションが実行できました。
開発未経験者がWEBエンジニアを目指す-2

#本日やったこと
・Progate HTML&CSS 中級編 (よりモダンなWEBサイトを作る)
→要素の透過、文字間隔、ボタン部分を作る(インライン/ブロック/インラインブロック/display)、複数クラスの指定

・PHP学習編Ⅰで学んだことの演習(合計金額/最高価格の算出)

##学んだこと
・background-size: cover;  画像の大きさが拡大縮小
・margin: auto;の設定の際はwidthも指定すること
・インライン要素とブロック要素の特徴を併せ持つインラインブロック要素について
・半角スペースで区切って複数のクラスの指定ができること

###ぼやき
・だんだんWEBサイトが形になってくると、デザインの要素も多く含まれてくるなと感じてきた。
・インライン要素は不便な点が多く実際現場で使われているのか。
・classで複数指定できるが、何個も指定できるっぽい。
→おそらく何番目のクラスの文字は何色にするみたいな設定がある気がする。
・PHPの金額の算出は、パズルみたいで考えるのが楽しい。
→いざコードを書こうとするとどこに何を書けば良いのかわからなくなってしまう。
・楽しい！!

他の方の記事を読んでいると、とても勉強になります。
どんどん吸収して、知って行くぞ〜
コマンドの結果が空でもエビデンスを取る方法

# コマンドの結果が空でもエビデンスを取る方法

## 概要

- タスクをチケットのWikiに落としたり、実行手順を書く際
- 空であることをエビデンスとして残すのがずっと気にかかっていた
- 下記の様な期待値を捏造することが必要だった

```
$ grep -r foo ./bar
# 結果がないこと
```

## 問題点

- #を使うことでコメントの様にも見えるが、root権限でコマンドを実行している様にも見えてしまう
- また、`# 結果がないこと` という文言がcliでの実行結果を反映していない

## 解決策

- 実行結果をwcコマンドに食わせる

```
$ grep foo ./bar | wc -l
       0
```

## 備考

- Before/After は確認しましょう
PostgreSQL のログイン時にパスワードを省略する方法

PostgreSQLのデータベースにログインするときにいちいちパスワードを入力するのが面倒なのでやってみたメモ

# 環境
|OS・ミドルウェア|バージョン|
|:----------|:----------|
|OS|CentOS release 6.7 (Final)|
|PostgreSQL|9.2.24|

# 手順
```shell-session
## .pgpassファイルを作成
# vi .pgpass

## 次の内容を記載
<DBサーバのホスト名>:<DBサーバのポート>:<データベース名>:<ユーザ名>:<パスワード>

# 記載したら保存する

## 権限を以下のコマンドで変更する
# chmod 600 .pgpass
```
CSSのみで縦横比固定の要素をウインドウサイズいっぱいに表示する

ウインドウサイズによらず縦横比固定で表示したいケースがある。
JavaScriptを使う方法もあるが、CSSのみで実現する。

# コード例（縦横比 16:9）
```html
<div class="content"></div>
```

```css
body {
  margin: 0;
}

.content {
  background-color: green;
  height: 56.25vw;
  width: 177.78vh;
  max-height: 100vh;
  max-width: 100vw;
  position: absolute;
  margin: auto;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}
```
[Demo(JSFiddle)](https://jsfiddle.net/tux2pwxe/)

# ポイント
- <code>height</code>を<code>vw</code>、<code>width</code>を<code>vh</code>で指定することにより縦横比を固定
    - 上の16:9の例では、<code>height</code>は（9 / 16 * 100 = 56.25）、<code>width</code>は（16 / 9 * 100 ≒ 177.78）
- <code>max-height</code>と<code>max-width</code>を指定し、画面外に要素がはみ出さないようにする
- <code>position</code>を<code>absolute</code>、<code>margin</code>を<code>auto</code>にし、4つの配置位置をそれぞれ0にすることで、画面中央に配置する
Skype for Business トラブルシューティング

[Office 365 Skype for Business Online DNS 構成に関する問題のトラブルシューティング](https://support.microsoft.com/ja-jp/help/2566790/troubleshooting-skype-for-business-online-dns-configuration-issues-in)

[Announcing Microsoft Support and Recovery Assistant for Office 365](https://www.testconnectivity.microsoft.com/)

[Skype for Business Online ユーザーがモバイル デバイスで Lync 2010モバイル クライアントにサインインしようとすると、"サーバーに接続できません" というエラー メッセージが表示される](https://support.microsoft.com/ja-jp/help/2636329/-cannot-connect-to-the-server-error-message-when-skype-for-business-on)

[Apple iOS で Lync 2010 モバイル クライアントを使用する際に発生する問題をトラブルシューティングする方法]
(https://support.microsoft.com/ja-jp/help/2636320/how-to-troubleshoot-issues-that-you-may-encounter-when-you-use-the-lyn)