OmniAICreator/Qiita-1.07M huggingface dataset:
React始めました〜④TypeScriptで書いててつまづいた点

# 前書き
だいぶサボってしまいましたorz
最近はReactはおろか、時間があってもYouTubeをテキトーに見て過ごしてしまっています。。。
そろそろ、もう一度気合いを入れ直し頑張っていこうと思います（いつまで続くか分かりませんが。。。）

Reactの方は前述の通り、まるっきり触っていないんですが実は最近、仕事の方でTypeScriptを使っています。
そのおかげでようやくTypeScriptに慣れてきた感じです。

やはり独学でやるのと違い、出来る方のコードをすぐ見れるのと触れている時間が多いのでこれは覚えるなー
とか思っています。

**「そんなんどーでもええわっ！」**

って訳で、以前にReact + TypeScriptで書いててつまづいた点を備忘録としてまとめていきたいと思います。

# props、stateを使うにはインターフェースが必要
これ、超基礎的なことかもしれませんが。。。React＆TypeScript初心者にはしんどかったです
「どーせ、TypeScriptって言っても普通のJavaScriptでも動くんでしょ？簡単じゃん？」
的な感覚で普通のjsxの記法で見よう見まねで書いたらエラー！ってなって焦りました。

TypeScriptでは以下のように書く必要があるみたいです。

```TypeScript
import * as React from 'react';

interface Props {
  hoge: string;
}
interface State {
  foo: string;
}
class Item extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      foo: ''
    }
   }
  render() {
/* 省略 */
```

# react-addons-css-transition-groupを使う場合は型定義ファイルを書き換える
Reactのアニメーションアドオン'react-transition-group'というものがあると知り、
使ってみようと思ったらつまづきました。

```
npm install react-addons-css-transition-group @types/react-addons-css-transition-group
```

まず、アドオンをインストールし。。。

```TypeScript
import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
```

こんな感じでインポートし、実行したら。。。

```
error TS1192: Module '"my-app/node_modules/@types/react-addons-css-transition-group/index"' has no default export.
```

ピギィィィィィ！

どうやら、`node_modules/@types/react-addons-css-transition-group/index.d.ts`の最後を

```TypeScript
// export = ReactCSSTransitionGroup; // ←変更前
/* ↓変更↓ */
export default ReactCSSTransitionGroup; // 変更後
```

に書き変えればエラーが消えるみたいです。

# Reactコンポーネントの型はJSX.Element
こちらはつまづいたというより、気になったので調べた部分です。

「Reactコンポーネントを変数に入れたり、配列に入れたりする際の型ってなんだろ？
anyでいけそうだけどそれって最終手段だよなー」
って思ったのがきっかけで調べました。

```TypeScript
import Hoge from './Hoge';
const hoge: JSX.Element = <Hoge foo='enjoy' />;
```

こんな風に書くみたいです。

# まとめ
とりあえず少し触ってつまづいた点は以上になります。
もっとゴリゴリ書いてReactマスターになりたいなーとは思っていますが、なかなか出来ないでいますorz
まぁ、そもそも普通のJavaScriptが怪しいのでそっからなんですが。。。
というわけで、いつまで続くか分かりませんがモチベーションの続く限り頑張っていこうと思います笑
Drupal8　メールアドレス項目を必須チェックにする

デフォルトでユーザー追加画面のメールアドレス項目が必須チェックになっていないから、必須チェックに変更します。

今回はhook関数の[hook_form_alter](https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Form!form.api.php/function/hook_form_alter/8.2.x)を使ってフォームを変更します。


モジュールファイルで以下のように使用してみました。

```php:mymodule.module
<?php

use \Drupal\Core\Form\FormStateInterface;

function mymodule_form_alter(&$form, FormStateInterface $form_state, $form_id) {
    if ($form_id !== 'user_register_form') {
        return;
    }

    // ユーザー追加画面の項目「メールアドレス」を必須チェックに変更
    $form['account']['mail']['#required'] = TRUE;
}

```

まず、最初の処理のif文でユーザー追加画面以外は必須チェック適応しないように対応してます。

drupal8のデフォルトでは`$form['account']['mail']['#required']`は`FALSE`なので、
`TRUE`を入れて上書きすることでメールアドレス項目が必須チェックなります。

今回使用した`hook_form_alter`は、各画面のフォーム項目のカスタマイズが色々できそうです。

以上
C の翻訳限界

C の規格にはコンパイラの実装の都合のため、コンパイラーが最低限これ以上はサポートしなければならないという制限があります。
特に ANSI-C (C89) は制限が厳しいので、現代的なプログラミングをすると簡単に限度に達してしまう可能性があります。移植性に拘る人は気をつけましょう。特に #include の入れ子の数などは気付かずに超えてしまいます。

| 項目  |  C89 | C99 |
|:-----|--:|--:|
|ブロックの入れ子のレベル数|15|127|
|条件付き取込みにおける入れ子のレベル数|8|63|
|一つの宣言中の一つの算術型，構造体型，共用体型又は不完全型を修飾するポインタ，配列及び関数宣言子（の任意の組合せ）の個数|12|12|
|一つの完結宣言子における括弧で囲まれた宣言子の入れ子のレベル数|31|63|
|一つの完結式における括弧で囲まれた式の入れ子のレベル数|32|63|
|内部識別子又はマクロ名において意味がある先頭の文字数|31|63|
|外部識別子において意味がある先頭の文字数|6|31|
|一つの翻訳単位中における外部識別子数|511|4095|
|一つのブロックで宣言されるブロック有効範囲をもつ識別子数|127|511|
|一つの前処理翻訳単位中で同時に定義されるマクロ識別子数|1024|4095|
|一つの関数定義における仮引数の個数|31|127|
|一つの関数呼出しにおける実引数の個数|31|127|
|一つのマクロ定義における仮引数の個数|31|127|
|一つのマクロ呼出しにおける実引数の個数|31|127|
|一つの論理ソース行における文字数|509|4095|
|（連結後の）単純文字列リテラル又はワイド文字列リテラル中における文字数|509|4095|
|（ホスト環境の場合）一つのオブジェクトのバイト数|32767|65535|
|#include で取り込まれるファイルの入れ子のレベル数|8|15|
|一つの switch 文（入れ子になった switch 文を除く）中における case ラベルの個数|257|1023|
|一つの構造体又は共用体のメンバ数|127|1023|
|一つの列挙体における列挙定数の個数|127|1023|
|一つのメンバ宣言並びにおける構造体又は共用体定義の入れ子のレベル数|15|63|
|atexit() によって登録される関数|32|32|

JIS 5.2.4.1 翻訳限界 より抜粋
Fortranプログラムでterminalのコマンドを使う方法

今回はFortranからterminalのコマンドを使う方法を紹介したいと思います。
Fortranを使っているとフォルダ（ディレクトリ）の作成やlsコマンド、rmコマンドなどを使いたい場合があります。この他にもpythonやC言語などのスクリプトやプログラムがあれば、それを動かすこともできます。例では「lsコマンド」を用いたものにします。

```Fortran:test.f90
program test
 implicit none
 call system("ls")
end program test
```
上記のプログラムファイルを作成し、terminalで

```bash:
gfortran test.f90
./a.out
```
とします。
これで、自分の作業ディレクトリ内のファイルが表示されています。
とても簡単です。
characterを組み合わせることで、rmを行うsubroutineも自分で作成できます。
jsのProxyを利用した状態管理ツールを試してみた

# 目的
~~flux使わずに、~~ 楽に状態管理がしたい！
ES2015の[Proxy](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy)を使ったツールで、そろそろ良さそうな出ているのでは・・！

と思って4日ほど調べてみました。


# 調査結果

https://github.com/franciscop/state
property単位の監視が簡単　書いてて楽しい
だけど、observeが解除できなくて、componentのunmount時に困った

https://github.com/sindresorhus/on-change
ソースコードが非常に短いので、覚えることが最も少なく、楽に書ける
だけど、callback設定が初回１回しかできなくて、component間での共有に困った

https://github.com/dobjs/dob
これも直感的に書けて楽、observeの解除もあるし。
observable object以下のarray/objectが自動的にproxyになるので、その扱いに戸惑ったけど、そういうものらしい。
Actionという定義を使うと、複数propertyの変更があっても、triggerは１回になる。
後述するobserver-utilを改良したもの、っぽい。

https://github.com/mweststrate/immer
説明長いしfluxっぽくて面倒そう

https://github.com/nx-js/observer-util
基本的にはdobと同じ、構文が微妙に違ったり、機能差分がある。


# 調査を終えて
自分はriotユーザー(hyperHTMLへの移行は検討中)なため、覚えるコストが低く、乗り換えやすいものを探していました。
ただ実際に使ってみると、困る点が出てくるもので、正直はまってしまった感があります。
reactユーザーだと、それ専用のmoduleが用意されていたりするので、もう少し苦労しなかったかも。

また何年かすると、より良いものが出ているんだろうなと思います。
その時に機会があれば、また書きます。

