OmniAICreator/Qiita-1.07M huggingface dataset:
artisanコマンドでmake:できるファイルたち一覧

検証環境：Laravel5.6.38

#基本コマンド
```
php artisan make:[type] [ファイル名]
```

#一覧
|type|説明|ファイルが生成される場所|
|---|---|---|
|auth|基本ログイン機能|いくつかのファイルが自動生成&既存ファイルへの追加|
|channel|チャネルクラス|laravel/app/Broadcasting/[ファイル名]|
|command|artisanコマンド|laravel/app/Console/Commands/[ファイル名]|
|controller|コントローラークラス|laravel/app/Http/Controllers/[ファイル名]|
|event|イベントクラス|laravel/app/Events/[ファイル名]|
|exception|カスタム例外クラス|laravel/app/Exceptions/[ファイル名]|
|factory|ファクトリ|laravel/database/factories/[ファイル名]|
|job|ジョブクラス|laravel/app/Jobs/[ファイル名]|
|listener|リスナークラス|laravel/app/Listeners/[ファイル名]|
|mail|メールクラス|laravel/app/Mail/[ファイル名]|
|middleware|ミドルウェアクラス|laravel/app/Http/Middleware/[ファイル名]|
|migration|マイグレーションファイル|laravel/database/migrations/[ファイル名]|
|model|Eloquentモデル|laravel/app/[ファイル名]|
|notification|通知クラス|laravel/app/Notifications/[ファイル名]|
|observer|オブザーバクラス|laravel/app/Observers/[ファイル名]|
|policy|ポリシークラス|laravel/app/Policies/[ファイル名]|
|provider|サービスプロバイダークラス|laravel/app/Providers/[ファイル名]|
|request|フォームリクエストクラス|laravel/app/Http/Request/[ファイル名]|
|resource|リソースクラス|laravel/app/Http/Resources/[ファイル名]|
|rule|バリデーションルール|laravel/app/Rules/[ファイル名]|
|seeder|シーダークラス|laravel/database/seeds/[ファイル名]|
|test|テストケース|laravel/tests/(Feature or Unit)/[ファイル名] <br /> ※ --UnitをつけるとUnit|

※channelはLaravel5.6から
Azure Logic Apps の承認メールでメール本文にMS Flowの画面を表示しないようにする

Azure Logic Appでは「O365 Outlook」「Outlook.com」コネクタを使用して承認フローを作成することができます。