そんな感じでしたー
Rails用のAtomの拡張機能を書いた話


2018/02/21追記

* path.sepを使用して（恐らく）Windowsでも動作するようにしました。

--- 

動作環境

* Atom 1.24 
* Mac OS Sierra

見習いのykpythemindです。エディタはAtom→Vim→VSCode(+VSCodeVim)という変遷をしていて、今はAtom + vim-mode-plus拡張に落ち着きました。AtomかわいいよAtom… 
ゴリゴリのVimmerではないんですが、vimのキーバインド好きで拡張入れてます。ネイティブのVimはシンタックスハイライトがもっさりしていたり、vimgrepでつまづいてしまったりしたので僕にはこの構成が１番いいんです… 

（余談ですが先日Atom Beta 1.25がリリースされ、内部のElectronがアップデートされたのでIMEのウィンドウの表示位置がおかしくなるバグがようやくなくなり、快適になりました）

ふと思い立って拡張機能を書いてみました（パッケージではないです）

## タブを開いた時にRailsのViewファイルの名前で混乱する 

<img width="953" alt="スクリーンショット 2018-02-20 22.32.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/180624/374a38ef-bb75-67a9-5ee1-5238c53389d0.png">

僕は掃除できない/整理できない人間なのでいつの間にかこんな感じになってアレ、、これどのコントローラのビューだっけ？(index.html.hamlが２つある・・・） としょっちゅうなっていました。

ということで、Viewのファイル(拡張子が.haml)を開いたらフォルダ名もまで表示するようにしました。 

<img width="948" alt="スクリーンショット 2018-02-20 22.44.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/180624/527f92f1-8038-22bd-20fd-475b941b9139.png">

片方はShowsControllerのindex.html.hamlで、もう一方はUsersControllerのindex.html.hamlであることが一目で分かるのでそこそこ良くなったのではないでしょうか…？ アイコンで分かるので拡張子も除いています。


## init.js 

Atomは ~/.atom以下の init.jsを起動時に実行します。 (init.coffeeも用意されていますが存在していればどちらも読みにいってくれるようです。）

もしinit.jsがなければ作成し、以下をコピペで動きます 

```init.js
'use babel';

const setTabTitle = () => {
  const tabs = atom.views.getView(atom.workspace).querySelectorAll('.vertical li.tab .title');

  Array.from(tabs, (tab) => {
    if (tab.innerText.match(/\.(haml|erb)/)) {
      tab.innerText = tab.dataset.path.split(path.sep).slice(-2).join('/').replace(/\.html\.(haml|erb)/, '');
    }
  });
};

atom.workspace.onDidChangeActiveTextEditor(() => {
  setTabTitle();
});

atom.workspace.onDidOpen(() => {
  setTabTitle();
});

atom.workspace.onDidDestroyPaneItem(() => {
  setTabTitle();
});

```

`querySelectorAll('.vertical li.tab .title');`ですべてのタブの要素を取得します (もっといいやりかたありそう…）
要素のdata-path属性にファイルのフルパスが入っているのでフォルダ名とファイル名を抜き出し、ついでに余分な拡張子部分を削除してからタブのinnerTextにセットします。
タブを選択しなおしたりファイルを開いたりする時にDOMが更新されタブの書き換えた部分が戻ってしまうのでいくつかコールバックを設定しています。
haml派ですがなんとなくerbも対応しました

もっといいやりかたがある気しかしないですがこんな感じで実現できました。
まずい点や改良点があったら教えてくださると嬉しいです。

Atom、かわいいな〜

## 所感

* init.jsに簡単な処理を書けるのですごく便利・・・ (.vimrc的な？？)
  * http://flight-manual.atom.io/hacking-atom/sections/the-init-file/
* もっとタブを整理して使うとか、 [zentabs](https://atom.io/packages/zentabs) みたいなタブ数を制限する拡張を入れるという方法でそもそものタブ多くなりすぎ問題を解決していきたい


### 備考

* [querySelectorAllで帰ってきたNodeListを外部ライブラリを使わずにforEachしたい](https://qiita.com/yugo-yamamoto/items/b87470f118ac62dc6a8d)
emacs+fcitxで日本語入力ができない

# 現象
archlinux + fcitx-mozcで、emacsだけ日本語入力できない問題に遭遇しました。
locale周りや.xprofileを設定してもダメです。

# 原因
適切なフォントがインストールされていないためでした。
単に日本語フォントをインストールするだけではダメで、``` -*-*-*-r-normal--14-*-*-*-*-*-*-*```の形式にマッチするフォントがないとXIMが有効にならないようです。

xlsfontsで確認してみると確かにマッチするフォントを入れてませんでした。

```shell
sudo pacman -S xorg-xlsfonts
xlsfonts *normal*
# xlsfonts: pattern "*normal*" unmatched
```

# 解決方法
とりあえず```terminus-font```を入れたら日本語入力できるようになりました。
ちなみに日本語フォントは```adobe-source-han-sans-jp-fonts```を使ってます。

# 参考サイト
https://wiki.archlinux.jp/index.php/Fcitx#Emacs
PyinstallerでOpenCVとPyQt5をEXE化する(Windows編)

##はじめに
PyQtとOpenCVを使って動画解析のアプリを作って欲しいと言われたけど、肝心の使う人がTerminalって何ですか？という感じ。。 
Python,Anacondaなんて当然しらない。。
ということでpythonをEXE化しよう！！と思ったけど大変でした。


Windowsで上手くいった、Anacondaを使った環境構築の手順を書きます。

##Anaconda環境構築
`$ conda create -n py36 python=3.6`
`$ activate py36`
完了です。pythonは3.6でなくても3.5でもその後の環境構築は上手くいきました。

##モジュールインストール
`$ pip install pypiwin32`
`$ pip install pyinstaller`
`$ pip install opencv-python`
`$ pip install pyqt5`

##PyQt5とOpenCVで動画読み込むアプリ作る
ここは各々作ってください。

##PyinstallerでEXE化
`pyinstaller 変換ファイル名.py --onefile --debug --clean`
エラーなく実行できた！
しかし。。。OpenCVのVideoCaptureで死んでるではないか orz..
いろいろ検索しているとopencv_ffmpeg*_*.dllが必要だとわかった。
ということで、Opencv公式(https://github.com/opencv/opencv/releases/)
からexeファイルをダウンロードして、実行してopencv_ffmpeg340\_64.dllを探す。それをPyinstallerでexe化しているファイルがあるdistフォルダに突っ込む！
その状態でexeファイルを実行すると上手く行きました。

##ffmpeg.dllが邪魔、一つにしたい
今のままでも実行できて良いですが、せっかくならffmpeg.dllもまとめてone file化したいです。[こちらのスタック・オーバーフロー](https://ja.stackoverflow.com/questions/30125/anaconda%E3%81%A7pandas%E3%82%92%E4%BD%BF%E3%81%86%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92pyinstaller%E3%81%A7exe%E5%8C%96%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84)を参考にしました。
`変換ファイル名.spec`を以下のように書き換えます。

```変換ファイル名.spec
# -*- mode: python -*-

block_cipher = None

def get_opencv_path():
    import cv2
    opencv_path = cv2.__path__[0]
    return opencv_path

a = Analysis(['変換ファイル名.py'],
     pathex=['C:\\path-to-ディレクトリ'],
     binaries=None,
     datas=[('C:\\~path-to-ffmpeg~\\opencv_ffmpeg340_64.dll','.')],
     hiddenimports=[],
     hookspath=[],
     runtime_hooks=[],
     excludes=[],
     win_no_prefer_redirects=False,
     win_private_assemblies=False,
     cipher=block_cipher)

dict_tree = Tree(get_opencv_path(), prefix='cv2', excludes=["*.pyc"])
a.datas += dict_tree
a.binaries = filter(lambda x: 'cv2' not in x[0], a.binaries)



pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
exe = EXE(pyz,
      a.scripts,
      a.binaries,
      a.zipfiles,
      a.datas,
      name='変換ファイル名',
      debug=False,
      strip=False,
      upx=True,
      console=True )
```
上記のようにffmpegのファイルパスを指定して、specファイルを修正したあとは

`pyinstaller 変換ファイル名.spec --onefile`

これでexeファイルだけになります。
CodableでCamelCase⇄SnakeCaseの変換を行う（keyDecodingStrategy/keyEncodingStrategy）

##はじめに
Xcode9.3からデフォルトのSwift versionが4.0から4.1へと上がります。
いくつかの改善点がありますが、Codable周りで役立ちそうな改善がありましたので、
メモがてら共有いたします。

__以下の記載は2/20時点のβ版の情報にもとづき作成しています。__
__fix版リリース時には変更になる可能性がありますのでご注意下さい。__

##CamelCaseとSnakeCase
iOSでは一般的にプロパティの名称にCamelCaseを使用することが多いかと思います。
例えば下記のような構造体の定義です。

```swift:Struct定義
struct Person: Codable {
    let firstName: String
    let lastName: String
    let age: String
    let gender: String
}
```

ただ、一方でサーバの通信APIのレスポンスでは下記のようなSnakeCaseが用いられることがあります。

```swift:通信レスポンス例
{
  "first_name": "Tetsuya",
  "last_name": "Hayashi",
  "age": "30",
  "gender": "male"
}
```

このような通信レスポンスを上記で定義した Codableを適用したStructでパースしようとした場合、
このままではfirstNameとfirst_nameで名称が異なるためパースができません。
このような場合は、PersonをSnakeCaseで書くか、以下のようなCodingKeyを別途定義する必要がありました。プロパティの数が少ない場合はまだ良いですが、毎回CodingKeyを定義するのも冗長な気がします。

```swift:CondingKeySample
struct Person: Codable {
    let firstName: String
    let lastName: String
    let age: String
    let gender: String

    private enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
        case lastName = "last_name"
        case age
        case gender
    }
}
```

Swift4.1からはこの問題を解決するプロパティがJSONDecoder/JSONEncoderに追加されました。

##keyDecodingStrategy/keyEncodingStrategyについて
`JSONDecoder`にkeyDecodingStrategy、`JSONEncoder`にkeyEncodingStrategyプロパティが追加されています。これらのプロパティを設定することで、 CamelCase⇄SnakeCaseの変換を簡単に行うことができます。
例えば、先ほどのjsonを構造体のPersonにパースする場合は下記のようになります。
CodingKeysが必要なくなり、随分すっきりしました。

```swift:JSONDecoder

let personJson = """
{
  "first_name": "Tetsuya",
  "last_name": "Hayashi",
  "age": "30",
  "gender": "male"
}
""".data(using: .utf8)!

let jsonDecoder = JSONDecoder()
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase // ここでsnakeCaseからの変換を指定

do {
    let person = try jsonDecoder.decode(Person.self, from: personJson)
    print(person)
} catch {
    print(error.localizedDescription)
}
```

逆にEncodingの際に、CamelCaseをSnakeCaseに変換することも可能です。

```swift:JSONEncoder
let person = Person(firstName: "Tetsuya", lastName: "Hayashi", age: "30", gender: "male")

let jsonEncoder = JSONEncoder()
jsonEncoder.keyEncodingStrategy = .convertToSnakeCase // ここでsnakeCaseへの変換を指定
do {
    let json = try jsonEncoder.encode(person)
    print(json)
} catch {
    print(error.localizedDescription)
}
```

##所感
Codableが登場した際はとても便利になったと驚きましたが、さらに改善されていきますね。
コードを書くのがより楽しくなりそうです。

##備考
本日、公開後にNDAに抵触するのではないかと考え、記事を削除いたしました。しかしながら、1:一般の方がアクセスできる公式ドキュメントに具体的な使用例も含み記載があること、2:Swiftはオープンソースであり、誰しもがアクセスできることから本記事記載の内容はNDAに抵触しないだろうと判断し、再度投稿を行なっています。
おそらく大丈夫だろうという考えでいますが、違反している可能性もありますので、その場合はご指摘いただけますと幸いです。確認の上、削除の検討をいたします。

##参考資料
* [公式Document - JSONDecoder.KeyDecodingStrategy](https://developer.apple.com/documentation/foundation/jsondecoder.keydecodingstrategy)
* [公式Document - JSONEncoder.KeyEncodingStrategy](https://developer.apple.com/documentation/foundation/jsonencoder.keyencodingstrategy)
* [GitHub JSONEncoder.swift](https://github.com/apple/swift/blob/master/stdlib/public/SDK/Foundation/JSONEncoder.swift)
* [[swift-evolution] JSONEncoder: Key strategies](https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20171106/040959.html)
PHPでガチャ

以前隔週でガチャを実装することを何年かやっていたときのことを思い出したので基本的な考え方をまとめておきます。

隔週リリースみたいなもので当時は毎回どきどきしながらリリースしていました。基本的に排出率設定等は別ファイルに持たせておいてエンジニアでなくても編集できるようにしておくのが良いと思います。（エンジニアの責任逃れ的な意味で？）

# ガチャロジック

（当時を思い出しながら記載してみます。）

ランダムを取得する方法としては`shuffle`、`rand`、`mt_rand`（古い`rand`の代替品）等がありますがPHP7から精度の高いらしい`random_int`が追加されたのでそれを使ってみます。

排出率はスクフェスを参考にしてみます。

```
UR: 1%
SSR: 4%
SR: 15%
R: 80%
```

```php
$weight_list = [
    'UR' => 1,
    'SSR' => 4,
    'SR' => 15,
    'R' => 80,
];

$result_number = random_int(1, array_sum($weight_list));// 1~100

$total_weight = 0;
foreach ($weight_list as $name => $weight)
{
    $total_weight += $weight;
    if ($result_number <= $total_weight)
    {
        $result = $name;
        break;
    }
}

var_dump($result);
```

# 余談

Aパーセント中のBパーセントみたいになことですが、
レアリティの中でアイテムやカード毎に重みづけされている場合はさらにレアリティ毎のガチャを引けば良いと思います。

実運用となると誰でも編集可能なようにcsvやjson等でそれぞれのアイテムの排出率を記載しておき、実装の際にアイテムやカードのIDがキーになるように配列を作り、排出率を整数値になるようにロジック側で調整して実装する感じかと思います。

例）
アイテムID:1001の出現率が0.0003ならば

```php
$weight_list = [
    1001 => 3
]

random_int(1, 10000);
```

みたいなイメージで1001が当たったらそれを付与するといった感じです。
MongoDB 3.2+WiredTigerでもメモリ使用量を抑えたい！ (Debian 9)

MongoDB 3系からWiredTigerが選べるようになり，メモリ使用量が制限できるようになりました．
[storage.wiredTiger.engineConfig.cacheSizeGB](https://docs.mongodb.com/v3.4/reference/configuration-options/#storage.wiredTiger.engineConfig.cacheSizeGB) オプションで指定できます．

## MongoDB 3.4以降は最低256MB

MongoDB 3.4以降，設定下限が256MBに下がりました．

> Changed in version 3.4: Values can range from 256MB to 10TB and can be a float.
> (訳: 3.4での変更: 値は256MB～10TBまでのfloat(小数)で指定可能です)
> [Configuration File Options — MongoDB Manual 3.4 #storage.wiredTiger.engineConfig.cacheSizeGB](https://docs.mongodb.com/v3.4/reference/configuration-options/#storage.wiredTiger.engineConfig.cacheSizeGB)

## MongoDB 3.2までは最低1GB

しかし，MongoDB 3.2までは，設定下限は1GBです．0.5とかを指定しても起動しません．
VPSサーバで運用しようとすると，なかなかつらいところがあります．

> by default, will use the larger of either:
> 
> * 60% of RAM minus 1 GB, or
> * 1 GB.
> 
> (訳: デフォルトでは，総メモリの60%から1GB引いた容量か，1GBのどちらか大きい方になります)
> [Configuration File Options — MongoDB Manual 3.2 #storage.wiredTiger.engineConfig.cacheSizeGB](https://docs.mongodb.com/v3.2/reference/configuration-options/#storage.wiredTiger.engineConfig.cacheSizeGB)

## 抜け道

しかし抜け道があります．```configString```に指定できるというものです．

> Ramon Fernandez added a comment - Jan 28 2016 01:45:21 PM GMT+0000
> Jeroen Vijfhuizen, this works for me, please give it a try:
> 
> ```
> storage:
>  wiredTiger:
>   engineConfig:
>     configString : cache_size=345M
> ```
> 
> (意訳: これでうまくいったから試してみて)
> [[SERVER-22274] WiredTiger cache size is only configurable in whole gigabytes. - MongoDB](https://jira.mongodb.org/browse/SERVER-22274)

### 試した

```/etc/mongodb.conf``` (Debian 9)で，```cache_size=128M```としてドキュメントをInsertしまくってみました．

```
$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mongodb   3339  2.8 10.1 549896 207776 ?       Ssl   2月17 135:26 /usr/bin/mongod --unixSocketPrefix=/run/mongodb --config /etc/mongodb.conf
```

以前は1GBまで膨らんでいましたが，今回は200MB程度に抑えられています．うまくいったようです！

## おわりに

Debian 9 (Stretch)でもMongoDB 3.4以降が使えたら良かったのですが，
執筆時点で[stretchのリポジトリに入っているのがMongoDB 3.2](https://packages.debian.org/stretch/mongodb)で，[MongoDB公式はまだDebian 8止まり](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/)（[JIRAを見るとそろそろ出そうな感じはする](https://jira.mongodb.org/browse/SERVER-29463)）という状態で，MongoDB 3.2でなんとかする方法を模索したのでした．
安易な気持ちで `as? Int ?? 0` みたいなコードを書いてはいけません（戒め

※タイトル通り、「安易な」気持ちで書いてはいけないのであって、「書くな」ではありません。

Swift は型制約が非常に強く、そして意図しなかった `nil` によるクラッシュの回避のために Optional というものも導入されていることは、Swift 開発してるみなさんはご存じでしょう。

そして、開発している際に、なるべく `nil` を回避したいので、Optional をなるべく使わないようにするのもよくあるでしょう。

それゆえ、どうしても Optional のアンラップをしなくてはならないことがあります。例えばサーバから受け取ったデータのキャストなど、プログラム内部で完結していないデータを処理する時。その場合、サーバからデータを受け取ったら、必要に応じて型変換したりする必要が出てきますね。

では、とりあえず何も考えずに `as? Int ?? 0` と書けばいいのですか？

サーバが本当に Int のデータをそのまま返してくる保証はどこにあるのか？

Obj-C の時代は、`.intValue` とか書いとけば、ランタイムがいろいろよしなりにやってくれますが、Swift はそううまくいきません。String のデータで返してくるかもしれないし、もしかすると小数で返して来るかもしれません。

例えば小数で返ってきたとします。そんな時は当然 `as? Int` でキャストしようとしても `nil` になってしまいます。でもとりあえず何かしら返ってきてます。それなのにデフォルト値の `?? 0` の方がセットされてしまいます。

**バグです。**

`!` は使いたくない。その気持ちはわかります。なんか危険な匂いするし、もし本当に万が一サーバが何かしらのバグが発生して本当に何も返ってこなかったり数字じゃないものが返ってきた時、アプリ側の問題じゃないのに落ちて評判下がるし。

でも落ち着いて考えてほしい。あなたが「この方がサーババグってもアプリ落ちないし安全w」とかいう安易な気持ちで書いてしまった `?? 0` が、逆にバグの発覚を遅らせてるだけでリリース前に気づけたはずのバグをリリースに持ち込んでしまう危険性があるのです。

**じゃあどうすればいいか**

Debug ビルドだけ落とすコードを書くのです。そうすればもしアプリ側に問題があれば Debug ビルドですぐに気づくし、仮にもし万が一本当にサーバがバグったとしても一般ユーザが使っている Release ビルドに致命的なクラッシュを食らわずに済むのです。

例えばこんな感じです：

```swift
as? Int ?? {
    assertionFailure("Int に落とし込めませんでした")
    return 0
}()
```

`assertionFailure(String)` を呼び出すことで、Debug ビルドだけここで落ちてしまいますが、Release ビルドはこのコードコンパイルされないのでスルーされます。

もちろん、`as? Int` だけではありません、他の大体の `nil` じゃないものがくるはずだけど、コード上どうしても Optional の戻り値を返すメソッドを使うしかない場合でもこれは有効です。具体的に言うと、アプリ開発者としてこの条件は保証されているはずだと外部（主にサーバサイド）から伝えられているけど、アプリ側としてはそうじゃなかった時にどうしようもない、でもどうにか Release ビルドのクラッシュだけは避けたいし避ける術もある時はこの手が使えます。

さらに踏み込んだエラー処理の話は是非 Koher さんの [Swiftのエラー4分類が素晴らしすぎるのでみんなに知ってほしい](https://qiita.com/koher/items/a7a12e7e18d2bb7d8c77)と言う記事を読んでほしいです。

※※※
> ？？？「そもそもアプリが数字もらったのに `Int` に落とし込めなかったのをすぐに発見できなかったのはテスト書かなかったせいなのでは？」
はい、全くもってその通りでございます。
N個外の括弧内の中身を切り取る

知らなかったのでメモ。
次のような3階層の式(カッコが3重)があったとする。
カーソルが一番内側に合った時に一番外側のカッコの中身を切り取るには、
ノーマルモードで`c3i)`とする。コピーは`y3i)`となる。

```golang
result := ( ( 1 + ( 1 + 2 ) ) * 3 )
                    ^
                  カーソル
```

一般にN個外側のカッコの中身を切り取りたいときは`c`や`y`などのオペレータの後に`N`を入力するだけでよい。
スクロールすると水彩風に文字がランダムで出てくるタイトル【自分用メモ】

# サンプル
<p data-height="405" data-theme-id="dark" data-slug-hash="bLvLRR" data-default-tab="result" data-user="minami_watanabe" data-embed-version="2" data-pen-title="bLvLRR" class="codepen">See the Pen <a href="https://codepen.io/minami_watanabe/pen/bLvLRR/">bLvLRR</a> by minami watanabe (<a href="https://codepen.io/minami_watanabe">@minami_watanabe</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

# コード解説メモ
## HTML
一つ一つスパンで囲んでやります。

```html
<div class="box">
  <h1 class="title">
    <span>坊</span><!--
 --><span>つ</span><!--
 --><span>ち</span><!--
 --><span>や</span><!--
 --><span>ん</span>
  </h1>
</div>
```
## JS
スクロールイベントをつけてあげます

```js

SCROLL_EVENT = {
    DELAY_VALUE: 100, //スクロールして表示する時の判定の余裕。大きいほど上の方までスクロールしてから表示される

    init:function(){
        this.setParameters();
        this.bindEvent();
    },

    setParameters: function(){
        this.$window = $(window);
        this.$center_item = $(".title *"); //ここで表示させる一文字一文字を変数に入れている
    },

    bindEvent: function(){
        var myself = this;
        this.$center_item.each(function(){
            var $targetCotent = $(this);
            //イベント設定
            myself.$window.on('load resize scroll', function(){
                var contentsTop = $targetContent.offset().top; //表示させる要素のトップの位置
                myself.displayContents(myself,$targetContent, contentsTop);
            });
        });
    },

    /*
    * スクロールして画面上にでてきたコンテンツにクラスを付与する
    *  myself 一番大きなオブジェクト
    * 　$content それぞれクラスを付与するコンテンツ
    *　 contentTop コンテンツのトップ位置
    */
    displayContents: function(myself,$content,contentTop){
        var windowScrollBottom = myself.$window.scrollTop() + myself.$window.height(); //ウィンドウの下位置
        // ウィンドウの下位置がコンテンツのトップ位置より下（数字的に大）に来た場合、クラス付与
        if(windowScrollBottom > contentTop + myself.DELAY_VALUE){ 
            $content.addClass('is-active');
        }
    }
}
SCROLL_EVENT.init()
```
## CSStransitionでアニメーションをつけてあげます。
一文字一文字transtion-delayをちょっとずつずらしてつけてあげます。
思ったような雰囲気にならなかったら、delayの数字をいじったり、指定する番号を変えてあげましょう。

```css
span {
  opacity:0;
  transition: opacity 1500ms cubic-bezier(.445,.05,.55,.95);
}
span:nth-of-type(even){transition-delay: 0.4s;}
span:nth-of-type(odd){ transition-delay: 0.8s;}
span:nth-of-type(3n+1) {transition-delay: 0.6s;}
span:nth-of-type(7n+1) {transition-delay: 0.2s;}
span:nth-of-type(1){transition-delay: 1s;}
.is-active {
    opacity:1;
} 
```
PHPで固定長文字列

長い文字をテストする際等に使用。

```php
str_repeat('a', 10);
// string(10) "aaaaaaaaaa"
```

以下はマルチバイト対応していないのでゼロパディング等用。

```php
str_pad('', 10, 'a', STR_PAD_LEFT);
// string(10) "aaaaaaaaaa"

str_pad('1', 10, '0', STR_PAD_LEFT);
// string(10) "0000000001"
```
スクリーンセーバの設定でプルダウンに任意の名前を表示する方法

C#でスクリーンセーバーを作ってみたのですが、スクリーンセーバーの設定でプルダウンに任意の名前を表示する方法が分かりずらかったのでまとめました。
![キャプチャ5.JPG](https://qiita-image-store.s3.amazonaws.com/0/140341/f3c49647-bfe0-a0bf-1746-d460dd93faa6.jpeg)

参考にしたサイト:
https://social.msdn.microsoft.com/Forums/windows/en-US/35ea8aeb-e729-474c-b6d2-544fc3c48d8d/how-to-change-a-c-winform-screen-savers-title-friendly-name-in-display-properties?forum=winforms

スクリーンセーバー自体の作成方法はこちらのサイトを参考にしました：
https://www.harding.edu/fmccown/screensaver/screensaver.html

1. ソリューションエクスプローラ上のソリューションを右クリックして[追加(D)]→[新しい項目(W)...]を選択します。

2. 一覧から**ネイティブ リソース テンプレート**を選択します。

3. [名前(N)]は *ResTemp1.rct* のまま[追加(A)]をクリックします。
![ネイティブリソーステンプレートの選択](https://qiita-image-store.s3.amazonaws.com/0/140341/01348054-7bec-1dbc-55f4-798a5a05cf14.jpeg)

4. ソリューションに *ResTempl1.rct* が追加されているのでクリックしてデザイナを表示します。
5. デザイナが表示されない場合は、メニューから[ツール(T)]→[ツールと機能を取得(T)...]を選択して、[ワークロード]タブから **C++によるデスクトップ開発** を追加してください。

6. デザイナ上の **ResTempl1.rct** を右クリックして[リソースの追加(A)...]を選択します。

7. **String Table** を選択して[新規作成(N)]をクリックします。
![リソースの追加](https://qiita-image-store.s3.amazonaws.com/0/140341/9132bb12-dfab-ad66-9679-f2cd07174b6c.jpeg)

8. １行目に[ID]＝**なし**、[値]＝**1**、[キャプション]＝**My Screen Saver**と入力してファイルを保存します。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/140341/01487fcd-e15d-f39e-b1a5-860b27d62c72.jpeg)

9. *ResTempl1.rct* をデザイナで確認すると **String Table**が追加されていることが確認できます。
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/140341/4dd9cbb5-30d5-48a9-48d6-6c9a8af473f1.jpeg)

10. メニューから[ファイル(F)]→[名前を付けて ResTempl1.rct を保存(A)...]を選択します。
11. [ファイルの種類(T)]から**32ビットリソースファイル**を選択して[上書き保存(S)]をクリックします。
![キャプチャ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/140341/2ba6c2db-3a21-d038-359d-57a5ab1e3a6d.jpeg)
12. プロジェクトのプロパティを表示して[アプリケーション]を表示します。
13. [リソース]から[リソースファイル(S)]を選択して先ほど保存した32ビットリソースファイルを選択します。
![キャプチャ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/140341/d5301a13-dfd9-66d4-d502-21602f4a888b.jpeg)

14. プロジェクトをリビルドしておしまいです。

15. するとスクリーンセーバーのプルダウンに任意の名称が表示されます。
![Clipboard04.jpg](https://qiita-image-store.s3.amazonaws.com/0/140341/273d883b-2ef4-31c9-8b53-3659f96521ec.jpeg)
CryptoBridge の取引履歴を取得する

漢なら CryptoBridge の取引履歴を取得したいですね!

しかし CryptoBridge のページでは直近の履歴しか残っていません...

調べてみると, Bitshares の block explorer サービスを使ってくださいとありました.

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">There is a limited trade history available in the client. If you need more, use a bitshares block explorer like <a href="https://t.co/ApR7yAueSW">https://t.co/ApR7yAueSW</a></p>&mdash; CryptoBridge (@CryptoBridge) <a href="https://twitter.com/CryptoBridge/status/959341240058830849?ref_src=twsrc%5Etfw">February 2, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


http://bts.ai/
(サーバが弱いのか, 反応が遅いです)

bts.ai は API はまだありませんでした.

さらに調べると, cryptofresh というサービスもありました.

http://www.cryptofresh.com/

cryptofresh は API がありますが簡単な機能しかなく, JSON で取引一覧を取得というのはありませんでした...

さらに調べると, 取引履歴を CSV/Excel で出力できる BITSHARES ACCOUNT HISTORY EXPORTER を見つけました!

http://open-explorer.io/bitshares-account-exporter/

ID には 1.2.xxxx のような数字を入れます. 上記 block explorer あたりで自分のアカウント名を入れると ID を取得できます.

ただ, このツールが出力するのは RAW トランザクションデータだけで, 実際にどの通貨からどの量交換したかはまたこの RAW データから推測する必要があることがわかりました.

cryotofresh でトランザクションをみて, RAW データと比較すると対比関係がわかりそうではあります.

# TODO

* RAW トランザクションデータから, 実際の取引履歴(どの通貨をどの量交換したか, など)を復元する
chrome contentEditable="plaintext-only"

### chromeなら可変長のtextareaが contentEditable="plaintext-only"で揃う。
```html
  <pre class="editer size" contentEditable="plaintext-only"></pre>
```
### 日本語用にword wrapさせる。
```css
  white-space: pre-wrap;
  word-break: break-all;
```
### 良く忘れる　outline:none
```css
  outline:none;
```
### chrome専用なので、chrome専用のスクロールバーを設定する。
```scss
::-webkit-scrollbar ...  
```
### 全部
```scss
  
@mixin editer($base:orange,$back:#111){
      color:$back;  
      background-color:$base;
      outline:none;
      padding:0.75rem 1rem;
      margin:0;
      white-space: pre-wrap;
      word-break: break-all;
      overflow:auto;
}
@mixin scrollbar($base:orange,$back:#111){
  /*scrollbar*/
  //if target only, the [contentEditable="plaintext-only"]::-webkit....
  &::-webkit-scrollbar{overflow:hidden;width:4px;background:darken($base,5%)}
  &::-webkit-scrollbar:horizontal{height:4px;}
  &::-webkit-scrollbar-button{display:none;}
  &::-webkit-scrollbar-piece{background:rgba(100,100,100,0.3);}
  &::-webkit-scrollbar-piece:start{background:rgba(100,100,100,0.3);}
  &::-webkit-scrollbar-thumb{background:$back;}
  &::-webkit-scrollbar-corner{background:rgba(100,100,100,0.3);}
}  

$base:orange;
$back:#111;

.editer{
  font-family: sans-serif;
  font-size:1rem;  
  @include editer($base,$back);
  @include scrollbar($base,$back);
}
.size{
  width:22rem;
  min-height:5rem;
  max-height:22rem;
}
```
```html
  <pre class="editer size" contentEditable="plaintext-only"></pre>
```
デーモン(daemon)って何か？をまとめた

デーモンって時々聞くけど、あくま？ってくらいにわかっていなかったので、調べたことをまとめる

## デーモンって？

メモリ上で常に待機している、常駐プログラムのUNIX系のOSに置ける呼び方

です。

基本的にユーザーが直接いじることはないそうです。裏でずっと頑張ってくれていたんですね。。。

## ちなみに

デーモンの綴りは、demon（悪魔）ではなく、daemon(守護神)です。


## 参考サイト

http://wa3.i-3-i.info/word11000.html
Application Insights のクエリーを試してみた

先日 Durable Functions のハックフェストで、プロダクトチームのChris を観察していると、彼はデバッグの時にApplication Insightsを使いまくっていた。あー、プロダクトチームの人もわしらと同じツール使うんだと思ったのと同時に、Application Insights のクエリーは相当デバッグに役立ちそう。そこでちょっと試してみた。

<img width="502" alt="ApplicationInsights.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/e22d9440-5948-b71f-f37f-71eb74026f9f.png">

# クエリーの構文

クエリーの構文は、SQL と似た構文になっていて、本当にいろいろなことができる。

* [Application Insights の Analytics について](https://docs.microsoft.com/ja-jp/azure/application-insights/app-insights-analytics-tour)

このページのクエリを一個一個試していたのだけど、数時間経っても半分も終わらないぐらい沢山あった。検索、ソート、サマリ、平均、join、グラフの出力、PowerBIやExcel へのエクスポートなどガチでなんでもできる感じ。出来過ぎて１日で終わらなかった。
シンプルにデバッグに役立つような自作クエリーを試してみる。

# 検索できるデータの種類

これは下記の通り。各項目ごとに属性を持っている。これらについて検索をしたり、サマリをしたりできる。これは相当便利。

<img width="120" alt="apinsighttype.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/134bdbaa-63e1-9a5c-8b86-5c7f76f360d7.png">

# 最近のExceptionの検出

このレベルだと、デフォルトのグラフからたどれるのだが、自分の練習でやってみる。エラー種別ごとのカウントをとってみよう。先のページのサンプルは、`requests` ばかりだったので、exceptions で調べてみる。

```
exceptions 
| where timestamp > ago(1d)
| summarize count=sum(itemCount) by type
```

exceptions のうち、１日内のものに関して、type 毎にカウントのサマリを表示する。こうすれば、どんな Exception が何個出ているかわかる。ここでは、SqlExceptionが気になるのでそれの詳細を見てみたい。


<img width="662" alt="exception01.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/b8f41d7e-1908-0b6e-89c1-6af40cb1bc87.png">

グラフもボタン一つ。

<img width="684" alt="exception03.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/1aed81c4-2612-763a-70a1-cd60eb4a3078.png">


じゃあ具体的な Exception の内容の詳細を取得してみよう。

```
exceptions 
| where timestamp > ago(1d)
| where type == "System.Data.SqlClient.SqlException"
```

こんな感じで詳細が見れる。

<img width="848" alt="exception02.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/5c104f5c-940a-a3bc-8bf5-84b1389ba337.png">

# 結論

この他にも沢山の紹介しきれないぐらいのクエリーが出来た。`requests` だと、国ごとの数値とかもサマリできた。Exception でも、`client_CountryOrRegion` があるので、国ごとの Exception とかも出力できる。上記のリファレンスページを見ながらになるけど、今後はガンガンに使ってみよう。便利そう！

# Resource 

これに尽きる。ちなみに、LogAnalytics も同じ構文（たぶん同じ基盤使ってる）らしいので、これを覚えたらどっちも使えそうでいい感じ。

* [Application Insights の Analytics について](https://docs.microsoft.com/ja-jp/azure/application-insights/app-insights-analytics-tour)
Dockerで複数Laravel5.5プロジェクトの環境構築(2)

## 概要

前回の、[Dockerで複数Laravel5.5プロジェクトの環境構築(1)](https://qiita.com/zizu21105/items/7456d317d15b09cab78b)で構築したdocker+php7環境の上にlaravel5.5プロジェクトを作成し、ローカル開発環境を整えていきます。また、手順を通して、簡単にdockerのコマンドについての解説もしていきます。

## 手順

### 1. phpコンテナへLaravelプロジェクトの作成

まずはじめに、phpコンテナへcomposerからlaravelをインストールします。
[こちら](https://laravel.com/docs/5.5/installation)の公式手順を参考に進めていきます。


```bash
$ docker-compose ps
#     Name                   Command               State                     Ports                  
# --------------------------------------------------------------------------------------------------
# foo_composer    composer --help                  Exit 0                                           
# foo_yarn        node                             Exit 0                                           
# hoge_composer   composer --help                  Exit 0                                           
# hoge_yarn       node                             Exit 0                                           
# mysql           docker-entrypoint.sh mysqld      Up       0.0.0.0:3306->3306/tcp                  
# php-foo         docker-php-entrypoint apac ...   Up       80/tcp                                  
# php-hoge        docker-php-entrypoint apac ...   Up       80/tcp                                  
# proxy           /app/docker-entrypoint.sh  ...   Up       0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
```
dockerコンテナが上のように起動した状態で、composerコマンドを叩きます。

```bash
docker-compose run --rm foo_composer create-project laravel/laravel foo
```

`docker-compose ps`コマンドで確認できるように、composerコンテナは通常起動していない状態です。
`--rm`オプションは起動と同時にコマンドを実行し、終了後コンテナを削除するオプションです。このオプションをつけることで、ゴミを残さずにコンテナ操作を行うことができます。`foo_composer`は`docker-compose.yml`で定義されたサービス名です。
また、composerのDockerfileで`ENTRYPOINT`に`composer`、`CMD`に`--help`を設定しているため、
コンテナを次のように起動すると`composer --help`コマンドが実行されます。

```bash
docker-compose run --rm foo_composer
```

### 2. プロジェクトパスの修正

手順1でLaravelのインストールとプロジェクトの作成を同時に行いました。 (完了には少し時間がかかるかもしれません。)
しかし、`docker-compose.yml`で設定していたパスの都合上、`laravel-docker/data`以下のパスに修正が必要です。
以下の手順で、Laravelのプロジェクトを`data`ディレクトリ直下に移動させましょう。

```bash
$ mv data/foo{,.bkp}
$ cp -r data/foo.bkp/foo data/foo

$ sudo rm -rf data/foo.bkp
```

### 3. パーミッションの変更

```bash
# php+apacheコンテナ内へアクセス
$ docker-compose exec foo /bin/bash

$ pwd
# /var/www/html/foo

$ chmod 777 -R storage
```



## ブラウザへアクセス
https://foo.foo.com へアクセスすると、Laravelのwelcomeページヘアクセスできました。

![browser2.png](https://qiita-image-store.s3.amazonaws.com/0/236140/0f64860b-8a3e-6b82-1848-59d51cc20aec.png)


## おわりに

以上で手順の解説は終了です。同手順でLaravelの別プロジェクトhogeを作成すると、dockerで複数ドメインのアプリを同時に管理し、reverse-proxyでアクセスを振り分けることができました。

改善点・ご指摘などございましたら、気軽にコメントをお願いします。
Laravel 本番サーバー上（production環境）だけhttpsにしたい

困ったこと：
@assetではhttp://を向いてしまう

叶えたいこと：

local では http://
production では https://

を向いてほしい...
nginxの影響なのかhttpsを向いてしまうので困ってました

解決方法：
route/web.phpに以下を追加する

```
if (app()->environment('production')) {
  URL::forceScheme('https');
}
```

.envの `APP_ENV` が `production` の時のみ `URL::forceScheme` を読んでくれる！

`APP_ENV=production`



環境：
local：
Laravel5.5 / PHP7.1
production： 
Laravel5.5 / PHP7.1 / nginx





参考：
productionでhttpsにしたい
http://dolphin.hatenablog.jp/entry/2015/04/27/010635
gitメモその2

#用語的なものを自分なり解釈したものまとめ（適宜足す予定)
##統合ブランチ
リリース版のプロジェクトを保持しておくためのブランチみたいなイメージ。
ここから開発用やバグフィックス用のブランチなどに枝分かれしていく起点となるような感じか。
リリースしたらタグ付けする。
通常はmasterブランチがその役目を果たすらしい。masterブランチは一番最初にリポジトリにコミットするとできる。

##トピックブランチ
何かの開発案件、バグフィックスなどのテーマ毎に統合ブランチを元ネタとして作られるもの。
それぞれのブランチで開発が完了したものを最後に統合ブランチに取り込むらしい。

git-flowってのだと
・masterブランチからdevelopというブランチを作成する。これによって商用で動いているプロダクトのブランチと開発用ブランチを明確に分けようとしているっぽい。
・feature branchesというたとえば機能ごと、案件ごとみたいなブランチを作ってそこで開発をする。feature branchesのもとになるのはdevelopブランチ。
・hotfixes:バグ修正開発用のブランチ。これはmasterブランチが元になるらしい。直したらmasterと開発ブランチにマージ。
・release branches:開発がほぼ完成してリリースが近づいたらdevelopブランチを基にして作る。
developのままでいいじゃんって思っちゃうけどこのブランチでdevelopと明確に分けることで未リリース予定のものが混入したりするのを防げるのかな？
完全に準備ができたらrelease branchesの内容をmasterにマージしてタグ打ちをする。
あと、不幸にもこのブランチにまたバグが見つかったらmasterに入れた内容と同じようにバグフィックスをdevelpoにもマージする。

※git-flowとかはについては[こちらの記事](https://qiita.com/KosukeSone/items/514dd24828b485c69a05)を参考にさせていただきました。ありがとうございます。


##その他用語的なもの
- チェックアウト：作業ブランチを切り替えること。SVNとは用語の意味が全然違うので注意。
- ヘッド：今いるブランチの最新のコミットのこと。
- スタッシュ(stash)：ワークツリー内の変更を一時的に隠すことをいう。  
たとえばブランチAで作業中にファイルを更新していたけど急にブランチBで作業したくなった場合、
すぐにブランチBにチェックアウトしてしまうとAでの更新内容がBにもっていかれてしまうのでそれを防ぐみたいな感じで使えるらしい。  
ブランチごとにPC上のディレクトリ分けておけばいいんじゃん？とも思うけどその辺は使い方次第なのかな。
- マージ：枝分かれしたブランチの内容を統合すること。  
masterから枝分かれしたブランチAの内容をmaster側に取り込みたかったらmasterが作業ブランチになるようにチェックアウトコマンドを実施。  
その後git merge ブランチAってやるとAの内容が取り込まれる。取り込みがちゃんと終わったらブランチAは消してもいい。
Pythonを使ってランダムな文字列を生成

##### 目的
文字数`n`を与えるとその長さのランダムな英数字の文字列を作成する．

##### 環境
```bash
$ python
Python 3.6.2 |Anaconda custom (64-bit)| (default, Jul 20 2017, 13:14:59)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
(追記) `Python 2.7.14`でも動きました．
##### コード
``` python
import random, string

def randomname(n):
   randlst = [random.choice(string.ascii_letters + string.digits) for i in range(n)]
   return ''.join(randlst)
```

##### 生成例

```python
>>> randomname(10)
'hBJN0XntN6'
>>> randomname(10)
'7we4CMGjTj'
>>> randomname(8)
'JRBLZVEG'
>>> randomname(8)
'woccb8Vn'
```

##### 追記
@tag1216 さんからの補足です．
ありがとうございました．

```python
import random, string

def randomname(n):
   return ''.join(random.choices(string.ascii_letters + string.digits, k=n))
```
`Python 3.6`以降であれば上記で同じ処理が可能です．
(追記: コード間違ってたので修正および加筆しました）
swift初心者:[carthage導入時のfailed with exit code 72: xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH]の対処方法

#はじめに
初歩的なエラーかと思いますが、初心者のため備忘録を含め記録として残したいと思います。


#結論:Xcordの環境設定でバージョンを選択する。


解決までの流れを説明します。


#①carthage update --platform iOS

carthage導入時、上記コマンドを入力した際に
`CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES -list) failed with exit code 72: xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH`というエラーが発生してしました。

ターミナル上に以下のコマンドを入力することで解決する記事を発見しましたが、
僕の事例には当てはまりませんでした。

```swift:
sudo xcode-select -switch /Applications/Xcode9.2.app/Contents/Developer
```

#②xcordの環境設定でバージョンを選択する
https://github.com/Carthage/Carthage/issues/1325
上記記事の通り、`Priferences`→`locations`→`Command Line Tools`を選択しバージョンを指定することで解消しました。


<img width="1081" alt="スクリーンショット 2018-02-20 22.29.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/7fbbfd9f-f614-64a1-7f6f-c32c3468a482.png">

ご参考になれば幸いです。
[paralles] Windows側でDVDドライブの書き込みできないときに確認すること

# 何
- parallelsのWindowsでPC TV PLUSによるnasne録画番組の書き込みができなくなった。（メディアが非対応・・・）解決した方法。

## 原因
- ドライブが自動的にmacに割り当てられていた。

## 対応
- parallelsの環境設定->デバイスで「無期限の割り当て」にドライブがあれば削除。物理接続をやり直した際に接続先を問われるのでwindowsに接続。

![スクリーンショット 2018-02-20 22.14.18.png](https://qiita-image-store.s3.amazonaws.com/0/151200/c1984898-8a73-a3de-c462-0e4a3bf77147.png)

## その他
- 自動的にmacに接続していてもwindowsでドライブを参照用途としては使えるので、macに接続されていることに気がつくのに時間がかかった。PC TV PLUSのメッセージもメディアやドライブの問題と出るのでわからなかった。
【Wordpress】記事ごとにテーマフォルダ内のCSSやJavaScriptなどを読み込む方法

## 大まかな流れ
1. 記事内の`<head>`内、及びに`</body>`直前に、カスタムフィールドに書いたCSSやScriptを挿入出来るようにする。
2. カスタムフィールド内のショートコードでテーマフォルダ内のファイルを読み込む。

## 前段階
```php:header.php
//~~~
wp_head();
//~~~
if (is_single()||is_page()): //記事ページor固定ページの場合
  echo apply_filters('the_content', get_post_meta($post->ID, 'foo', true));
endif;
```
投稿時にカスタムフィールド「foo」の値に直接CSSを書けば読み込んでくれる。
`<style>`で囲むことを忘れずに。

```php:footer.php
//~~~
wp_footer();
//~~~
if (is_single()||is_page()): //記事ページor固定ページの場合
  echo apply_filters('the_content',get_post_meta($post->ID,'bar',true));
endif;
```
投稿時にカスタムフィールド「bar」の値に直接scriptを書けば読み込んでくれる。
`<script>`で囲むことを忘れずに。
## テーマフォルダ内のファイルを読み込む(本題) 
### 最初に試した方法(間違い)
```php:functions.php
function show_path_to(){
  return get_template_directory_uri(); //親テーマディレクトリ
  //return get_stylesheet_directory_uri(); //子テーマディレクトリ
}
add_shortcode('path', 'show_path_to');
```
```html:カスタムフィールド「foo」
<link rel="stylesheet" href="[path]/css/bar.css">
```
ショートコードが動かずにそのまま表示された。当然ファイルは読み込めていない。
#### 敗因
HTMLタグ内でのショートコード使用には制限があるらしい。
imgのsrc属性内等なら動く。
### 上手くいった方法
```php:functions.php
function includeFile($args){
  $template = get_template_directory_uri();
  //$template = get_stylesheet_directory_uri(); 子テーマを使っている場合はこちら
  switch($args['kind']){
    case 'js':
      return '<script src="'.$template.'/js/'.$args['name'].'"></script>';
      break;
    case 'css':
      return '<link rel="stylesheet" href="'.$template.'/css/'.$args['name'].'">';
      break;
    default:
      return;
      break;
  }
}
add_shortcode('file', 'includeFile');
```
```html:カスタムフィールド「foo」
[file kind=css name=foobar.css]
```
知ってますか？ :shipit: の意味と由来

## これは何？ → :shipit:

GitHub でよく使われる絵文字の一つです。
:shipit : というコードが割り当てられていて、"ship it" と読みます。
若干わかりづらいですが、「帽子をかぶった（動物の）リス」です。

## どういう意味？

一般に、PR に対するレビューコメントにおいて良く使われます。
「変更に問題はない、コードをリリース（ship）してしまって構わない」という意味です。
また、最近ではコミットメッセージにおいて見かけることが増えています。
「:shipit: vX.Y.Z」として、このコミットを契機にパッケージをリリースするようなケースで利用されます。

## なぜリスなのか？

リス自体に意味はありません。
GitHub 所属の [@jglovier](https://github.com/jglovier) さんが、Quora 上でその由来について言及しています。

* [On GitHub, what is the significance of the 'Ship It' squirrel? - Quora](https://www.quora.com/On-GitHub-what-is-the-significance-of-the-Ship-It-squirrel)

GitHub ではコードのデプロイを1日に何回も行っていて、リスの画像はそういったデプロイの "ランダム性" を表すメタファーだとしています。
また、ジョークとして「このリスがデプロイを応援している」と付け加えています。

ちなみに、GitHub では Hubot による ChatOps を導入していて、そのスクリプトの多くは [github/hubot-scripts](https://github.com/github/hubot-scripts) 上で公開されています。このリポジトリは既に deprecated となっていますが、スクリプトの一つに ship it というメッセージに対してリスの画像をランダムに返すだけの実装があります。実は :shipit: の画像は、その中の一つとして採用されていたという経緯もあります。
null安全な言語の場合、左辺がnullableならば==trueという比較は有用

[Javaではif (flag == true)というコードを書いてはいけない](https://qiita.com/ikemo/items/4f56a283f9e27cf98d81) を読んで、言語によってはこれが有用なケースもあるよというのを紹介します。

kotlinやswiftでスマホアプリを作っていると、**nullになる可能性があるBoolean**がしばしば登場します。
この場合、上の記事のように書くためには事前にnullでないことを証明する必要があります。

kotlin

```kotlin
val b: Boolean? = true

if (b != null) {
  if (b) {
    ...
  }
}
```

swift

```swift
let b: Bool? = true

if let notNullB = b {
  if notNullB {
    ...
  }
}
```

このBooleanをただの条件分岐として使うだけの用途の場合は、**trueかそれ以外**という形にするとすっきりと書けます。


kotlin

```kotlin
val b: Boolean? = true

if (b == true) {
  // bがtrueの時だけ実行される
}
```

swift

```swift
let b: Bool? = true

if b == true {
  // bがtrueの時だけ実行される
}
```

この場合、elseになる条件はbが**nullまたはfalse**となります。
react-nativeの再起動の仕方を実務でreact-native書く人がまとめてみた

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)
原因不明のエラーが、再起動したらあっさり動いた。我々が初心者の頃からよくあることだと思う。
react-nativeの再起動のやり方を実務でreact-nativeを使ってる人間がまとめてみた。

## 基本１
シュミレーターとターミナルを終了。
（ターミナルも必ず終了する）
react-native run-ios

基本ですね。まずこれを試したい。

## 基本　２
rm -rf node_modules
npm cache clear
watchman watch-del-all
npm install

よくエミュレーターで表示される手順ですね。とりあえず困ったらこれをやってもいい。

## iosのシュミレーターを初期化する。
シュミレーターを開いている時、上にSimulator>Reset Content and Settingsでシュミレーターにインストールされたアプリを削除できる。
例を挙げると、
１　debugを開始すると、Runtime is not ready for debuggingと出てエラーになってしまう時
２　シュミレーター上のExpoでCRNAを動している時に、Expoの画面上で、白い画面のエラーが出る時。
などだ。こういったエラーはシュミレーターの環境をリセットすると直る。
シュミュレーターは定期的にリセットしたい。

## xcodeからリビルドする
rebuildを選択、実行
その後、左上の▷でシュミレータを起動

iosシュミレーターのホームからアプリを削除する。
command + shift + H
で、現在のアプリからホームに戻れるので、削除したいアプリを、長くクリックしましょう。そうすると左上にxが現れるのでタップする。

## 実機テスト編
実機にアプリをインストールした後、スマホを振ることでメニューを開くことが出来る。
android実機の場合ターミナルから
adb shell input keyevent 82
でメニューを開けるので、エイリアスを作っておくと便利。
そこでリロードで擬似再起動が出来る。
またandroidの実機だと、キャッシュを削除することでアプリをインストールした時の状態に戻せる

## android実機での再起動は
cd android && gradlew clean
このコマンドは実機にインストールする時生成した、android/build, android/app/buildという二つのファイルを削除してくれる。
その後は
cd .. && react-native run-androidだ。

またusbケーブルを外すと、　サーバーとの接続が切れてリロードが出来なくなる。
usbを外してデバッグしたい時は、スマホを振ってメニューを出し、devSettingsをタッチ次にDebug server host & port for deviceをタップして、
199.166.0.1:8081などとパソコンのipアドレスを入力しよう。
これでリロードが出来るようになる。
一度usbケーブルを外してしまうと、再接続してもリロードは出来ない。
もう一度react-native run-androidをしよう。

## ios編
pod関連でおかしい時
iosフォルダの中のPods ディレクトリ削除
Podfile.lockも削除
modified my Podfile to target iOS 9
cd ios && pod install
cd ../
react-native link
ただし、気軽なpod updateとreact-native-linkは全てを破壊するので注意


## 番外編
react-native link忘れてないよね？　
yarnは？
スマホのブラウザからPCのAPIサーバーにアクセスできる？
（アクセスできなかったらスマホとPCが同じwifiを使っているか確認）
僕はこれで３時間無駄にしたよ。

他にもいいやり方があればコメントで教えてください。
RAK811


現状、ここはメモ置き場と化してます


https://sourceforge.net/projects/realterm/files/Realterm/2.0.0.70/

TroubleShoot Notes:
Make sure the baud rate is 115200 for the serial connection
And the comm setting is 8 data bits, no parity and 1 stop bit
The CR and LF combo at the end is essential. Else you will not get the response from the board



5v シリアルポート問題

[How to fix WisNode\-Lora shield not really compatible with an Arduino \(TX/RX lines not 5V compatible\) \- The Things Network](https://www.thethingsnetwork.org/forum/t/how-to-fix-wisnode-lora-shield-not-really-compatible-with-an-arduino-tx-rx-lines-not-5v-compatible/7201)


Lora-Shift boardってどこにあるんだー




[【Tutorial】建立自己的LoRa網路 — RAK 831模組評析 \| Building Maker Economy：自造達人社群/媒體/平台](https://makerpro.cc/2017/11/build-the-lora-network-with-rak831/)

![Kobito.pdX6Rk.png](https://qiita-image-store.s3.amazonaws.com/0/49910/79992f01-9a99-ee6e-271a-88a49045865b.png "Kobito.pdX6Rk.png")
Grove > GPS





[Grove \- GPS \- Sensor \- Seeed Studio](https://www.seeedstudio.com/grove-gps-p-959.html)




[Grove \- GPS \- Seeed Wiki](http://wiki.seeed.cc/Grove-GPS/)


![Kobito.DRDHgu.png](https://qiita-image-store.s3.amazonaws.com/0/49910/0dc028b8-87df-0c38-6845-616ec9f2f2d8.png "Kobito.DRDHgu.png")



```
#include <SoftwareSerial.h>
SoftwareSerial SoftSerial(2, 3);
unsigned char buffer[64];                   // buffer array for data receive over serial port
int count=0;                                // counter for buffer array
void setup()
{
    SoftSerial.begin(9600);                 // the SoftSerial baud rate
    Serial.begin(9600);                     // the Serial port of Arduino baud rate.
}

void loop()
{
    if (SoftSerial.available())                     // if date is coming from software serial port ==> data is coming from SoftSerial shield
    {
        while(SoftSerial.available())               // reading data into char array
        {
            buffer[count++]=SoftSerial.read();      // writing data into array
            if(count == 64)break;
        }
        Serial.write(buffer,count);                 // if no data transmission ends, write buffer to hardware serial port
        clearBufferArray();                         // call clearBufferArray function to clear the stored data from the array
        count = 0;                                  // set counter of while loop to zero 
    }
    if (Serial.available())                 // if data is available on hardware serial port ==> data is coming from PC or notebook
    SoftSerial.write(Serial.read());        // write it to the SoftSerial shield
}


void clearBufferArray()                     // function to clear buffer array
{
    for (int i=0; i<count;i++)
    {
        buffer[i]=NULL;
    }                      // clear all index of array with command NULL
}
```
特定ディレクトリにいたらbashプロンプトで注意を促す

趣味でWebサービス作っていて，1台のサーバに開発環境と本番(?)環境が同居しています．
たまに取り違えて危ない目に合うので，本番環境のディレクトリにいることが分かるようにしてみました．


## 完成図

![bash_window.png](https://qiita-image-store.s3.amazonaws.com/0/1045/724b7a65-83fc-eaef-a633-29ba4ced81d6.png)

## 方法

「[プロンプトをカスタマイズしてgitブランチを表示する - Qiita](https://qiita.com/caad1229/items/6d71d84933c8a87af0c4)」
にエッセンスが詰まっているのですが，「bashのプロンプトは環境変数```PS1```で制御できる」「```$(command)```という書き方で実行結果の埋め込み（コマンド置換）ができる」という2点を押さえると割と自由が効きます．

```
is_production()
{
  curdir=$(pwd)
  case $curdir in
  *production*)
    echo "PROD|"
  esac
}

export PS1="\[\033[41m\]\$(is_production)\[\033[40m\]\u@\[\033[32m\]\h\[\033[00m\]:\[\033[92m\]\w\[\033[00m\] $ "
```

※部分一致なので厳密じゃないですが

## おわりに

危ない目を防ぐという本来の目的を達成できているかどうかは微妙です．ちゃんちゃん．
ディスコース・マーカー

ITエンジニアのための英語リーディングに記載されている
ディスコース・マーカーをまとめました。

|種類  |英単語  |日本語訳  |
|---|---|---|
|手順/列挙  | fist |まず第一に  |
| |second / third  | 第二に、第三に  |
| |then,next | 次に  |
| |finally  | 最後に |
|強調  | in fact、actually|実は、実際のところ  |
| |specifically、especially、particularly  | 特に、とりわけ |
| |anyway  | とにかく |
|追加  | also|また  |
| |in addition、besides  | 加えて|
| |not only～but also  | ～だけではなく・・・も |
| |on the other hand | 他方 |
|逆接  | but、however|しかし|
| |although～,・・・、though～,・・・ | ～だが・・・ |
| |even if ～,・・・ | 仮に～であっても・・・ |
|例示  | for example、for instance、such as、e.g.|例えば|
| |including～| ～も含め |
|言い換え| in other words|言い換えると|
| |namely、i.e.、or| すなわち |
|理由| because ～、since～、as ～|～なので|
| |because of ～、due to ～ | ～のため |
|結論/結果| so、therefore、thus|それゆえ、したがって|
| |as a result、consequently | その結果、したがって |
dockerのmacへのインストール手順

## dockerのインストール

まずはじめにmac用のdockerをインストールします。

https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac

このページからインストールできます。種類が2つあって

- 安定版
- ベータ版

があります。ベータ版は最新の機能が備わっているらしいですが、安定して動作して欲しいので、安定版を選びました。

```shell
$ docker --version
Docker version 17.03.0-ce, build 60ccb22

$ docker-compose --version
docker-compose version 1.11.2, build dfed245

$ docker-machine --version
docker-machine version 0.10.0, build 76ed2a6
```

これらのコマンドが正しく動作していれば、大丈夫です。

## 以降の使い方

https://qiita.com/kobori_akira/items/0cc993caeb20d77cd367

こちらの記事を参考にしました。
TensorflowのRNNとLSTMのパラメータ、num_units解析

TensorflowでRNNとLSTMを実装する時にBasicRNNCellやBasicLSTMCellを使う場合、パラメータとして「num_units」を指定します。

```python
# RNN
# num_units: int, The number of units in the RNN cell.
rnn = tf.contrib.rnn.BasicRNNCell(num_units)
# LSTM
# num_units: int, The number of units in the LSTM cell.
lstm = tf.contrib.rnn.BasicLSTMCell(num_units)
```

Feed forward ニューラルネットワークと比較すると、RNNのnum_unitsは中のhidden layerのunit(もしくはノード)の数だと理解できます。
基本的なLSTMの場合、全ての層のnum_unitsが一致しないと内部処理が混乱のため、全ての層のunit数が統一されます。つまり、下記の４つの層のunit(ノード)数がnum_unitsで統一されます。
1. input gate
2. new input 
3. forget gate 
4. output gate 



下記はTensorflowのLSTMソースコードになります。


https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/rnn_cell_impl.py

```python
class BasicLSTMCell(LayerRNNCell):
 ...
  def build(self, inputs_shape): 
    ...
    self._kernel = self.add_variable( 
        _WEIGHTS_VARIABLE_NAME, 
        shape=[input_depth + h_depth, 4 * self._num_units]) 
    self._bias = self.add_variable( 
        _BIAS_VARIABLE_NAME, 
        shape=[4 * self._num_units], 
        initializer=init_ops.zeros_initializer(dtype=self.dtype)) 
    ...
  def call(self, inputs, state):
    ...
    # ここで新しいインプット
    gate_inputs = math_ops.matmul( 
        array_ops.concat([inputs, h], 1), self._kernel) 
    gate_inputs = nn_ops.bias_add(gate_inputs, self._bias) 
    ...
    # i = input_gate, j = new_input, f = forget_gate, o = output_gate 
    i, j, f, o = array_ops.split( 
        value=gate_inputs, num_or_size_splits=4, axis=one) 
    ...
```

ご覧の通り、層を作る時にnum_unitsを４倍して重みを作り、使用時には各層で均等に割って使っていることがわかります。

ネット上のLSTMの例を見るとinputのところに自分でweight, biasを組む人をたまに見ますが、スースコードを見ると、内部でやってくれているのでそれは不要かと思いました。