#問題
「承認のメールを送信します」アクションで特になにも設定せずに承認メールを送るとMicrosoft Flowのような画面が自動的にメールの先頭に追加される。
![2018-10-10_10h48_36.png](https://qiita-image-store.s3.amazonaws.com/0/149212/623e7540-54c1-8a33-8636-52d2c95ecb6a.png)

#解決策
「承認のメールを送信します」アクションで[詳細オプションを表示する]を選択して詳細オプションを表示する。
![2018-10-10_10h50_55.png](https://qiita-image-store.s3.amazonaws.com/0/149212/daeb4853-3cbe-5c2f-e3d1-7644317b074e.png)
「HTMLメッセージのみを使用します」を「はい」に選択。
![2018-10-10_10h51_46.png](https://qiita-image-store.s3.amazonaws.com/0/149212/a1590e71-92a4-e92f-e98f-75facf764b5c.png)

MS Flowに関する表示が表示されなくなった。
![2018-10-10_12h37_17.png](https://qiita-image-store.s3.amazonaws.com/0/149212/4e9c6a8c-8c5e-28be-ae09-6df60088ae46.png)
Library not loadedでUITestsが落ちるときの対処法

UITestsが`Library not loaded`エラーでコケてどうしようもならなくなったときのメモ

もっと綺麗な方法があるという方はご教授いただけると助かります :bow:

# 環境

macOS X 10.13.6 High Sierra
Xcode 10.0
Swift4
CocoaPods 1.5.3

# エラー概要

以下のようなエラーが出て無限にUITestがコケる

```
2018-10-10 12:27:45.167616+0900 SampleAppUITests-Runner[54613:9899852] The bundle “SampleAppUITests” couldn’t be loaded because it is damaged or missing necessary resources. Try reinstalling the bundle.
2018-10-10 12:27:45.167698+0900 SampleAppUITests-Runner[54613:9899852] (dlopen_preflight(/Users/hoge/Library/Developer/Xcode/DerivedData/SampleApp-gjaybkosyiuyhtacrtscxsyafqsq/Build/Products/Debug-iphonesimulator/SampleAppUITests-Runner.app/PlugIns/SampleAppUITests.xctest/SampleAppUITests): Library not loaded: @rpath/FBSDKCoreKit.framework/FBSDKCoreKit
```

# 対処法

CocoaPodsを使用していると、UITestsで必要なフレームワークがUITests Schemeに組み込まれない場合があります。

とりあえず、私は以下のようにして対処しました。

```diff
# Uncomment the next line to define a global platform for your project
#platform :ios, '9.0'

target 'SampleApp' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for SampleApp

  pod 'FBSDKCoreKit'

  target 'SampleAppTests' do
    inherit! :search_paths
  end

  target 'SampleAppUITests' do
    inherit! :search_paths
+   pod 'FBSDKCoreKit'
  end

end
```
Effective Pythonのコードを眺めてるメモ書き-sysモジュール,python3

# はじめに
最近業務でPythonを扱うようになり、そのスキルアップのために手に取った本が「Effective Python」
情報発信の名の下に、調べたこととかQiitaに投稿してみます。

# 作業環境

- python2.7 or 3.6
- Pycharm
- Effective Python
 
[Githubのソース](https://github.com/bslatkin/effectivepython)

# 1章:Python流の思考
## 項目1:使っているPythonのバージョンを知る
ソースコード

```python:item_01.py
import sys
print(sys.version_info)
print(sys.version)
```
実行結果:

```python:端末
sys.version_info(major=2, minor=7, micro=10, releaselevel='final', serial=0)
2.7.10 (default, Jul 15 2017, 17:16:57) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)]
```
## Pythonのバージョンを確認するには？
二つの手法が存在する
①コマンドライン

```python:端末
$ python --version
Python 2.7.10
```

②スクリプト
sys.version_info
***
### sysのversionとversion_infoの違いってなんだ？
[sysのpythonドキュメント](https://docs.python.jp/3/library/sys.html)

sys.**version**
>Python インタプリタのバージョン番号の他、ビルド番号や使用コンパイラなどの情報を示す文字列です。

sys.**version_info**
>バージョン番号を示す 5 要素タプル:major, minor, micro, releaselevel, serial 。 releaselevel 以外は全て整数です。 

Python2.7系と3系が存在するけども、基本的にはPython3を使用すべき。と著書は断言している。自分も業務使いのPython versionは基本的に3系なので、それには同意です。

# まとめ
- Pythonのバージョンを知ろう。
- Pythonは3系を使おう。
- Pythonのsysモジュールは、インタプリタや実行環境に関連した変数や関数がまとまったライブラリ。
html-editor-syntax-highlighterの使い方




## これは何？
* WordPressのプラグイン
* 編集画面の表示を自分好みのカラーテーマに変更できるプラグイン
* その他にも、よくあるエディタ機能が揃っている便利プラグイン
  * 保存時に、カーソル位置が保持される
  * HTMLやショートコードの括弧を対応させてくれる
  * 行数表示や、折返しなどをしてくれる

▼機能例：いまいる行がわかる（わかりやすい）。保存しても、場所が保持される。
![Kobito.VHO2W8.png](https://qiita-image-store.s3.amazonaws.com/0/37873/2406576c-2aa8-3167-ad61-744e4183981e.png "Kobito.VHO2W8.png")


## 使い方（管理者編）
* WordPressのプラグインで検索して、導入→有効化するだけ

## 使い方（ユーザー編）
`html-editor-syntax-highlighter` の設定は、ユーザーごとに保持されるのでユーザーごとに設定を変更する必要があります。

手順と説明はこちら。英語ですが、まぁ簡単なので大丈夫でしょう。ぽちぽち変更したらいろいろと変わるのでどんどん使ってみたら良いと思います。

### 設定変更を呼び出す

▼設定変更
![BDC70E89-E6E8-42D2-9B5F-249DD4761123.png](https://qiita-image-store.s3.amazonaws.com/0/37873/564add3e-b043-1042-2d94-1b0be3473fad.png "BDC70E89-E6E8-42D2-9B5F-249DD4761123.png")

▼メニュー
![4743D510-A821-482B-8746-7D49856EDA41.png](https://qiita-image-store.s3.amazonaws.com/0/37873/b667e58b-6381-03e7-8372-a3824372aac5.png "4743D510-A821-482B-8746-7D49856EDA41.png")

簡単な英語ですが、メニューの説明です。

|メニュー    |説明                  |
|----------|--------------------------|
|Theme|エディタの見た目を変える|
|Indent|インデントを変える|
|Line Wrap|長い文字列を折り返して表示するか|
|Numbering|行数を表示するかどうか|
|Font Size|FontSizeの変更。老眼の人は大きくしましょう|
|Line Height|文字列の高さ|
|more ...|その他の設定|


### 画面の見た目を変えてみる

エディタの見た目は、Themeから変えます。
とりあえず、今までどおりの見た目で、行数表示・いまいる行表示だけの恩恵を得たい場合は、noneを選んでおけばよいでしょう。

▼とりあえず Noneでいんじゃね
![794A4915-1A7F-457E-B023-2560F6722227.png](https://qiita-image-store.s3.amazonaws.com/0/37873/a157933d-74c5-731a-cde5-47bf483e8e03.png "794A4915-1A7F-457E-B023-2560F6722227.png")


### more の設定を変えてみる

普通のWordPress使いは、VimのKey-Bindingsなんてつかんでしょうか…汗

![21F30686-A69B-42CF-B49A-E865BCB6C1C6.png](https://qiita-image-store.s3.amazonaws.com/0/37873/6b70c3d0-3d2c-a7eb-5fce-33f35fa4059e.png "21F30686-A69B-42CF-B49A-E865BCB6C1C6.png")



## まとめ
見た目を変えるだけでも、作業効率ってだいぶ変わると思うのでいろいろ使ってみていこうとおもいます。
ここから始めるpython。起動

#はじめに
pythonのインストール等はすでに行われているものとします。

#環境
anaconda1.8
python3.6
macOS


# はじめてのpython
###pythonを動かしてみる
macならターミナル(winならコマンドプロンプト)にて
※macの場合、python2が標準搭載されているので注意

```
$ python
もしくは
$ python3
```
以下のようになっていたらOKです！

```
>>>
```
一番最初のプログラミング。おきまりのhello world。
hello worldと表示されれば成功です。

```python
>>> print('hello world!')
hello world!
```

以下のように**exit()**　もしくは**ctrl+D**で終了することができます。

```python
>>> exit()
```
また最初の画面で以下のようにも実行できます。

```
$ python -c "print ('hello world')"
hello world
```
ちなみに

```python
>>> #プライマリプロンプト
... #セカンダリプロンプト
```
といいます。これは入力しなくても自動的に表示されます。
こんな風に書けたりします。

```python:

>>> a = 4
>>> if a > 3:
...    print("ok")
ok
```
aが3よりも大きかったらokと表示する処理です。最初にaに4を代入しています。

enterを押すと次のプライマリプロンプトに移ってしまうので
if文などの場合には「:」をつけることでセカンダリプロンプトを
として複数行のコードを書くことができます。

# おわり
Vue.jsのキホンのキを1時間くらいで学んでみた

# Vue.jsのキホンのキを1時間くらいで学んでみた

本記事はjavascriptフレームワークを勉強した事ない自分がVue.jsに興味を持ち、[公式ドキュメント](https://jp.vuejs.org/v2/guide/index.html)の触りだけ進めた過程と感想の記事になります。
1時間という時間はフロントエンドエンジニアとして3年ほど勤めてる自分が基準なのであしからず。

## Vue.jsを学ぶきっかけ
- QiitaでVue.jsの記事をトレンドでよく見るようになった。
- Angular、Reactをスルーしてた知り合いのフロントエンドエンジニアさん達がVue.jsを勉強して案件で使っている話を聞く事が増えた。
- __[公式ドキュメント](https://jp.vuejs.org/)が日本語化されてて見やすい。__

## 実際に触ってみる

公式ドキュメントの[「はじめに」](https://jp.vuejs.org/v2/guide/index.html)をなぞって進めて行きます。
ページを読み進めていくと「とりあえずvueを試したい人は[JSFiddle](https://jsfiddle.net/chrisvfritz/50wL7mdz/)かhtml作ってcdn入れたら良いよ」という旨の記載があったので、今回は下記のようにindex.htmlと外部ファイルjsを作り、レイアウトがそれっぽくなるようbootstrapのcdnも読み込んで進めるようにしました。

```
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Vue Training!</title>
    <!-- Vue cdn 読み込み -->
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <!-- bootstrap cdn 読み込み -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">

</head>
<body>
    <div class="container pt-5 mb-5">
        <h1 class="p-3 mb-5 bg-primary text-white">Vue Training</h1>
        <p class="h3">宣言的レンダリング</p>
        <div class="border p-3" id="app">
            {{ message }}
        </div>
    </div>

    <script src="index.js"></script>
</body>
</html>
```
あとはサンプルコードをhtmlとjsに模写しながら実際の動作をブラウザ上で確認しながら進めていきました。
テキストの説明でよく分からない所は各見出し下にある__「Scrimba のレッスンを試す」__というリンク先に飛べば、動画で実際のソースとブラウザ内の挙動を見せてくれるので特に詰まる事なく最後まで終える事ができました。

終わったあとは下記画像のように書いた記述を書き換えたり、
違うパターンの記述を追加して自分なりに重要そうな箇所をメモしたりして理解を深めました。

![スクリーンショット 2018-10-10 11.16.11.png](https://qiita-image-store.s3.amazonaws.com/0/120058/a693aa44-73cf-d8a1-bac2-ea5442a6cf22.png)


## 感想
完走した感想ですが、

- 初心者向けVue.js記事でよく聞く「導入が簡単で学習コストも低い」というのは納得
- htmlとjsの記述が対になっているので片側のソースを見るだけで何がしたいかがなんとなくわかる
- テンプレートが一瞬見える事があったので、実案件の場合は別途対応する必要がある

という印象を受けました。

また、今回は１時間というくくりで進めていきましたが、気になる記述をあれこれ書き換えての時間なので、慣れた人であれば30分かからないで終わってしまうかと思います。
それくらい導入は簡単なのでちょっとした時間でVue.jsを試してもらえればと思います。
個人的によくつかうgitコマンド集

#はじめに

個人的によく使っているgitのコマンド集です。
随時更新していきます。

###他ブランチとの比較をしたいときにつかうコマンド

```shell
git diff ブランチA..ブランチB
```

###特定のファイルで他ブランチとの比較をしたいときにつかうコマンド

```shell
git diff ブランチA..ブランチB --対象ファイルのパス
```

###特定のファイルを他ブランチからコピーしてくるときにつかうコマンド

```shell
git checkout ブランチ名 --ファイル名
```



###複数コミット後にある時点までの差分を取得したいときにつかうコマンド

```shell
git reset --soft コミットのハッシュ値
```

### git resrt に失敗した時

```shell
git reset --hard ORIG_HEAD
```
Pythonの文字列の数字判定のdecimal()とisnumeric()が使えないとき

# 数字の判定にはisdigit()、decimal()、isnumeric()

文字列が数字であるかどうかを判定するのによく用いるのがこの３つのメソッド。
しかし、ふとした時にdecimal()とisnumeric()が使えないことに気づく。

因みにこれら３メソッドの違いは、次のような感じ？

isdigit()：半角全角数字だけでなく、バイト文字、ローマ数字に対応
isdecimal()：半角全角数字だけ対応
isnumeric()：半角全角数字だけでなく、バイト文字、ローマ数字、漢数字に対応

対応範囲はisdecimal()＜isdigit()＜isnumeric()という感じ。

# いつでもこれらのメソッドが使えると思っていたら罠

ふとした時に、isdecimal()とisnumeric()でエラーになるところを発見。

```
In [3]: test = '10'

In [4]: test.isdecimal()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-65eac6932f46> in <module>()
----> 1 test.isdecimal()

AttributeError: 'str' object has no attribute 'isdecimal'
```

どうやら、こいつらは対象の文字がUTF-8である必要があるとのこと。

# 対応方法

そもそもshift-JISの場合はどうするのか？というのはあるのだけれど、基本的には以下のようにすれば動作する。

```
test = '10'
unicode(test).isnumeric()
```
# 最後に
値が常にUTF-8で来ることが保証されている環境なら問題ないと思うが、変数を`'10'`のように宣言しているとこの罠にはまる。
→`u'10'`ならば良い。

この罠を食らったのは、ユニットテストを作っているところだった。。
バッチでクライアントの静的DNSを変更する（メモ）

静的DNSサーバーを設定しているクライアント用。
DNSサーバーの変更時、
このバッチをGPOのログオンスクリプトなどに登録して使用。

ネットワークアダプター名は下記を想定。
Windows7用に「ローカル エリア接続」「ワイヤレス ネットワーク接続」
Windows10用に「イーサネット」「Wi-Fi」


```dos:chgdns.bat
@echo off

setlocal

for /f "tokens=* usebackq" %%i in (`netsh interface ip show dns name^="ローカル エリア接続" ^| find "静的" ^| find "10.0.0.1"`) do (
 netsh dns add dnsserver name="ローカル エリア接続" address=10.1.1.1 validate=no
 netsh dns add dnsserver name="ローカル エリア接続" address=10.1.1.2 validate=no
 netsh dns delete dnsserver name="ローカル エリア接続" address=10.0.0.1 validate=no
 netsh dns delete dnsserver name="ローカル エリア接続" address=10.0.0.2 validate=no

)

for /f "tokens=* usebackq" %%i in (`netsh interface ip show dns name^="ワイヤレス ネットワーク接続" ^| find "静的" ^| find "10.0.0.1"`) do (
 netsh dns add dnsserver name="ワイヤレス ネットワーク接続" address=10.1.1.1 validate=no
 netsh dns add dnsserver name="ワイヤレス ネットワーク接続" address=10.1.1.2 validate=no
 netsh dns delete dnsserver name="ワイヤレス ネットワーク接続" address=10.0.0.1 validate=no
 netsh dns delete dnsserver name="ワイヤレス ネットワーク接続" address=10.0.0.2 validate=no

)

for /f "tokens=* usebackq" %%i in (`netsh interface ip show dns name^="イーサネット" ^| find "静的" ^| find "10.0.0.1"`) do (
 netsh dns add dnsserver name="イーサネット" address=10.1.1.1 validate=no
 netsh dns add dnsserver name="イーサネット" address=10.1.1.2 validate=no
 netsh dns delete dnsserver name="イーサネット" address=10.0.0.1 validate=no
 netsh dns delete dnsserver name="イーサネット" address=10.0.0.2 validate=no

)

for /f "tokens=* usebackq" %%i in (`netsh interface ip show dns name^="Wi-Fi" ^| find "静的" ^| find "10.0.0.1"`) do (
 netsh dns add dnsserver name="Wi-Fi" address=10.1.1.1 validate=no
 netsh dns add dnsserver name="Wi-Fi" address=10.1.1.2 validate=no
 netsh dns delete dnsserver name="Wi-Fi" address=10.0.0.1 validate=no
 netsh dns delete dnsserver name="Wi-Fi" address=10.0.0.2 validate=no

)
```
yamllintのconfig

yamllint をインストールして使ったら、警告が出すぎるので設定変更。

`~/.config/yamllint/config` を作ってルールを設定しますが、`extends` 句で元にする設定を指定しないと、config で**指定したルールだけ**になってしまいます。

最初、緩めるルールを一つ書いてテストしただけで、大量に出ていた警告がまったく出なくなっておかしいと思ったら、default のルールを参考にルールを書くか、extends でベースとするルールを指定する必要がありました。

作った設定は緩めの relaxed をベースにこんな感じで。

```
---
extends: relaxed

rules:
    document-start: 
        present: false
    brackets:
        min-spaces-inside: 0
        max-spaces-inside: 1
        min-spaces-inside-empty: 0
        max-spaces-inside-empty: 1 
    trailing-spaces: disable
    line-length: 
        max: 135
        allow-non-breakable-words: true
        allow-non-breakable-inline-mappings: true
    colons: 
        max-spaces-before: 0
        max-spaces-after: 1
    hyphens: 
        max-spaces-after: 3

```

参考
[yamllint documentation](https://yamllint.readthedocs.io/en/stable/index.html)
[yamllintの設定の記事]
(https://qiita.com/tcsh/items/93d5e70d096795da8bbc)
自作nimbleモジュールのバージョンをいい感じにする

### 概要
*.nimbleファイルにバージョンを直書きするのはなんだかなー、と思っていたらnimble自体の.nimbleファイル(ややこしい)がいい感じになっていたのでコピペした。

### 説明
.nimbleファイル内ではnimの文法が使用可能なのでsrcディレクトリ内のファイルで定義してやればよい。

exampleというパッケージ名の場合、

```src/examplepkg/common.nim
const exampleVersion* = "0.1.0"
```

```example.nimble
import ospaths

# フルパス取得用テンプレート
template thisModuleFile: string = instantiationInfo(fullPaths = true).filename

# 存在確認
when fileExists(thisModuleFile.parentDir / "src/examplepkg/common.nim"):
  # コンパイル (nimble install)時
  import src/examplepkg/common
else:
  # nimble installするとsrcディレクトリが展開されるので
  import examplepkg/common

# Package

version = exampleVersion
~
~
```

### 注意点
`nimble init`の際、Package typeにbinaryを選択(binがあってinstallExtが無い状態?)するとsrcディレクトリが消えるのでこの方法は使用不可。

### まとめ
いつの間にかnimble initでパッケージタイプごとのプロジェクトテンプレートが生成されるようになったりしてた。

#### 宣伝
結構前から作ってるnimのREPLっぽいもの。
https://github.com/mkanenobu/nimre
ECSのService DiscoveryをCloudformationで組んだときに躓いた

#何がしたいか
AWSのECSでRoute53 Auto namingを利用したService Discoveryの設定を、Cloudfromationで組みたい
Service DiscoveryのHosted zoneにはPrivate DNSを使いたい

#躓いたポイント
ECS Serviceでコンテナ（Task）が起動し続けてくれなかった
そのため、いつまで経ってもCloudformationのStatusが`CREATE_COMPLETE`にならなかった

#どう解決したか
Route53のTemplateに`HealthCheckCustomConfig`が必要だった

これがなくとも`AWS::ServiceDiscovery::PrivateDnsNamespace`は作成できてしまうので、すぐに気づけなかった
といっても、コンテナが起動し続けなかったのでHealthCheckに失敗しているんだろうな、とは薄々感じていた

以下、サンプル。
これで作成された`"AWS::ServiceDiscovery::Service"`のARNを、ECS Serviceで使用する

```yaml
AWSTemplateFormatVersion: 2010-09-09

Resources:
  Namespace:
    Type: "AWS::ServiceDiscovery::PrivateDnsNamespace"
    Properties:
      Vpc: xxxxxxxxxx
      Name: private.example.

  ServiceDiscovery:
    Type: "AWS::ServiceDiscovery::Service"
    Properties:
      HealthCheckCustomConfig:
        FailureThreshold: 1
      DnsConfig:
        DnsRecords:
          - Type: A
            TTL: 60
        NamespaceId: !GetAtt Namespace.Id
      Name: hoge
```

#反省点
- [Cloudformationのドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-servicediscovery-service.html)しか読んでいなかったこと
    - `HealthCheckConfig`や`HealthCheckCustomConfig`の`Required: No`だったから、書いていなかった
    - 書かなくても、Service Discoveryの設定が行えたので問題ないと思ってしまった

#参考URLなど
https://medium.com/pablo-perez/ecs-service-discovery-to-work-around-lack-of-user-defined-bridge-network-ecs-limitation-6fa6b9672d84
okhttpでgetメソッドを使うときにパラメータを渡す２通りの方法

okhttpのgetメソッドを使うときに、URLの後ろにパラメータをつける方法とリクエストヘッダにパラメータをつける方法が載っていたのでメモです。

[OkHttp3を試す]
(http://pppurple.hatenablog.com/entry/2018/05/31/231625#GET%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%BF%BD%E5%8A%A0)


リクエストパラメータ（URLの後ろにつけるパラメータ）とリクエストヘッダの違いをよく分かっていなかったのですが、リクエストヘッダはおきまりのパラメータをつける場合に使用し、アプリ固有のデータを渡すのにはリクエストパラメータを使うようですね。

リクエストヘッダの使い方として、以下が参考になりました。
[第4回 ＣＤＮの仕組み HTTPヘッダとは](
https://blog.redbox.ne.jp/what-is-cdn4.html)
[HTTPヘッダーを知っていますか？](https://webtan.impress.co.jp/e/2010/01/12/7156)
【備忘録】『改訂新版JAVASCRIPT本格入門』の参考になった部分まとめ

<a href="https://www.amazon.co.jp/dp/B01LYO6C1N/ref=as_li_ss_il?_encoding=UTF8&btkr=1&linkCode=li3&tag=protein078-22&linkId=764b39209c99b214c3e576adf75fa44d&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B01LYO6C1N&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=protein078-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=protein078-22&language=ja_JP&l=li3&o=9&a=B01LYO6C1N" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

間違っているところや気になるところがあれば、コメント欄でガンガンご指摘ください:joy:

### 基本データ型ではnewしない

ダメ絶対

```javascript
var flag = new Boolean(false);

if (flag) {
 console.log('flag is true'); 
}
// result: flag is true
```

### サロゲートペア？

'叱る'は4バイトで表現される。

```javascript
var msg = '叱る';
console.log(msg.length); //result: 3
```
正しくカウントするには？

```javascript
var msg = '叱る';
var len = msg.length;
var num = msg.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g).length - 1;
console.log(msg.length - num); // result: 2
```

### NaNは自分自身を含め全ての値と等しくない

```javascript
console.log(Number.Nan === Number.Nan) // result: false
```
が、しかし**Map**の世界では例外的に NaN === NaN 

```javascript
var m = new Map();
m.set(NaN, 'hoge');
console.log(m.get(NaN)); // result: hoge
```

## eval is evil

eval関数は置き換えを検討する。

## アロー関数

functionはいらない。

```javascript
let getTriangle = (base, height) => {
  return base * height / 2;
}

console.log('三角形の面積：' + getTriangle(5, 2));
```

## JavaScriptでは関数はデータ型の一種

## varなしは全てグローバル変数になる

## ローカル変数は関数の先頭で宣言する

## letはブロックスコープに対応している

でもswitchで使うときには注意。

## JavaScriptは引数の数をチェックしない

## 引数必須にするには？

```javascript
function required() {
    throw new Error('引数が不足しています');
}

function hoge(value = required()) {
    return value;
}

hoge(); // result: Error: 引数が不足しています
```

## argumentsオブジェクトはArrayではない

配列のように扱えるだけ。

## 引数に配列を入れるときは「...」を使う(ES2015)

```javascript
console.log(Math.max(...[15,-3,78,1]));
```

## オブジェクトから特定のプロパティだけを取り出す

オブジェクト丸ごと渡せる。

```javascript
function show({name}) {
    console.log(name);
};

let member = {
    mid: 'Y0001';
    name: 'Yamada Taro';
    address: 't_yamada@example.com';
};

show(member); // result: Yamada Taro
```

## 匿名関数

```javascript
function arrayWalk(data, f) {
    for (var key in data) {
        f(data[key], key);
    }
}

var ary = [1, 2, 4, 8, 16];
arrayWalk(
    ary,
    function (value, key) {
        console.log(key + ':' + value);
    }
);
```

## プロパティを動的に生成する（Computed property names)

```javascript
let i = 0;
let member = {
    name: 'YamadaTaro',
    birth: new Date(1970, 5, 25),
    ['memo' + ++i]: '正規会員',
    ['memo' + ++i]: '支部会長',
    ['memo' + ++i]: '関東'
};

console.log(member);
```

## ページの初期化処理は DOMContentLoaded　で表すのが基本

```javascript
document.addEventListener('DOMContentLoaded', function() {
    document.getElementById('btn').addEventListener('click', function() {
        window.alert('clicked button.');
    }, false);
}, false);
```

## アロー関数の場合、 this は固定される

## setInterval/setTimeout は保証なし

 * あくまで指定された時間にキューに処理を登録するだけ。非同期で後続のコードを実行する。
 * 擬似的な並列処理。
phpstormのターミナルの初期ディレクトリ設定

#ターミナルの初期ディレクトリ設定をしたい
phpstorm内のターミナルで初期に読み込まれるディレクトリは
デフォルトでプロジェクトディレクトリだと思います。

自分は仮想環境でvirtualboxを使用しておりターミナルでアクセスするのは
仮想環境がほとんどなので最初のディレクトリを
vagrant upできるディレクトリに設定しました。

#具体的な手順、やり方
上部メニューバーから
file → settings → tools → terminal → start directory

ここを最初に読み込みたいディレクトリにすれば完了です。
Herokuでデプロイできない場合の対処法

# railsアプリのルートディレクトリをGitのリポジトリに指定してデプロイ
Gitリポジトリの場所によってはリポジトリが見つからないと怒られる
[Herokuにpush時にdoes not appear to be a git repository出た時の対処](https://qiita.com/sayama0402/items/e2c9e65786259dc55e11)

Gitリポジトリのつくるディレクトリがrailsアプリのルートディレクトリじゃないとデプロイできない
[Heroku:Buildpackエラーでハマった](https://qiita.com/arekore0/items/eae550bdbcc78eeac082)
Unity パフォーマンス改善　学んだ事まとめ

個人で勉強しているうちは気にしていなかったのですが、実務として扱うようになるなり勉強が必要となりました。

Unityのプロファイラーで学んだことを下記へまとめていきます。

##動的に生成したTextureとSpriteはしっかり管理しよう！

参考:
[動的に生成したTextureとSpriteはしっかり管理しよう！](http://alien-program.hatenablog.com/entry/2017/11/12/131331)
[【Unity】アセットのUnloadとDestroyについて](http://tsubakit1.hateblo.jp/entry/2016/10/02/232723)

タイトルの通り、Texture2DとSpriteを動的に生成する処理は、コンポーネントしているGameObjectがDestroy（破棄）されてもTexture2DとSpriteが残ってしまいます。

使わないリソースを破棄する方法は例えば、
<ol><li>Resources.UnloadUnusedAssets()を使用する</li><li>foreachで個別にDestroyする</li></ol>
ことが挙げられます。


###Resources.UnloadUnusedAssets()
[Unityスクリプトリファレンス](https://docs.unity3d.com/ja/current/ScriptReference/Resources.UnloadUnusedAssets.html)

>使用していないアセットをアンロードします。

>ヒエラルキーにあるゲームオブジェクト（スクリプトコンポーネントを含む）群で総なめして、アセットが使用されていないかを判断します。静的変数も調査されます。

>しかし、スクリプト実行スタックは 探索されない ため、アセットはスクリプトスタックの中からのみ参照されるため解放され、必要であればそのプロパティーやメソッドのひとつが使用されるときに再び読み込まれます。これはメモリ上で修正されたアセットの場合は特に扱いに注意が必要です。アセットのガベージコレクションがトリガーされる前に EditorUtility.SetDirty を忘れずに呼び出しをするべきです。

Resources.Unloadは,例えばProfilerのMemoryの項目でAssetsと表示される項目をアンロードできます。

それ以外の項目、NotSavedやSceneMemoryに格納される、インスタンス化したオブジェクト群はResources.Unloadでは開放する事が出来ません。これは、実行時に値を変更したMeshやMaterialや動的に生成したTexture、Prefab等が該当します。

###foreachで個別にDestroyする

NotSavedやSceneMemoryの項目に格納される、インスタンス化したアセットに関しては、個別にDestroyで開放します。

```CreateTexture.cs
public class CreateTexture : MonoBehaviour {

    public int m_createCount = 100;
    private List<Texture2D> texture2dList = new List<Texture2D>();
    private List<Sprite> spriteList = new List<Sprite>();

    // Use this for initialization
    void Start () {
        for(int i =0; i < m_createCount; i++)
        {
            Texture2D texture2D = new Texture2D(1000, 1000);
            Sprite sprite = Sprite.Create(texture2D, new Rect(0.0f, 0.0f, 1000, 1000), Vector2.zero);
            texture2dList.Add(texture2D);
            spriteList.Add(sprite);
        }
        DestroyTexture2D();
    }
    
    private void DestroyTexture2D()
    {
        Destroy(this.gameObject);
    }

    private void OnDestroy()
    {
        Resources.UnloadUnusedAssets();
    }
}
```

##特定アセットがメモリから破棄されているか知る方法
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3235363731372f39383534663630352d656631652d306131632d356431312d3935333438623365353031332e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/256717/eb387eac-e8f7-a3b8-498b-d5c77726de9d.png)



Memoryプロファイラーを使用します。
ゲームを実行→アセットがロードしているか知りたいタイミングでTake Smaple: Editorを押す。
→Scene Memoryの中から目当てのアセットを探す。
私の場合は、Texture2Dの画像でした。

例えば、画面遷移後にもう一度TakeSampleし、この画像がなくなっていたならば、意図通り破棄できたと確認できます！

##ガベージコレクション

ガベージコレクションは、不要になったメモリ領域を自動的に解放する機能です。
Unityのガベージコレクションはあまり高性能ではないらしい。

[【Unity】Unity におけるゲーム開発でガベージコレクションを最適化する（翻訳）](http://baba-s.hatenablog.com/entry/2017/10/05/100000)
PHP の http クライアントの使い方 (Post)

Requests というライブラリーを使います。

ライブラリーのインストール

```bash
composer require rmccue/requests
```

```php:http_post.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//  http_post.php
//
//					Jul/31/2023
//
// ------------------------------------------------------------------
require_once 'vendor/rmccue/requests/src/Autoload.php';
WpOrg\Requests\Autoload::register();

fputs (STDERR,"*** 開始 ***\n");

Requests::register_autoloader();

$url = 'https://httpbin.org/post';
$args = array('user' => 'jiro','password' => '123456');

$request = WpOrg\Requests\Requests::post($url, array('Accept' => 'application/json'), $args);

// var_dump($request->body);

var_dump($request->status_code);

$json_string = $request->body;
$data_aa = json_decode ($json_string,true);
print("-----------\n");
var_dump($data_aa["form"]);

print("Host:\t" . $data_aa["headers"]["Host"] . "\n");
print("origin:\t" . $data_aa["origin"] . "\n");
print("url:\t" . $data_aa["url"] . "\n");
fputs (STDERR,"*** 終了 ***\n");

// ------------------------------------------------------------------
?>
```

実行結果

```text
$ ./http_post.php 

int(200)
-----------
array(2) {
  ["password"]=>
  string(6) "123456"
  ["user"]=>
  string(4) "jiro"
}
Host:	httpbin.org
origin:	219.126.139.113
url:	https://httpbin.org/post
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ php --version
PHP 8.2.8 (cli) (built: Jul  5 2023 18:47:24) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.8, Copyright (c) Zend Technologies
```
cloud9でGitコミットできない場合の対処法

# .c9/配下をgitignoreに入れる
.c9/配下はcloud9で作業すると発生するテンプファイルなので
gitignoreに入れることで対応できる

[gitの .c9/metadata/tab0　が何なのか](https://teratail.com/questions/122319)
[Unable to commit to gitbucket from cloud9 because of .c9 files](https://stackoverflow.com/questions/29585860/unable-to-commit-to-gitbucket-from-cloud9-because-of-c9-files?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)
PHP の http クライアントの使い方 (Get)

Requests というライブラリーを使います。

ライブラリーのインストール

```bash
composer require rmccue/requests
```

```php:http_get.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//  http_get.php
//
//                      Jul/31/2023
//
// ------------------------------------------------------------------
require_once 'vendor/rmccue/requests/src/Autoload.php';
WpOrg\Requests\Autoload::register();

fputs (STDERR,"*** 開始 ***\n");

$url = 'https://httpbin.org/get';

$request = WpOrg\Requests\Requests::get($url, array('Accept' => 'application/json'));


// var_dump($request);

var_dump($request->status_code);

$json_string = $request->body;
$data_aa = json_decode ($json_string,true);
print("-----------\n");
print("Host:\t" . $data_aa["headers"]["Host"] . "\n");
print("origin:\t" . $data_aa["origin"] . "\n");
print("url:\t" . $data_aa["url"] . "\n");
fputs (STDERR,"*** 終了 ***\n");

// ------------------------------------------------------------------
?>

```

実行結果

```text
$ ./http_get.php 

*** 開始 ***
int(200)
-----------
Host:	httpbin.org
origin:	219.126.139.113
url:	https://httpbin.org/get
*** 終了 ***
```

次のバージョンで確認しました。

```text
$ php --version
PHP 8.2.8 (cli) (built: Jul  5 2023 18:47:24) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.8, Copyright (c) Zend Technologies
```
ITIL v3 プロセスまとめ　【サービスストラテジ編】

サービスライフサイクルの１つめ、サービスストラテジについて。

##ITILのサービスマネジメント・ライフサイクル

- **サービスストラテジ（Service Strategy）**
- サービスデザイン（Service Design）
- サービストランジション（Service Transition）
- サービスオペレーション（Service Operation）
- - 継続的サービス改善（Continual Service Improvement）

##サービスストラテジとは


＝ITサービスを提供する際の戦略
「どのようにしてサービスを設計、開発、実装をしていくべきか」ということを、
戦略としてまとめたライフサイクル

##戦略を立てる際の4つの子プロセス

Ⅰ ビジネス領域の決定
Ⅱ 提供するサービスの定義
Ⅲ サービスを提供する必要資源の確保
Ⅳ 戦略の構築

###Ⅰ ビジネス領域の決定
顧客の事業にどのようなITサービスが使用されているかを分析。
その分析結果をもとに当社がどのビジネス領域を目指すべきか検討していく。

以下のような項目を活用する。

・当社の強みが最大限に活用できる領域か
・他の企業が簡単に真似できないサービスか
・顧客に対して中長期的にサービスを提供できるか
・顧客に新しい価値を提供できるか

###Ⅱ 提供するサービスの定義
ビジネス領域の中で、どのようなサービスを提供するかを検討する。
提供するサービスがどのように役に立つか(有用性)、どうしたらサービスを継続的に提供できるか検討する。
また、複数のサービスを提供する場合には「サービスポートフォリオ」を意識する。

※サービスポートフォリオとは複数の投資、提供状況などを管理する手法。提供するサービスバランスを見渡し限られた人員、システムなどの配分を適切にする事を実現する。

###Ⅲ サービスを提供する必要資源の確保

サービスを提供するにはCI(構成アイテム)等がどれだけ必要なのか、どのように確保するのかを検討する。
日々変化をする要求に対して人員、プロセス、マネジメント、ナレッジなどの次元を効率よく配分し、投資効果向上を目指す。


###Ⅳ 戦略の構築

戦略には４つのＰが用いられる。

観点(Perspective)     …… 組織の方針、ビジョン
ポジション(Position) …… 市場におけるその組織の位置づけ。他のプロバイダとどう競争するか
計画(Plan)　　　　   …… 現状からどのように達成目標にもっていくか
パターン(Pattern)     …… 繰り返される行動と判断

##サービスストラテジの構成

ITサービス戦略管理
サービス・ポートフォリオ管理
ITサービス財務管理
滋養管理
事業関係管理

##次のプロセスへ

これらの内容は**サービスレベルパッケージ(SLP)**としてまとめられ
次の「２.サービスデザイン(サービス設計)」へ引き渡される。
sshキーの作成方法

# sshキーの作成

```
ec2-user:~/.ssh $ ls
authorized_keys
ec2-user:~/.ssh $ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): /home/ec2-user/.ssh/id_rsa
```
ASP.netでIPアドレスを取得する際の疑問点

参考記事
https://qiita.com/Tood/items/be684ec66c80b1d9b04a

ASP.NET MVCで上記の方法でクライアントのIPアドレスを取得した際の疑問点についてまとめる

##疑問点
・デバッガーなどのローカル環境で行う場合::1の値で取得される
　（まぁ実際にはそんなことはほぼ起こりえない為問題はないだろう）
・社内開発サーバにモジュールをアップし、実行した場合IPは保存されるがローカルIPで保存される。
・グローバルIPで取得できないか、社外サーバの場合はグローバルIPになるか確認が必要
Python3(scikit-learn)を使ってロジスティック回帰

こんにちは！
さて，みなさん，今回はscikit-learnを使ってロジスティック回帰したいと思います．

## 準備
サンプルコードを動かす上で予めいくつかモジュールを読み込んでおきます．

``` python
import pandas as pd
import numpy as np
from sklearn import linear_model
from sklearn.externals import joblib
```

## 機械学習

機械学習には様々な種類のものがあります．大きく分けると以下のように　なります．

- 教師あり学習
- 教師なし学習
- その他(強化学習など)

今回はロジスティック回帰を使うために簡単に教師あり学習について紹介したいと思います．

### 教師あり学習(回帰)
教師あり学習ではデータと正解ラベルの2つの情報が渡されます．
大量のデータから「このデータの正解はこのラベルであった」というパターンを見つけ出して，正解ラベルのないデータに対してもそれを予測するものになります．
教師あり学習はさらに正解ラベルの種類によって回帰と分類に分けられます．
回帰は，正解となる値が連続した数値となるものです．

よく見られる例として：
ビールの売り上げは気温に影響すると言われています.
この情報を元に実際の売り上げと気温のデータを利用して機械学習を行うことで、天気予報から得た翌日の気温から売り上げを予測することが可能になります．

### 学習
- 学習のプロセスではまず，データの収集・前処理から始まります．機械学習は大量のデータからそのパターンを見つけ出すという処理を行うため，それに十分なデータを準備してやる必要があります．
- 学習を行うに際しては，アルゴリズム選択・特徴選択・パラメータチューニングが主なプロセスとなります． 
- モデルを作成したら，学習を行ったモデルがどのくらいうまく予想できるのかを評価します．

### 予測
入力されたデータに対して学習時と同じように特徴抽出を行い，作成したモデルから予測値を求めます．

## sckikit-learn

> scikit-learn (旧称：scikits.learn) はPythonのオープンソース機械学習ライブラリ[2]である。サポートベクターマシン、ランダムフォレスト、Gradient Boosting、k近傍法、DBSCANなどを含む様々な分類、回帰、クラスタリングアルゴリズムを備えており、Pythonの数値計算ライブラリのNumPyとSciPyとやり取りするよう設計されている。

https://www.weblio.jp/content/scikit-learn

## プログラム
### 学習用データ

excelを使ってランダムで20~100点まで100人のjapとengデータ作ります．
xに関しては，japとengの点数の平均は60点以上であれば1，そうでなければ0とします．

train.csv
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179248/9f1be611-88cb-ad9f-2a13-52f19aae8106.png)

### テストデータ

以下の5人は0か1かを判断します．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179248/fef16dbd-ff76-1bf7-5ac3-600fbb60c73f.png)

### コード
```python
import pandas as pd
import numpy as np
from sklearn import linear_model
from sklearn.externals import joblib

def main():
    train = pd.read_csv("train.csv", sep=",") #(1)
    explanatory = train.loc[:, ['jap', 'eng']].values #(2)
    response = train['x'].values #(3)

    # 学習（ロジスティック回帰）
    clf = linear_model.LogisticRegression(random_state=0)
    clf.fit(explanatory, response)

    # ロジスティック回帰の学習結果
    regression_coefficient = clf.coef_
    segment = clf.intercept_
    print("回帰係数:{}".format(regression_coefficient))
    print("切片:{}".format(segment))
    print("決定係数:{}".format(clf.score(explanatory, response)))

    test = pd.read_csv("test.csv", sep=",") #(4)

    # 学習結果の検証（テスト用データjap, engを入力）
    x_test = test.loc[:, ['jap', 'eng']].values
    predict = clf.predict(x_test)

    print("検証結果：{}".format(predict)) #(5)
    joblib.dump(clf, 'train.learn') #(6)

if __name__ == "__main__":
    main()
```

### コード解説

(1): 学習用のデータを読み込み(train.csv)
(2): 説明変数をjap, engと定義
(3): 目的変数をxと定義
(4): テスト用データの読み込み(test.csv)
(5): 検証結果の表示
(6): 学習結果を出力

実行結果は以下の図となります．

<img width="303" alt="スクリーンショット 2018-10-05 17.12.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/6336c781-649a-e9eb-87b9-2325790dd3c5.png">

結果を見てみるとテストデータの2行目は0となっています．点数の平均は41点となっています．これは正確に判断することができました．
テストデータの3行目は1となっていますが，点数の平均は57点となっています．60点以上であれば1だが検証結果は0となっています．これは正確に判断することができませんでした．

このように学習データによって正確に判断することができません．学習データの数をもっと増やすとより正確な判断結果を得られることができます．
是非色々試してください．

以上で，今回のPython3(scikit-learn)を使ってロジスティック回帰は以上で終わります．
読んでいただいてありがとうございます．
filemaker-ruby を Rails で使う場合のプラクティス

# filemaker-ruby
`filemaker-ruby` とは Ruby で FileMaker XML API を扱うための gem です。以下がリポジトリになります。
https://github.com/mech/filemaker-ruby

# filemaker-ruby を Ruby on Rails で使う
`filemaker-ruby` は単体の Ruby で用いることができますが、Rails でも用いることができます。ただ、その際にいくつかの注意点があり、[公式ドキュメント](https://github.com/mech/filemaker-ruby/blob/master/README.md) では分かりにくい部分かもしれませんのでまとめておきます。

# 準備
## config/filemaker.yml を用意する
`config/filemaker.yml` を用意します。このファイルが無い場合は rails コマンドが失敗してコンソールやサーバが起動しません。要件さえ満たしていればとりあえずハリボテでも構いません。

ハリボテの場合の `config/filemaker.yml` は以下のとおりです。

```yaml
development:
  default:
    host: foobar
    account_name: foo
    password: bar
```

`config/database.yml` とほぼ同じ書式です。実行環境名が一番上の階層に来て、その下には任意の設定名が来ます。任意の設定名として `default` と命名していますが、これは自由に変更して構いません。後ほど呼び出し時に指定する名称です。

設定を正式に書く場合は `account_name` や `password` は環境変数から呼び出すのが良いでしょう。

## Rails の中で Filemaker オブジェクトを作る
`config/filemaker.yml` を正しく配置できたならば `Filemaker` クラスのオブジェクトを以下のように作ることができます。ここで `default` は `config/filemaker.yml` 内で記述した名称です。

```ruby
fm_client = Filemaker.registry['default']
```

## 生成したオブジェクトを取り扱う
オブジェクトが生成されたならあとはそれを操作するだけです。例えば以下のメソッドでは、次の条件を満たすレコードを返します。

- データベース名が `my_database`
- レイアウト名が `my_layout`
- 上記のデータベース＆レイアウトの中で、「foo」というフィールドが「bar」であるレコード（完全一致） 

```ruby
records = fm_client.database['my_database'].layout['my_layout'].query({ 'foo': '==bar' })
```

返されるレコードは複数（Filemaker::Resultset クラスのオブジェクト）です。あとは `each` なり `map` なりでそれを取り扱ってあげればよいです。

# 発展
いくつか発展的な事項を付記しておきます。

## 1. 日本語環境ではエラーメッセージのエンコードに失敗して例外を吐くことがある
具体的には[私が出しているプルリクエスト](https://github.com/mech/filemaker-ruby/pull/12)を見ていただきたいのですが、日本語（というか非アルファベット）環境ですと、一定のエラーメッセージを吐き出すときにエンコードに失敗し例外を吐いて止まってしまいます。

このエラーメッセージは Ruby のエラーメッセージではなく、`filemaker-ruby` が生成しているエラーメッセージです。

私が出したプルリクエストではこのメッセージを強制的に UTF-8 に変換することで例外を吐くことを回避しています。日本語環境ではこの点に留意しておいたほうがいいでしょう。

2018年10月10日現在、まだマージされていませんので、適切に対処してください。

## 2. Sidekiq のジョブで実行するとメモリを食いつぶす
[Sidekiq](https://github.com/mperham/sidekiq) のジョブとして `filemaker-ruby` を用いると、その実行周期が短い場合（だいたい1秒毎ぐらい）にはメモリを食いつぶしてマシンがフリーズします。

これは [Sidekiq の Wiki に書いてあるように](https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting)、`filemaker-ruby` が `typhoeus` という gem を使っているのが原因です（下記）。
https://github.com/mech/filemaker-ruby/blob/master/filemaker.gemspec#L21

この点にも留意しておく必要があります。
まとめテスト

<a href="https://qiita.com/chiyoco88/items/90d5227ce0fdcfec84ed">
Windowsメモ帳のメニュー と viエディタコマンド の対応</a>

<a href="https://qiita.com/chiyoco88/items/73646daef037061e4350">
Eclipseでデバッグするには</a>

Qiitaのまとめ・リンク機能を探していますが、みつからない・・・。
Twitter API利用時のアプリ申請フローが既存ユーザーと新規ユーザーで違う件

TwitterのAPIの仕様がちょくちょく変わる中、APIを使うためのKeyの取得方法もこれまでにアプリの登録をしたか、してないかで新規アプリの作成にかかる時間が違ったのでメモ。

(追記)
1ユーザーで作れるクライアントApp数に制限ができていた。
<img width="1013" alt="ss_ 2018-10-15 15.53.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/5534/d54b694b-93ae-a6d8-9c2c-426be5c310d4.png">

1つのアカウントで登録できるのは10個までの様子。



## 共通の仕様
- 開発者は電話番号必須（割と前から）
- https://dev.twitter.com/ (旧開発者ページ) は https://developer.twitter.com/ にリダイレクトされる
- アプリを新規作成する場合は新しく開発者登録が必要
  - 組織/個人利用どちらか、主な使用用途、どういうものを開発する予定か
  - 下手な英語で書いたけど一応通った(既存・新規アカウント両方)。日本語はさすがにダメかも。
- いままでのアプリの他に[Premiaum API](https://developer.twitter.com/en/docs/tweets/search/api-reference/premium-search.html)のSandboxも利用できるようになる
- 新しいアプリ一覧ページは https://developer.twitter.com/en/apps に変更
- 以前からある形式のアプリの登録は1日で3件まで
    - development, staging, production 用というイメージなのだと思う


### 前からアプリを作っていたアカウントでのアプリ作成

- 一応以前作成したアプリのキーは使える
    - ただしいつか止められる可能性はある
- https://apps.twitter.com/ では新しいアプリの追加ができなくなってる
- アプリ追加には再度開発者登録が必要
    - これまでのアプリをレビューしているらしく、審査に少し時間がかかる
    - 既存アプリのAPI使用方法に問題がある場合はメールで注意が来るので修正する
      - [同じ目的での重複登録](https://twittercommunity.com/t/policy-clarification-multiple-applications-for-the-same-use-case/92080)だったら1つにしろとか
- 問題がなければこれまでと同じ項目入力で新しくアプリが登録出来るようになっている

## 新規アカウントでのアプリ作成

- 電話番号の登録必須
- 開発者登録
  - 既存開発者と同じ
- アプリ登録
  - 既存開発者と同じ

待ち時間なくスムーズに終わる。
Java更新を完全に停止したい

業務アプリケーション上、指定したJava versionをインストールしないと
いけない状況だったため以前のJavaをインストールしましたが、
Java8への更新の通知が一切消えず、解消方法が見つかったので
備忘録代わりに記事を残します。

※ちなみにJava7ｲﾝｽﾄｰﾙ時の内容です。

##**Javaの設定から更新タブを非表示にする**
HKEY_LOCAL_MACHINE\SOFTWARE
\JavaSoft\Java Update\Policy\EnableJavaUpdate
値を1から0に変更することで、Java画面上の「更新」が非表示になります。


##**常駐するjusched.exeを停止する**
アップデートを実行しているプログラムを停止することが可能です。
HKLM\SOFTWARE\Wow6432Node
\Microsoft\Windows\CurrentVersion\Run\SunJavaUpdateSched
上記レジストリーを消すことで常駐する「jusched.exe」が起動しなくなります。
念のため、レジストリーキーのバックアップも推奨致します。
※再起動後、反映します。

レジストリの変更は、自己責任となりますのでご注意くださいませ。
pyenvでインストールを実行しようとしたら"no such command `install' "となる

バージョン切り替えができるようUbuntuでもpyenvでインストールを実行しようとしたところ、以下のエラーが発生。

```bash
$ pyenv install --list
pyenv: no such command `install'
```

cloneし直したりしても一向に直らず苦戦。
時間をかけて解決したので共有します。

# 環境
環境はVM上のUbuntuです。

- VMware：VMware Fusion 11 Pro
- Ubuntu：Ubuntu 18.04 LTS（日本語Remix）

# 実行内容
## 1. pyenvをホームディレクトリに .pyenv としてclone
まずはpyenvをGitHubからclone。

```zsh
$ git clone https://github.com/pyenv/pyenv ./.pyenv
```

## 2. pyenvの環境変数を設定
続いてpyenvの環境変数を設定。
自分はzshを使用しています。
コピペする際はご自身の環境をご確認ください。

```zsh
$ cat << EOF >> ${HOME}/.zshenv
export PYENV_ROOT=\${HOME}/.pyenv
export PATH=\${PYENV_ROOT}/bin:\${PATH}
eval "\$(pyenv init -)"
EOF
$ source ${HOME}/.zshenv
```

## 3. Pythonインストール用のパッケージをインストール
Pythonのインストールに必要なパッケージをあらかじめインストールしておきます。

```zsh
$ sudo apt-get install -y zlib1g-dev libbz2-dev libreadline6 libreadline6-dev 
 libsqlite3-dev libssl-dev
```

## 4. インストールできるものを確認
最新版のanacondaをインストールするためにリストを表示しようとしました。
すると…

```zsh
$ pyenv install --list
pyenv: no such command `install'
```

似たような状態の記事を発見したので、こちらを参考にしてみました。
[pyenvでinstallが見つからなかった
](https://qiita.com/4geru/items/b645a6f2d9a8cb0e94d2)
しかし一向に状況は変わらず…

# 解決方法
別な記事を発見。
コメントからプラグインの存在を知りました。
[pyenvでno such command `install'というエラー](https://teratail.com/questions/116260)

そこで、プラグインのインストールシェルを回してみることに。
（一般ユーザーで行ったところ、スーパーユーザー権限が必要な部分がありました。）

```zsh
$ sudo ./.pyenv/plugins/python-build/install.sh
```

これを行ったところ、問題が無事解決。
`install`コマンドが利用できるようになりました。

# 参考
- [【pyenv】Ubuntu16.04にPython環境を構築する【2018年】](https://qiita.com/hashibiroko/items/60a685e50aebbde7f84e)
- [pyenvでinstallが見つからなかった
](https://qiita.com/4geru/items/b645a6f2d9a8cb0e94d2)
- [pyenvでno such command `install'というエラー](https://teratail.com/questions/116260)
Pillowを日本語縦書きに対応させる


# (追記 2019.12.14)
Pillowは少なくとも Ver6以降(+raqmの0.7以降)で日本語縦書きが可能になっています。
本記事の内容は古いものなのでご注意下さいませ。


# 前置き

ずいぶん前に以下の記事を投稿しました。

[テキストデータから小説体の縦書き画像を生成する](https://qiita.com/masushin/items/5046df9090e3add4d773)

xmlで記述したテキストから、日本語の縦書き画像を生成するというものです。記事を書いた時点ではPillowが縦書きの文字描画に対応していなかったので、フォントファイルに手を加えて強制的に縦書き用のグリフを描画する事で縦書き描画をしていました。

その後、Pillowはバージョンがあがり、4.2.0で、テキストの描画方向を指定できるようになりました。ところが、いざ試してみると全く正しく動作しません。Pillowのコードを調べてみると、実際にはy_advanceの値を考慮しておらず縦書きに全く対応していませんでした。

# 修正してみる

というわけで、forkして、手元で修正をしてみました。
https://github.com/masushin/Pillow

```python
from PIL import Image, ImageDraw, ImageFont

txt = Image.new('RGBA', (200,300), (215,215,220,255))
fnt = ImageFont.truetype("GenEiKoburiMin-R.otf", 24, layout_engine=ImageFont.LAYOUT_RAQM)
d = ImageDraw.Draw(txt)
d.multiline_text((120,20), "パパの動かす車なんて、\nあぶなくてのれますか。", spacing=24, font=fnt, fill=(0,0,0,255), direction="ttb")
txt.show()
```
このコードで、以下の画像が表示されます。ちゃんと縦書きのグリフが使われていますね。
![tmpzek65m96.png](https://qiita-image-store.s3.amazonaws.com/0/123579/eb73398b-9a39-83cd-e934-2ee10f0de6d9.png)

# 修正の概要

ほぼ自分向けの備忘録になりますが、

![glyph_image.png](https://qiita-image-store.s3.amazonaws.com/0/123579/50432999-fc0c-7def-84df-fa63ab211630.png)

freetypeからはbounding box(グリフを含む最小矩形)に相当するサイズのビットマップデータが得られます。これを1文字毎に、Pillowのイメージ上の適切な位置に転送していく必要があります。
PillowのAPIから指定された描画始点を上図でのorigin(黒の四角点)であるとすると、raqmライブラリから得られる水平オフセット位置(x_offset)から、bounding boxの最小x(xMin)だけ正方向に位置するのがグリフの左端位置になります。
また、originからascender値だけ下方向に水平のベースラインがあるのでここから、bouding boxの最大yだけ上方向に位置するのがグリフ上端としました。
グリフを上端からグリフの高さ(height)だけビットマップを転送します。
次の文字を描画するには、originをy_advanceだけ加算して、次の文字の描画基準となるoriginを求め、以降同様の処理を行ないます。
Excelでフィルター機能を使用したときの抽出漏れを防ぐTips

# 1. はじめに
Excelでの資料作成ってなくならないですよね。
今回はExcelでのフィルター機能を使用したときに痒いところに手が届くTipsを投稿します。
※手作業でやると結構時間かかるし、面倒なことをマクロで自動化します。
※同じような作業をしている方の作業時間短縮に貢献できれば幸いです。

#2. こんなことありませんか？
以下の図のように、Excelで案件と作業者を管理しているようなファイルがあるとします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146632/90471c13-fb62-7c1c-3c2c-9975cdb94d83.png)

これをC案件でフィルタリングすると、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146632/bf4d54c1-553f-e132-6844-0ccf320602d5.png)

こうなりますよね。

これだと困るので、空白部分を上の案件名で白文字埋めしてほしいというのが私への作業依頼でした。

白文字埋めしておくと、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146632/513aadf8-907b-aa98-067e-f412603976e0.png)

こうなるわけですね。

この例だと数が少ないので大したことないですが、手作業で数千行とかの単位になってくると泣けてきます。

```
僕は何をやっているんだろうと。こんな作業さっさと終わらせてやる！！！
```

#3. マクロを作成
ということで、この作業を自動化するために稚拙なマクロを作成しました。

```
Sub CreateWhiteWordCells()
    Dim i As Long
    Dim j As Long
    Dim cellValue As String
    
    For i = Selection(1).Column To Selection(Selection.Count).Column
        For j = Selection(1).Row To Selection(Selection.Count).Row
            If Cells(j, i).Value <> "" And Cells(j, i).Font.Color <> RGB(255, 255, 255) Then
                '白文字でないセルデータが存在する場合
                'コピー元のデータを保存
                cellValue = Cells(j, i).Value
                GoTo CONTINUE
            Else
                If Cells(j, i).Interior.Color = RGB(255, 255, 255) Then
                    'セルが白色の場合は白文字でコピー
                    Cells(j, i).Value = cellValue
                    Cells(j, i).Font.Color = RGB(255, 255, 255)
                End If
            End If
CONTINUE:
        Next j
    Next i
    
End Sub
```

はい、内容は非常に単純です。一応簡単に説明しておきます。

1. ユーザが選択したセル範囲を列行でループしてセルを参照していきます。
2. セルに文字入力がある、かつ白文字でない場合はコピー元の文字列と認識します(コピーする条件)。
3. 2.以外でセルが白色の場合(コピーされる条件)、白文字でコピーします。

#4. おわりに
コピーする条件、コピーされる条件はそれぞれ異なるかと思いますので、状況に合わせて変えていただければ使用できるのではないかと思います。
技術者の方々にはこんなのフツーってなるかもしれませんが、そうでない事務作業をされている方々の助けに少しでもなればと思います。
マクロって地味に便利ですよね。
DokuWikiをアップグレードしたらinc/Plugin.phpがなくて動かなかった

# はじめに

- ひさしぶりに自分の``Dokuwiki``を開いたら``Upgrade``の案内が出ていた
- ``2017-02-19e "Frusterick Manners"`` → ``2018-04-22a "Greebo"``にアップグレード
- ``HTTP Error 500 : This page isn't working``と表示された(｡ŏ﹏ŏ)

# アップグレードの手順

1. ``DokuWiki``に``Admin``権限を持つアカウントでログイン
1. プラグインマネージャを使って``Wiki Upgrade``プラグインを最新版に更新（ついでに、他のoutdatedなプラグインを更新した）
1. 念のため（というか過去に一度失敗しているため）``dokuwiki``フォルダのバックアップ（``dokuwiki.zip``）を作成
1. ``Wiki Upgrade``プラグインに従って進める。すべてOKで終わる
1. ・・・なのに、ページが表示されない(｡ŏ﹏ŏ)うわ～ん


# ``issue``を探した

- 同じようなことで困っている人は必ずいるだろうと思って、[DokuWiki GitHubリポジトリのissue](https://github.com/splitbrain/dokuwiki/issues)を検索
  - ``this page isn't working``で検索してもヒットしない
  - ``HTTP Error 500``の``500``で検索したらヒット！
  - https://github.com/splitbrain/dokuwiki/issues/2340
- ここに書いてあるとおりに inc/Plugin.php を作成
  - ファイル名が大文字／小文字の``case sensitive``な話以前に、``inc/plugin.php``すらなかった（なんで？``2018-04-22 "Greebo"``をスキップしたから？？）
  - パーミッションは``644``でOKだった
- 自分の``DokuWiki``のURLをリロードしたら表示された！٩(๑´3｀๑)۶
NoOps Meetup Tokyo #1 カンファレンスノート

2018/9/12 NoOps Meetup Tokyo #1 に参加してきましたので、いまさらですがノートを残します。

# イベント情報
[NoOps Meetup Tokyo #1 recovery - connpass](https://noops.connpass.com/event/95088/)
資料もこちらにいくつか上がっています。

> **NoOps = No "Uncomfortable" Ops**
> NoOps Japanでは 「システム運用保守の"嬉しくないこと"をなくそう！」 をテーマに、 NoOpsを実現するための技術・設計手法・開発運用保守サイクル・ツールや考え方・事例などを共有していきたいと考えています。
> NoOps meetup Tokyo #1では、Architecture、Technology、SRE のそれぞれの分野で活動されている第一人者の方より、NoOpsへの取り組みやスタンスについてお話しいただきます。

# 資料リンク集
- [NoOps Meetup Tokyo #1 Opening](https://www.slideshare.net/hiromasaoka/noops-meetup-tokyo-1-opening)
- [NoOps?よろしいならば戦争だ](https://www.slideshare.net/ToruMakabe/noops-114039948)
- [NoOps at Yahoo! JAPAN #NoOpsJP](https://www.slideshare.net/techblogyahoo/noops-at-yahoo-japan-noopsjp)
- [15分で分かる NoOps](https://www.slideshare.net/hiromasaoka/15-noops)
- とぅぎゃり：[NoOps Meetup Tokyo #1 recovery( #NoOpsJP ) - Togetter](https://togetter.com/li/1266131)

# NoOps?よろしいならば戦争だ / 真壁 徹 `@tmak_tw` 日本マイクロソフト
- 誰もがOpsを抱えている、Dev-Opsは単純化しすぎ
- 現状認識
    - 新しく作るシステムはNoOpsしやすい（GreenFiled）
    - SRE組織化するが、従来型の運用も残る
    - 自動化、無人化の裏で人間が関わっており、自動化が壊れたときは人間が運用する
- GreenFieldパターン
    - 新しく作るシステムはNoOpsしやすい、アプリ実装者がNoOpsを考えた設計をする
- 運用者の自発的進化（リアクティブ）
    - 日々やっているプロセスや作業を進化させ、トイルをなくすパターン、アプリの作りまで踏み込まないことが多い
- SRE組織化パターン（プロアクティブ）
    - より能動的に可用性を高め、アプリの作りまで踏み込むアドバイザーとなる
- NoOps Japan Community への提案
    - Disらずに改善しよう
    - べき論はいらない（ハードル上げすぎない）
    - やめるファースト
- NoOpsな技術とストーリーを共有し、コミュニティと「決定者」へコミットしよう

# コンテナにおけるNoOpsオートメーション / Ian Lewis `@IanMLewis` Google
- NoOpsはOpゼロではなく、Automationを増やすことによりOpを減らす事が目的
    - NoOpsというかLess Ops
- LinuxカーネルとApplicationはAPIでやりとりしているので、ContainerはLinuxカーネルとApplicationのAPIと考えることができる
- ApplicationはServerless APIのレイヤを挟むとよりロギング、モニタリング、Scaling等のレイヤも疎結合にできるのでAutomationに役立つ

# わが家のNoOps / 塚 譲 Yahoo! JAPAN
- @ITの記事読んで
- SRE的価値観；Toilを無くそう
    - リアクティブで対症療法をやっていくのではなく、プロアクティブな改善していくほうが楽しい
    - 真面目にSREをやるとNoOpsの価値観に行き着く、効率良く働くことが大事
- 1.可観測性（Observability）を向上させる
    - 向上→監視、計測、分析、追跡...
    - やらないことを決める、経過観察や評価手法を計測
- 2.チームができることを増やす
    - モダンな働き方へ；自働化、ペアプロ、モブプロ、開発基盤の提供
    - 自分たちがいいチームになる
        - 誰かのために働く；僕は部員のために、チームは社内クリエイターのため、社内クリエイターはエンドユーザのために
        - チームのToilをなくす、社内クリエイターのToilをなくす、ユーザのToilをなくす
        - リードタイムを短くする；イテレーションのゴールに注力、定期に安定した機能を提供し続ける

# NoOpsの目指す世界 / 岡 大勝 `@okahiromasa` NoOps Japan 発起人
- NoOps = No Uncomfortable Ops(嬉しくないOps)
    - ユーザの体験を妨げないシステム運用保守の実現
    - 運用保守の現場で発生するトイルの最小化
    - システム運用保守のリリーススとコストの最適化
    - 利用者の利益とOpsの負荷は比例する
- 価値観の転換
    - 10年末前：「壊れないシステム」「MTBF至上主義」
    - いま：高価な専用機器を大切に使う ->  安価な汎用機器を入れ替えながら使う
- 回復性 が重要に
    - Design for Robustness(堅牢性) -> Design for Failure(対故障) -> Design for Resiliencty（回復性）
    - 物理クラスタ -> 仮想マシン・VM -> サーバレス・コンテナ
    - 壊れない -> いつでも回復できる へ
    - 高い復元力があれば：障害発生時の自己回復、オンザフライでのインスタンス変更、秒単位のスケールアウト/イン（コスト最適）
    - 必要な能力：Observablility(観察力)、Configurability(構成力)、Resiliencability（復元力）
- レイヤ
    - ミドルウェアだけでは不十分、アプリケーションにも回復力を持足せる必要がある
    - 処理単位を小さく、ステートレス、非同期、冪等性、処理結果を記録、
    - いつ落ちても、どこで落ちても
- NoOpsを実現するチーム(サイクル)
    - 1.回復性設計を最初に行う
    - 2.運用保守エンジニアリングで手動運用を自立化
    - 3.機能追加で手動運用が増えても、２で自動化
    - システム規格時点で、非機能要求のハードルを思い切り上げる（頭をつかう）
- 付録：CnCF Landscape みたいな NoOps Landscapeを作りたい
Railsチュートリアル10章（10.1.1演習2）の誤訳について

___
***※本記事は翻訳者の方によりご対応いただきましたので読む必要はありません。ありがとうございます。（2018/10/10 追記）***
___

Railsチュートリアルの翻訳で誤訳と思われる箇所がありましたので投稿いたします。

####[該当箇所：10.1.1演習2](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#cha-10_footnote-ref-3)

>例えば筆者であれば、リスト 10.5のテクニックをリスト 10.6に適用してみたり、リスト 10.7のテクニックをリスト 10.5に適用してみたりするでしょう。


####[原文](http://www.railstutorial.org/book/updating_and_deleting_users#cha-10_footnote-ref-3)
>My suggestion is to use the variable-passing technique shown in Listing 10.5 to pass the needed URL from Listing 10.6 and Listing 10.7 to the form in Listing 10.5.

翻訳では、"...from Listing 10.6"に続く"and"で区切って2つの文の並列と捉えていますが、この"and"は"Listing 10.6"と"Listing 10.7"を並置しているものと考えられます。構文は"to pass A to B"となっており、"the needed ... Listing 10.7"がAに当たります。
これを踏まえて訳すと次のようになります。

####修正案（直訳）
>筆者の提案は、リスト10.5に表される変数渡しのテクニックを用いて、リスト10.6や10.7で要求されるURLを10.5のフォームに渡すというものです。

ここでの演習課題は、"provide"と"yield"を用いて、リスト10.5のform_forメソッドにリスト10.6と10.7からURL変数を引数として渡してあげるテクニックが問題となっています。（[解答例参照](http://mochikichi.hatenablog.com/entry/2017/03/07/213517)）

ところで、原文にある"shown in Listing 10.5"というのは少し冗長でもあり、正確にはまだ示されているわけでもない（問題を解くことで示されることになる）ので誤解を招かぬよう省略して訳したいところです。

以上を踏まえ、もとの翻訳を活かした形での修正案は以下のようになります。

####修正案（意訳）
>例えば筆者であれば、変数渡しのテクニックを用いることで、リスト10.6やリスト10.7で要求されるURL（変数）を（引数として）リスト10.5のフォームに渡すでしょう。
アクティブなセルの値取得

```
function GetActiveCell() {
  var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var objSheet = objSpreadsheet.getActiveSheet();
  var objCell = objSheet.getActiveCell();
  Logger.log("値 : " + objCell.getValues());
  
}
```

メモ：暇があったらやりたいこと
セルで使える関数化
=GetActiveCell('出力セル'！A2)
みたいな
トリガーはどうするんだろ？

参照
https://qiita.com/kazuki5555/items/a74103557f753ed44096
metabase3分クッキング

こんばんは。この季節サンダル通勤で足が冷えてくるmorifujiです

今回はmetabaseを使う機会があったのでサクッと構築したlogを置いておきます。

- クライアントはBIツールが欲しいらしい
- tableauは高い&運用費も高い(m4.2xlargeぐらい)
- もっとサクッとかつ簡単なBIツールないんかなー

ということでmetabaseの登場です。

- slack連携
- メール連携

を使えば**テーブルAのデータがある基準に達したときにslackやメールで通知ができる**みたいです、すごいですね

# 環境
- aws EC2
  - t2.medium
  - Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-06cd52961ce9f0d85
     -  amazonlinux2を使いたかったですが、デフォでjavaが入っているのか怪しかったので避けました。
- metabase
  - v0.30.4
  - http://downloads.metabase.com/v0.30.4/metabase.jar

# スクリプト

```
# 以下、ec2インスタンス内。

mkdir metabase
cd metabase
wget http://downloads.metabase.com/v0.30.4/metabase.jar

# javaバージョン確認
java -version

# 1.8>versionだったら
sudo yum update -y
sudo yum install -y java-1.8.0-openjdk.x86_64
# versionを1.8以上に切り替える
sudo alternatives --config java

# 確認
java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)


# `java -jar metabase.jar`でエラーが出たので修正
sudo echo "10.0.0.219 ip-10-0-0-219" | sudo tee -a /etc/hosts


# 実行
java -jar metabase.jar


# localhost:3000/setupにてGUIなセットアップができる！！
```

# 課題
- metabaseのデータがインスタンスの停止などで消える可能性があるので何かしらでバックアップが必要
  - 手段1. ebsでマウントしておく
  - 手段2. metabaseのデータ保存先がデフォルトh2なので、rdsにする
  - ~~余裕あればまた別記事で書きます。~~ 軽かったのでこの記事に描きました



# metabaseのデータバックアップ

データをrdsに保存したいなら、以下の環境変数を設定するとdbに繋げてくれます。以下はmysqlの例です

```
export MB_DB_TYPE=mysql
export MB_DB_DBNAME=metabase
export MB_DB_PORT=3306
export MB_DB_USER=xxxxxxxxxxxx
export MB_DB_PASS=xxxxxxxxxxxx
export MB_DB_HOST=xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com

# この後にjavaコマンド
```

# バックグラウンド化

`java -jar metabase.jar`してもフォアグラウンドなのでssh切ったら止まります。(当たり前)

なのでバックグラウンドで起動できるようにしましょう

```
nohup java -jar metabase.jar > out.log &
```

この例だとout.logにログが測れますね


# 参考
>https://www.yoheim.net/blog.php?q=20180101
>