OmniAICreator/Qiita-1.07M huggingface dataset:
cordova-plugin-ibeaconのバックグラウンド関連忘備録

#cordovaでのiBeaconバックグラウンドここがミソ
MonacaにてiOS、Androidのとあるアプリを開発・苦戦中です。

なんとかバックグラウンド状態でのdidEnterRegion・didExitRegion感知にこぎつけたので寝て忘れる前にメモ。

##アプリをkillしたとき
iOSは動い続けるけどAndroidは死亡する
https://altbeacon.github.io/android-beacon-library/resume-after-terminate.html

##Angular使うならcontrollerの中にビーコン処理書いちゃダメ
iOSでアプリをkillしたとき。感知すると内部的にアプリを起動するそうな。でもcontrollerの中にビーコンのdelegateとかがあるとたどり着けない

##didExitRegionが呼ばれるまでに
Androidは約12秒、iOSは約35～40秒かかる

ここに来るまで3人日は使ったなあ～
DataFrame各列の欠損率を集計する

# 要約

* `df.isnull().sum() / len(df)`で出来ます。

# 動機

* DataFrame内の多数の列に対して、ありにも欠損が多い列を列ごと`drop`したい。
* その前に、そもそも各列がどのくらい欠損してるのか調べたい。

# やり方

## 準備

```python
import numpy
import pandas
```

## 欠損があるDataFrameを作る

こんな感じで欠損がある`DataFrame`を作る。

https://qiita.com/sabaku20XX/items/c9c3d59b87f2b42a1c03

```python
dataset.head()
```

<img width="718" alt="JupyterLab.png" src="https://qiita-image-store.s3.amazonaws.com/0/240919/a5f08205-3310-dc97-53b1-4aa2f6f2ab97.png">

## 欠損の数をカウントする

pythonの`bool`型は1と0みたいな振る舞いをする(；´Д｀)

```python
True + True + True  #=> 3
```

```python
False + False + False  #=> 0
```

numpyもそんな感じ。

```python
numpy.array([True, True, True]).sum()  #=> 3
```

なので`isnull()`が返してくる`bool`を`sum()`する事で各列の欠損数がカウント出来る。

```python
dataset.isnull().sum()
```

```:output
0     8
1     9
2    15
3     5
4    13
5     8
6     8
7    10
8     5
9    11
dtype: int64
```

※0〜9は列名で、それぞれの欠損数がカウントされています。

## 欠損率を計算する

欠損数を`DataFrame`の行数で割れば、欠損率になる。

```python
dataset.isnull().sum() / len(dataset)
```

```:output
0    0.08
1    0.09
2    0.15
3    0.05
4    0.13
5    0.08
6    0.08
7    0.10
8    0.05
9    0.11
dtype: float64
```

## 見やすくする

`DataFrame`にまとめて欠損率順にsortすると見やすい。

```python
null_count = dataset.isnull().sum()
null_rate = null_count / len(dataset)

null_table = pandas.DataFrame({
    'null_couunt': null_count,
    'null_rate': null_rate
})

null_table.sort_values(by='null_rate', ascending=False)
```

<img width="175" alt="JupyterLab.png" src="https://qiita-image-store.s3.amazonaws.com/0/240919/916b8b2b-737c-6f67-a5f6-88be5d25c667.png">

この場合、`index`がカラム名です。
MySQLでいろいろ試す時のインストール手順 (CentOS7.5)

すぐに忘れるのでメモ書き。
対象OSはCentOS7.5.1804。

### リポジトリの追加

```
sudo rpm -ivh http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
```

### パッケージの切り替え（MySQL5.7をインストールするとき）
MySQL8.0をインストールする場合は実施不要。

```
sudo yum-config-manager --disable mysql80-community
sudo yum-config-manager --enable mysql57-community
```

リポジトリ定義ファイルは以下で確認可能。

```
vi /etc/yum.repos.d/mysql-community.repo
```

### MySQLのインストール

```
sudo yum install mysql-community-server
```

### MySQLの起動

```
sudo service mysqld start
```

### 初期生成パスワードの確認
rootユーザーの初期パスワードを確認する。

```
grep 'temporary password' /var/log/mysqld.log
```

### MySQLにログイン
以下コマンドを入力するとパスワードの入力を求められるので、上記で確認したパスワードを入力する。

```
mysql -u root -p
```

### パスワードポリシー（文字長、複雑さ）の変更
初期状態ではシステム変数以下のようなパスワードポリシーとなっている。

```
validate_password_length=8 // パスワードの長さは8文字以上
validate_password_policy=MEDIUM // パスワードに大文字、小文字、数字、記号のすべてを最低1文字以上含む
```

簡単なパスワードを設定可能にするため（本番では当然良くないが、検証用のため）以下の通りシステム変数を変更する。（パスワードの長さは4文字以上、文字種は問わない）

```
SET GLOBAL validate_password_length=4;
SET GLOBAL validate_password_policy=LOW;
```

### パスワードの変更

初期パスワードを変更しない限り他の操作が行えないため（上記のシステム変数設定は可能）、パスワードを変更する。

```
set password for root@localhost=password('xxxxxxxx');
```
Clojure データ型

##整数除算演算子
##mod

```clojure
user=> (mod 7 3)
1
user=> (mod -7 3)
2
```

##rem

```clojure
user=> (rem 7 3)
1
user=> (rem -7 3)
-1
```

##quot

```clojure
user=> (quot 7 3)
2
user=> (quot -7 3)
-2
```
DataFrameのランダムな位置を欠損させる

# 概要

* `numpy.random.choice`で`df.index`, `df.columns`からランダムな位置を選んで`None`を代入する。

# 準備

まず欠損がない`DataFrame`を作る。
中身は乱数。

```python
import numpy
import pandas

# 10列 x 100行の行列
raw_data = numpy.random.rand(100, 10)

# DataFrameに変換
dataset = pandas.DataFrame(raw_data)
```

中身を確認してみる。

```python
dataset.head()
```

```:output
	0	1	2	3	4	5	6	7	8	9
0	0.454606	0.588927	0.069021	0.731899	0.086673	0.455759	0.327314	0.098544	0.278383	0.769963
1	0.746437	0.302383	0.397083	0.234455	0.793625	0.819977	0.411950	0.033685	0.648263	0.644989
2	0.439067	0.358217	0.935137	0.311810	0.619887	0.923902	0.183224	0.468848	0.456042	0.272851
3	0.168694	0.477091	0.849249	0.157931	0.162492	0.425233	0.426481	0.053911	0.675856	0.232446
4	0.996806	0.106651	0.321598	0.109929	0.288633	0.903647	0.616678	0.388289	0.245456	0.547211
```

# ランダムな位置を欠損させる

`DataFrame`が出来たので、早速ランダムな位置を欠損させる。
やり方はこんな感じ。


* `numpy.random.choice`でlist-likeなコレクションからランダムな1つを選べる
* `choice`を使って`index`と`column`それぞれを選ぶ。
* 選んだ場所に`None`を代入する。

```python
def remove_random_cell(dataframe):
    # 欠損させるindexを選ぶ
    target_index = numpy.random.choice(dataframe.index)

    # 欠損させるcolumnを選ぶ
    target_column = numpy.random.choice(dataframe.columns)

    # 欠損させる
    dataframe.loc[target_index, target_column] = None
```

## 実行してみる

```python
# 100回実行
for _ in range(100):
    remove_random_cell(dataset)
```

## 確認してみる

欠損した箇所を列毎にカウント

```python
dataset.isnull().sum()
```

パラパラと欠損している事が分かる。

```:output
0     7
1    10
2    12
3     8
4     6
5     9
6     9
7    14
8    10
9    11
dtype: int64
```

## 補足

欠損した箇所の合計を数える。
100回実行したのにも関わらず欠損箇所は100箇所以下になっている。
`choice`で選ばれる`index`と`column`に重複があるからだろう。

```python
dataset.isnull().sum().sum()
```

```:output
96
```

`choice`した後`None`だったらもう一回`choice`しなおすとか、一回`choice`したら`choice`の対象リストから消すとかしたら大丈夫だと思うけど、今回は特に必要なかったのでやってないです。
LubuntuでGUI版JNetHack3.6.1をコンパイルして遊ぶ

以前NetHackはインストールした時は遊び方が分からず、それで終わってしまったのですが、最近になって日本語版がある事とGUI版がある事を知ったので、これなら私でも遊べるかもと思いインストールしてみました。今回は Lubuntu16.04 に X11版のJNetHack3.6.1 をインストールしています。

# JNetHackのバイナリが見つからない
NetHackの日本語版であるJNetHackのサイト https://ja.osdn.net/projects/jnethack/ を見たところWindows版のバイナリはあるもののUnix版はdiffファイルが用意されているだけのようです。もしかしてパッケージ化されているかもと`apt search jnethack`として検索してみたものの結果は0件。どうやらコンパイルの必要があるようです。

# GUI版はどこに？
コンパイルする覚悟はできたのでじゃあGUI版はどこ？って話なんですが、それらしいスクリーンショットは見つかるもののそれをどうやってゲットするのかがいまいち分かりません。色々と調べてみたところ、どうやらコンパイルする際にX11のヒントファイルを指定すれば良いようです。またJNetHackのChangeLog.jにX11対応のようなことも書かれていましたので特別なことはしなくてもいけそうです。

# ソースコードのゲット
まずはソースコードとパッチをゲットします。NetHackとJNetHackのサイトを確認してみたところ最新の3.6.1であればNetHackのオリジナルソースも日本語版パッチもダウンロードできそうですので今回は3.6.1をコンパイルすることとしました。

## NetHack
NetHackはオフィシャルサイトである https://www.nethack.org/ からソースコードをダウンロードします。この時のバージョンは3.6.1で`nethack-361-src.tgz`というファイル名でダウンロードすることができました。

## JNetHack
JNetHackは https://ja.osdn.net/projects/jnethack/ からソースコードをダウンロードします。この時のバージョンは3.6.1で`jnethack-3.6.1-0.1.diff.gz`というファイル名でダウンロードすることができました。

# 環境の整備
コンパイルが必要となりますのでコンパイルに必要なものをインストールします。

```console:コンパイルに必要なものをインストール
$ sudo apt install build-essential libncurses5-dev libxt-dev libxaw7-dev bison flex
```

# コンパイル
NetHackのソースを解凍してパッチをあててコンパイルという流れになります。JNetHackからダウンロードしたファイルはShiftJISで書かれていたためutf8に変換してパッチをあてています。

```console:解凍、パッチ、コンパイル（X11版）
$ tar xvfz nethack-361-src.tgz
$ cd nethack-3.6.1
$ zcat ../jnethack-3.6.1-0.1.diff.gz |iconv -f cp932 -t utf8 | patch -p1
$ sys/unix/setup.sh sys/unix/hints/linux-x11
$ make all
```

# インストール
インストールします。自身のホームディレクトリにインストールされますので管理者権限である必要はありません。インストール先は ``~/nh/` フォルダです。

```console:インストール
$ make install
```

デフォルトだとタイルが16x16と少し小さいのでImageMagickを使って24x24のタイルを作成して、それを使うようにします。このあたりは好みかなっと思います。

```console:24x24のタイルを作成＆設定
$ cd ~/nh/install/games/lib/jnethackdir
$ convert x11tiles -sample 150% x11tiles24
$ sed -ri 's/^(JNetHack.tile_file).*/\1: x11tiles24/' JNetHack.ad
$ sed -ri 's/^(JNetHack.tile_width).*/\1: 24/' JNetHack.ad
$ sed -ri 's/^(JNetHack.tile_height).*/\1: 24/' JNetHack.ad
```

## 起動
起動してみます。

```console:起動
$ ~/nh/install/games/jnethack
```

![2018-07-13-090931_1004x450_scrot.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/54ac46bf-ca71-5ac3-6390-24d09dde1523.jpeg)

うまく起動できて日本語化されていればめでたしめでたしです。

# 遊んでみて
X11版なのでマウスも使えるし日本語になってわかりやすくなったのですが、まだ楽しめるまでにはいけてないです。コマンドも多いし難しいです。あとたまにCore Dump吐くことあるのはut8に変換したからなのか、そうゆうものなのかも分かっていません。

あとウィザードモードっていうデバッグモードもあるようなんですが、wishがうまく使えないようです。日本語で入力しないといけないみたいなんですが日本入力できないみたいなので…。他にも色々とありそうなんですが、とりあえずいろいろと試しながら遊んでみようかなと思う今日このごろです。

```console:ウィザードモードで起動
$ sudo ~/nh/install/games/jnethack -u wizard -D
```

# コンソール版について（おまけ）
コンソール版のJNetHackを作りたいときはパッチをあてるときにEUC-JPの文字コードに変換してパッチをあてて、`~/.jnethackrc`ファイルに OPTIONS=kcode:u と書いておけばいけるようです。iconvではEUC-JP変換時に変換できない文字があるよって言われて変換できなかったのでnkfを使用しています。

```console:コンソール版のコンパイルからインストール
$ tar xvfz nethack-361-src.tgz
$ cd nethack-3.6.1
$ zcat ../jnethack-3.6.1-0.1.diff.gz | nkf -e | patch -p1
$ sys/unix/setup.sh sys/unix/hints/linux
$ make all
$ make install
$ echo "OPTIONS=kcode:u" > ~/.jnethackrc
$ ~/nh/install/games/jnethack
```
Microsoft Translator APIを利用した翻訳

[Microsoft Azure](https://azure.microsoft.com/ja-jp/free/)を利用した翻訳APIについて備忘録として残しておきます。

# 準備
Translator Text APIを使用するにはMicrosoft Azure上で利用開始の手続きを行う必要があります。年会費が取られますが、初回の1ヶ月は無償利用できます。

# Translator Text APIの登録
リソースとか設定値が妥当か不明ですが、適当に名前を付けてサービスを登録
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259963/256a18f8-0c51-767a-879b-55622a3297cf.png)

# APIの使い方
無料利用期間中のサブスクリプションキーではアクセストークンが取得出来ず…↓

```
$ curl "https://api.cognitive.microsoft.com/sts/v1.0/issueToken?Subscription-Key=管理画面で確認できるサブスクリプションキー"  -i -X POST
～
{ "statusCode": 401, "message": "Access denied due to invalid subscription key. Make sure to provide a valid key for an active subscription." }
```

なので、Microsoft Azure管理画面上で生成されるKeyを直接利用するしか手段がない様子です。キーの有効期限が気になりますが。

[API仕様はここを参照](https://docs.microsoft.com/ja-jp/azure/cognitive-services/translator/reference/v3-0-reference)
例.

```
$ curl -i "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&from=en&to=ja" \
     -H "Ocp-Apim-Subscription-Key: サブスクリプションキー" \
     -H "Content-Type: application/json" \
     -d "[{'Text':'Hello, what is your name?'}]"
```
【Mac向け】VSCodeで必ず覚えておきたいショートカット集

# はじめに
快適なコーディング環境(Mac)のためにショートカットキーをまとめました。
 
# 必須編: これなくして生きていない 
## ナビゲーション
### コマンドパレットを開く

```
⌘ + Shift + P
```

### ファイル移動 (エディタグループ内から)
"command": "workbench.action.quickOpenNavigateNextInEditorPicker"

```
Ctrl + Tab
```

### ファイル移動 (開いているプロジェクト全体のファイルから)
"command": "workbench.action.quickOpenNavigateNextInFilePicker"

```
⌘ + P 
```


### サイドバーに移動

```
⌘ + 0
```
### サイドバーのトグル

```
⌘ + B
```


### ファイルエクスプローラーをサイドバー表示/エディタ切り替え
```
⌘ + Shift + E
```

* ファイルエクスプローラー画面で
    * ↑↓キーでファイル移動 
    * spaceでファイルを開く


### Git画面をサイドバー表示
```
^ + Shift + G
```

## コーディング
### Markdownのプレビュー表示
```
⌘ + K V
```

### Markdownのプレビューをトグル
```
⌘ + Shift + V
```

### 定義元ジャンプ
必須。これなくして生きていけない。

```
F12
```

### 参照元検索(Find Usage)
必須。これなくして生きていけない。

```
Shift + F12
```

### サジェスト表示
```
^ + Space
```

### メソッド一覧
```
⌘ + Shift + o
```

### カーソルを前の位置に戻す 
```
Ctrl + -
```

### エラー箇所にジャンプ 
```
F8
```

### 前のエラー箇所にジャンプ 
```
Shift + F8
```

### ドキュメント ポップアップ表示 
"command": "editor.action.showHover"

```
⌘ + k (続けて) ⌘ + i
```


# 参考になる記事
- [【Mac版】 VisualStudioCode キーボードショートカット - Qiita](https://goo.gl/NtPNS9)
- [Visual Studio Code Keyboard shortcuts for macOS](https://goo.gl/AfpWdl)
Tips: 実行中のシェルスクリプトを書きかえるときには

実行中のシェルスクリプトを編集すると実行している途中から動作を変えることができることはよく知られている。 例: http://d.hatena.ne.jp/sleepy_yoshi/20090917/p1

「変えることができる」というよりも現実のケースでは、実行中に意図せず内容を変えてしまうことで予想しない挙動をさせてしまうことがありうる。これを防ぐにはどうするか。

# 例

次のようなスクリプトを実行中に書き換えてみる

```run.sh
#!/bin/sh
sleep 30
echo foo
```

```console
$ run.sh &
$ vim run.sh
(30 秒以内に foo を bar に変えて保存する)
bar
```

編集後の bar という文字が表示されてしまう。
この例ではまだマシだが、現実のケースでは予期せずして if 文まるごと貫通するなど、破滅をもたらしてしまうことがある。

# 対策

新たにファイルを作成しなおして編集すればいい。
シェルが掴んでいるのは旧い i-node のファイルの方で、新たに編集する方とは別の i-node にする。

特に cp して mv すると楽。

```console
$ run.sh &
$ cp run.sh run.sh.tmp
$ mv run.sh.tmp run.sh
$ vim run.sh
(30 秒以内に foo を bar に変えて保存する)
foo
```

ちゃんと結果は foo のままになっている。

## 超余談

リネームは bash の展開を使うと間違えにくく、楽

```console
$ cp run.sh{,.tmp}
$ mv run.sh{.tmp,}
```

## テスト

最近は私はなるべく Tips もテストつきで管理しています。そうすると Tips が時代の変化に強くなります。

https://github.com/kitsuyui/kitsuyui/tree/master/tips/shellscript-editing-during-running
Lazurite Basic

#概要
Lazurite Basic調べてみた。

|競合社名 |ラピス製品 Lazurite Basic |Arduino Uno|
|:--|:--|:--|
|DC電源 |7V-15V |7V-15V|
|USB |マイクロUSB |USB|
|動作電圧 |3.3V / 5V選択可| 5V|
|型番 |ラピスセミコンダクタ：ML620Q504| ATMEL：ATmega328|
|ROM |64KB |32KB|
|RAM |6KB |2KB|
|データメモリ |データFlash：512ワードx2 (合計2KB) |EEPROM 1KB|
|動作周波数（通常動作) |16MHz |16MHz|
|動作周波数（sleep中) |32.768kHz |-|
|Digital IO |20 (6本はADコンバータと兼用) |20 (6本はADコンバータと兼用)|
|ADコンバータ |6 (最大で12) |6|
|UART |2系統 (USBとGPIOから使用)| 1|
|SPI |2系統 マスターのみ |1系統 マスター／スレーブ|
|I2C |2系統 マスターのみ |1系統 マスター／スレーブ|
|外部割込み |2系統、最大 8系統 |2系統|
|動作中 |10mA |20mA|
|スタンバイ中 |2mA |-|
|コンパイラ |ANSI C |C++|

#回路図

arduinoピンコンパチらしい。

![laz.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/fde6fbd0-c649-8cc2-6c89-a34b5db46a76.jpeg)


以上。
AE　数値をタイムコード表記に変換

#numConvertToTimecode

ユーザーがただの数値でフォーム入力する事があるのでそれをタイムコードに変更。
スクリプトではcurrentFormatToTime（）やtimeToCurrentFormat（）があるがちょっと使えない事情があったので考えてみました。

例えば入力フォームで123456と入力したら0:12:34:56に変更する。

```jsx
var target = "123456";

function numConvertToTimecode(str) {
    var num = new String(str).replace(/,.;/g, "");
    if( isNaN(num) ){
    alert('これは数値ではありません')
    return false;
    }
    if( num.length > 7){
    alert("num over");
    return false;
    }
    for ( var i = num.length ; i < 7 ; i++){
        num ="0"+num;
    }
    while(num != (num = num.replace(/^(-?\d+)(\d{2})/, "$1:$2")));
    return num;
}

numConvertToTimecode(target)
```

```console
結果 : 0:12:34:56
```
カテゴリなどの親子関係を作りたい時のDB設計

# この記事の目的

カテゴリなどの親子関係のある情報を扱う際のDB設計について。rails,activerecordで扱うことを前提に設計していく。

# 各dbの設計パターン

ここがよくまとまっている

https://qiita.com/hirashunshun/items/06adf4f42f03a9f3b63d

# 1階層の階層構造

1階層だけの場合は下記のdb構成でも良さそう。ただし、これはナイーブツリーと言われているもので階層が増えると一回のクエリで取得できなくなる。

- カテゴリid
- カテゴリ名
- 親カテゴリid

![スクリーンショット 2018-07-14 21.07.32.png](https://qiita-image-store.s3.amazonaws.com/0/193389/c51edf2e-ad70-a612-74aa-5b7a8fc46434.png)

* 親があるときは親を出し、ない場合は１階層のみにする。
* 親のカテゴリが更に親を持っていてもそれは表示させない。
Unity URL

https://www.youtube.com/watch?v=69kg8vXs0Ks

https://qiita.com/ShirakawaMaru/items/cb24a8b34c9e338d9bba

Begriff of Frame
http://unity-yb.github.io/articles/frame_and_update.html

ifdef ifndef
http://www.kinjo-u.ac.jp/ushida/tekkotsu/cpp/ifndef.html

「Unity 入門」これをやればだいたいのことはわかる！
https://gist.github.com/mizutanikirin/fae945c12a3d53a47158


https://qiita.com/hiroyuki_hon/items/c4da01e1c94bbba2c071

UnityをC#で超入門してみる #1 Unity入門の章
https://qiita.com/hiroyuki_hon/items/0718a50e6569b6c5037a

[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(1)ステージ配置
https://qiita.com/JunShimura/items/cbb0db8087a5cc75735e
AppBarLayoutで縦スクロール

AppBarLayoutにViewPagerを入れてその中にNestedScrollViewやRecyclerViewで縦スクロールしたい場合、そのまま配置しただけではスクロールした際にAppBarLayoutの縦スクロールが優先されてしまい、内包するコンポーネントのスクロールが動作しませんでした。

## やったこと
Viewが階層構造になってる際に子ViewにOnTouchListenerが設定されていないと親Viewにイベントが伝搬されるため、対象のViewにOnTouchListenerを設定し、requestDisallowInterceptTouchEventで親Viewへの伝搬を止めることで実現できました。
ただし、ViewPagerの中にある場合は横スクロールを止めるわけにはいかないので縦スクロールを判定できた場合のみ伝搬を止めています。

```kotlin
val minDistance = 100
var downY: Float = 0F
var upY: Float = 0F

nestedScrollView.setOnTouchListener(View.OnTouchListener { v, event ->
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {
            downY = event.y
            return@OnTouchListener true
        }
        MotionEvent.ACTION_UP -> {
            upY = event.y
            return@OnTouchListener true
        }
    }
    val deltaY = downY - upY
    if (Math.abs(deltaY) > minDistance) {
        // 一定以上縦方向にスワイプした場合は親に対してタッチイベントを伝搬しない
        // これによりAppBarLayoutのスクロールと競合せずにスクロールできるようになる
        v.parent.requestDisallowInterceptTouchEvent(true)
    }
    return@OnTouchListener false
}
```

## サンプル
[misoca12/VerticalScrollInAppBarLayout](https://github.com/misoca12/VerticalScrollInAppBarLayout)
<img src="https://qiita-image-store.s3.amazonaws.com/0/122574/bcfebe50-d3f7-9acc-bba7-c65e070efae8.gif" width=50%>

## 参考
https://stackoverflow.com/questions/7449799/how-are-android-touch-events-delivered
https://qiita.com/takahirom/items/2978ede8e7d40b888832
http://blog.lciel.jp/blog/2013/12/03/android-touch-event
VM VirtualBoxにバックエンドサーバを立てる

# システム要件
ホストPCのバックエンドサーバとして使用するためのサーバを、[Oracle](https://www.oracle.com/jp/index.html)製[VM VirtualBox](http://www.oracle.com/technetwork/jp/server-storage/virtualbox/overview/index.html)に作成する。

- OS
    - [CentOS-7 Minimal(1804)](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso)

# サーバのセットアップ（本題）
- 仮想マシンの名前
  - CentOS7 Backend Server
- メモリ
  - 1024MB
- ストレージ
  - 8GB

## ネットワーク設定
今回したいのは、ホストPCのバックエンドサーバとして使用するためのサーバを作成することです。
なので、ホストPCとの接続設定のみを行います。

### VirtualBoxの設定
ツールバー`ファイル` > `ホストネットワークマネージャー`を開きます。
既に作成されているアダプターのIPv4アドレスを確認してください。
`192.168.56.1/24`だと思います。あとで、`192.168.56.***`の形で手動でIPアドレスを設定してもらうので、覚えていてください。
作成されていなかった場合は、以下を参考に作成してください。既に作成されていれば、飛ばしてください。

#### ホストネットワークアダプターの作成
ツールバー上の `作成` をクリックしてください。
作成が完了しました。IPv4アドレスを確認してください。

### 仮想マシンの設定
`CentOS7 Backend Server` > `設定` > `ネットワーク`を開きます。
2つのネットワークの設定を行います。

- `アダプター1`（NAT）  
  ネットワークアダプターを有効化して、割り当ては `NAT` を指定します。
  その他はデフォルトのままでいいと思います。
- `アダプター2`（ホストオンリーアダプター）  
  ネットワークアダプターを有効化して、割り当ては `ホストオンリーアダプター` を指定します。
  名前はデフォルトのままでいいと思います。もしも選択するものがない場合は、上の手順でホストネットワークアダプターを作成してください。


## OSのインストール
### 起動ハードディスクを選択
[公式](https://www.centos.org/download/)からダウンロードしてきたISOファイルを指定してください。
インストールは`Test this media & install CentOS 7`を選択してください。

### 設定
日本国内で使用することを想定しています。

- インストール先
  - VirtualBoxによって作成されたディスクを選択
- root パスワード（考えて埋めてください）
  - fugawalk8243hoge

### サーバを立ち上げての設定
#### ホストオンリーアダプターの設定
以下のコマンドを叩いて、`NetworkManager` を開きます。

```
nmtui
```

`Edit a connection` > `enp0s8` で接続設定を行います。（アダプター2の設定が`enp0s8`になります。）

- `IPv4 CONFIGURATION`: Manual
  - Addresses（先ほどのIPアドレスの設定に合わせてください）
    - 192.168.56.11（これは例です）
  - Gateway（先ほどのIPアドレスの設定に合わせてください）
    - 192.168.56.1（これは例です）
- `IPv6 CONFIGURATION`: Ignore
- `Automatically connect`: X
- `Available to all users`: X

#### ネットワークの有効化の確認
先ほどのコマンド（`nmtui`）で `NetworkManager` を開いてください。
`Activate a connection` でネットワークの有効化の確認を行います。
各ネットワークの頭に `*` が付いているかを確認してください。
付いていなければ、そこで `Enter` を押して有効化してください。

#### ネットワークの再起動
以下のコマンドで、NetworkManagerの設定反映、ネットワークの再起動、IPアドレスの確認を行います。

```
service NetworkManager restart
service network restart
```

```
ip address show
```

## 接続確認
以下のコマンドで接続できることを確認してください。

```
ping 192.168.56.11
```
Kotlinまとめ - 文法詳解 - 関数

# 関数
```Kotlin
// 普通の書き方
fun square(x: Int): Int {
    return x * x
}

// 簡略した
fun square(x: Int): Int = x * x
// 型推論もできるので、推論できる場合は戻り値の型も省略可能
fun square(x: Int) = x * x
```

たとえ簡単で1行で表現できたとしても`{}`で囲ったほうが統一感が出ていいかもと思っている
現時点での気持ちなので、「短いは正義!!」とか気持ちが変わるかもしれない。

## 名前付き引数
```Kotlin
fun square(x: Int): Int {
    return x * x
}
val squared = square(x = 1)
// 最新のIntelliJ IDEA とか Android Studioは引数のラベルを表示してくれるけど
// こう書いたほうがGit上での差分を見るときには読みやすそう
// Swiftはこのラベルが自動的に表示されてくれるからそのほうがうれしい

// ラベルの順番はどうでもいい
fun add(x: Int, y: Int) = x + y
val added = add(y = 1, x = 2)
```

## デフォルト引数
```Kotlin
fun printHello(name: String = "guest") = println("hello, $name")

printHello()                 // hello, guest
printHello(name = "hicka04") // hello, hicka04
```

## 可変長変数
* `vararg`を引数の前につけるだけで、引数を配列として受け取ることができるようになる
* 可変長変数は1つの関数につき1つまで

```Kotlin
fun sum(vararg ints: Int): Int {
    var sum = 0
    for (i in ints) {
        sum += i
    }
    return sum
}

println(sum(1, 2, 3)) // 6
// 配列を渡すときは`*`を先頭につける必要がある
println(sum(ints = *intArrayOf(1, 2, 3)))
```

## 再帰呼び出し
### 使わないパターン
```Kotlin
fun sum(numbers: List<Long>): Long {
    var sum = 0L
    for (n in numbers) {
        sum += n
    }
    return sum
}
```

### 使うパターン
リストが空になるまで「最初の要素」と「最初の要素以外のリストの合計」を出す

```Kotlin
fun sum(numbers: List<Long>): Long =
    if (numbers.isEmpty()) 0
    else numbers.first() + sum(numbers.drop(1))
```

### 注意点
* 再帰呼び出しの回数が多いとスタックを食いつぶし、スタックオーバーフローでクラッシュする可能性がある
* スタックを消費しないように再帰呼び出しを最適化してくれる仕組みがある  
  →**TCO(Tail Call Optimization, 末尾呼び出し最適化)**
* 再帰呼び出しを関数の最後の計算になるように変更する必要がある

```Kotlin
tailrec fun sum(numbers: List<Long>, accumulator: Long = 0): Long =
    if (numbers.isEmpty()) accumulator
    else sum(numbers.drop(1), accumulator + numbers.first())
```

## ローカル関数
* 関数内に別の関数を定義すること
    * スコープを限定的にしたいときなど
* 上記の`sum(numbers:accumulator:)`はいかなる場合においても`accumulator`が0になっていてほしいが、デフォルト引数で渡しているだけなので、初期値0の縛りをかけたい

```Kotlin
// go(numbers:accumulator:)はさっきのsum(numbers:accumulator:)と同じ
// このsumを呼び出す側にはaccumulatorが見えなくなった
fun sum(numbers: List<Long>): Long {
    tailrec fun go(numbers: List<Long>, accumulator: Long = 0): Long = 
            if (numbers.isEmpty()) accumulator
            else go(numbers.drop(1), accumulator + numbers.first())
    
    return go(numbers, 0)
}
```

## 値を返さない関数
* 返り値の型に`Unit`を指定する
* Kotlin:`Unit` == Java:`void`
* Unit省略するのが普通(だよね、知ってた)

```Kotlin
fun printHoge(): Unit {
    println("hoge")
}

fun printHoge() = println("hoge")
```

---

[←基本的な文法 - 条件分岐, ループ](https://qiita.com/hicka04/items/0fee2c0b5955600d29b8) || [文法詳解 - 第一級オブジェクトとしての関数→](https://qiita.com/hicka04/items/2bdad26dcd21ec970971)
GNOME Shellでサスペンドする方法

普段ラップトップをドックに繋げて使用しているのですが、ドックに繋げている時のみ、画面を閉じるだけではサスペンドにならなくて地味に困っていました。


# 環境
Ubuntu 18.04 LTS


# 方法
右上のメニューを開いてAltを長押しするか、電源ボタンを長押しすると、電源ボタンがサスペンドボタンに変わります。

- Before
![Screenshot from 2018-07-14 20-46-48.png](https://qiita-image-store.s3.amazonaws.com/0/154116/94bfbab3-cac7-1bf9-2d9d-a97354c5a2ab.png)

- After
![Screenshot from 2018-07-14 20-47-21.png](https://qiita-image-store.s3.amazonaws.com/0/154116/54253da6-b1aa-102c-f7a9-b573fa4286ee.png)



# まとめ
こんなん誰がわかるんですかねぇ...
2018年版Webアプリ入門

## 内容
初心者が手間がかかる仕組みを避けてWebのサービスを作る方法の1つについて解説します。主に言語を1つぐらい知ってて、Webページ上でなんか動くもの作りたい人、古いWebアプリの作り方しか知らなくてキャッチアップしたい人を対象にしています。JavaScriptの話がメインですが、補足で周辺技術の話もあります。

詳しいマン向け：作者が軽く試した結果罠が少ないと感じたルートでしかないので、おれはこっちの方がいいという人はコメントするなり同じような記事を書くなりすればいいんじゃないかな。

## 必要なもの・できること
HTMLとJavaScriptはWebで何かを出す以上必須です。JavaScriptが無い場合は静的ページなのでブログとかで書けばいいので、ここではWebアプリのくくりに入れません。

JavaScriptだけで結構なものは作れますが、

- ブラウザをまたいでのデータ保存
- 同じサイトを見ている別の人とのやりとり

はできません。逆に言うと、ブラウザでのデータ保存はlocalStorageで1MB程度までなら問題なくできます(それ以上はブラウザ依存があるようです)。JavaScriptだけでファイルを処理するのも可能になりました。JavaScriptで他のWebアプリのAPIを叩くとかもできます。

### サーバ
残念ながらJavaScriptだけで不可能という判断になった場合はサーバを用意することになります。

もしサーバを用意することになった場合、サーバはJSONを返すだけの単純なAPIサーバとして運用し、JavaScriptでレンダリング(表示を作る)のが良いでしょう。

サーバを用意することになった場合、24時間Webサーバを動かすリソース、多くの場合必要になるDB、落ちたときの対応、サービスレベルetcと考えることが爆発的に増えます。AWS/Azure/GCPなどのクラウドサービスやHerokuなどのプラットフォームであればある程度は丸投げできますが、どちらにせよ維持費を考える必要がでてきます。

## JavaScript
HTMLは動かない静的な(主に)ドキュメントを表示するものですが、これをJavaScriptで表示・非表示を制御したり、書き換えたりすることによって、現代の動くWebページが作られています。

### 言語の選択
初期のJavaScriptは非常に使いづらい言語で、コンパイルでJavaScriptに変換する多数の言語(AltJSと言います)が作られてきました。一方でJavaScriptも急速に改善が進んでおり、主要なブラウザで動くES6であれば、細かいことを抜きにすればAltJS要らないかな、と思えるレベルにはなっています。

なので、ここではES6を推奨します。ただし重大な問題として、IE11はES6に対応していません。この場合はES6を使わないJavaScriptかAltJSが選択肢になります。

サーバサイドの良さげな言語を知ってる人だとES6でもかなりショボいんですが、AltJSはビルドまわりが現状混迷しているので当記事の範疇を越えると考えています。(訳：作者も匙を投げた)

### ライブラリ
よくあるものは既に先人がライブラリ化して、読み込むだけで使えるようになっています。積極的に使いましょう。

最近はJSをダウンロードしてそこから読むようにすることも多いですが、CDNの方がURLを追記するだけなので楽だとおもいます。cdnjsやjsDelivrあたりが、種類も豊富で探しやすい印象です。

### DOM操作
HTMLはレンダリングされるとDOMによってJS側からアクセスできるようになります。非常によく行なわれるので、Webサイトの技術的な設計がDOM操作のライブラリ(フレームワーク)によって大きく変化します。

#### VanillaJS
所謂ライブラリ無しです。デフォルトでDOM操作はできます。しかし、ちょっとでも複雑になるとすぐに破綻してしまうでしょう。書くなら10行以内で終わるようなものか、自前でラッパー作るような感じになります(そしてこの記事の範疇を越える)。

#### VueJS
一定以上複雑な画面ならこれで。使い方はこの記事での範疇を越えますが、他との違いは、VueJSはあくまでもライブラリであり、ビルド等が不要という可搬性です。

#### jQuery
やめましょう。確かによくメンテされていますが、VanillaJSと同レベルにメンテ性が悪く、jQueryが誕生した時期には存在した「ブラウザ互換性の問題」は、少なくともDOM操作という観点ではVanillaで解決しています。容量も小さくありません。

### その他便利なもの
#### fetch API
Webページ内でHTTPアクセスするときに使います。Promiseが返ってくるので使いやすく、標準です。対応してないブラウザは極僅かにありますがPolyfill(いわゆる互換ライブラリ)を使えばいいでしょう。

## サイトデザイン
1からサイトのデザインを作るのは大変です。CSS書くのはめんどうくさい。よく使うcomponentも1から作るのは大変です。そこでフレームワークを使いましょう。色々ありますが、選考の基準は、

- jQuery依存があるのか(無い方が良いです
- pure cssなのか
- カスタマイズ性

などでしょうか。作者も詳しくないので使ったことあるものだけを並べてみます。

### Bootstrap
jQueryに依存します。シェア的には一番高そうですが、カスタマイズする人には嫌われてるような気がします。

### MUI
pure cssです。Material Designのpure cssで作りたかったので試してみたのですが、悪くない感じでした(大きいのは作ってないけど)。

## 公開する
一通りできたら公開しましょう。結局のところサーバ側は静的なHTMLとJavaScriptがダウンロードできれば良いので、安価な手段もいくらかあります。

### GitHub pages
殆どの場合Webアプリ開発はGitHubを使っていると思うので、これが一番楽だと思います。専用のbranch作って表示に必要なファイルを置いて、commitをpushするだけ。無料。

### Amazon S3
S3はクラウドストレージサービスですが、Web上に公開することもできます。特筆すべきはカスタマイズ性の高さで、独自ドメイン、CloudFrontで大規模配信までできます。とはいえそこまで要らないことも多いですが…。有料ですが個人レベルのアクセス数なら塵芥みたいな値段だとおもいます。

### nginx
もしサーバを必要とする場合は、そのサーバに同居させるのがよくある構造で、その場合は先頭にnginxを立て、URLに応じてnginxが直接返すHTML/JSなどの静的ファイルとAPIに分岐することになります。

### WebFrameworkで配信
サーバに置くWebFrameworkによっては、自前で静的ファイルを配信できることがあります。その場合はそれに載せてもいいです。
djangoで簡単なユーザー登録の実装

# 概要
ログインやログアウトは、Django側で適当なviewを用意してくれているため、実装するのはそれほど大変ではありません。
しかし、ユーザー登録に関しては、サービスやプロダクトによって必要な情報が異なるため、UserCreationFormを使用して少し実装する必要があります。
公式のドキュメントにはそれほど記載がなく、検索をしても書き方が色々あって混乱するため、手元でうまくいった例を残します。

追記： コメントを反映しました。ご指摘ありがとうございます。

# 環境情報

python: 3.6.5
django:2.0.6
OS: macOS

# 実装

まず、ユーザー登録の際に使うフォームをカスタマイズしないケース。
具体的には、フォームにUserCreationFormをそのまま使う場合のことをさします。

追記：2019/05/04に編集しました。

```python:views.py
from django.contrib.auth import login
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
from django.views.generic.edit import CreateView
from .forms import SignupForm

class SignUp(CreateView):
    form_class = SignupForm
    template_name = "accounts/signup.html" 
    success_url = reverse_lazy('top')

    def form_valid(self, form):
        user = form.save() # formの情報を保存
        login(self.request, user) # 認証
        self.object = user 
        return HttpResponseRedirect(self.get_success_url()) # リダイレクト
```

[公式](https://docs.djangoproject.com/ja/2.1/topics/class-based-views/generic-editing/)によると、form_validを編集する方が良いようです。

必須フィールドを増やしたい場合は、UserCreationFormを継承して、少しだけ加工をすると良いです。
例えば、ユーザー名、名前、パスワードを取得したいケースだと

```python:forms.py
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class SignUpForm(UserCreationForm):

    class Meta:
        model = user
        fields = ('username', 'email', 'password1', 'password2')
```

こんな感じで書いて、上のform_classをSignUpFormに変えれば完了です。

あとは、urlsを修正しておきましょう。

```python:urls.py
from django.urls import path

urlpatterns = [
    path('accounts/signup/', SignUp.as_view(), name='signup')
]
```


# おまけ
実際には、バックエンド側の処理を書いたら、フロント側でも反映していくわけですが、サインナップ時のエラーを表示させる方法も残しておきます。
下記の記載は、公式のドキュメントによせて書いてみます。

```html:base.html
<!DOCTYPE html>
<html lang="ja">
<head>
    {% include 'head.html' %}
</head>

<body>
{% block content %}{% endblock %}
</body>
</html>
```

```html:signup.html
{% extends 'base.html' %}
{% block content %}
<main>
...
...
{# signup処理部分 #}
<form method="post" action="{% url 'signup' %}">
{% csrf_token %}
<table>
<tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
</tr>
<tr>
    <td>{{ form.email.label_tag }}</td>
    <td>{{ form.email }}</td>
</tr>
<tr>
    <td>{{ form.password1.label_tag }}</td>
    <td>{{ form.password1 }}</td>
</tr>
<tr>
    <td>{{ form.password2.label_tag }}</td>
    <td>{{ form.password2 }}</td>
</tr>
</table>

<input type="submit" value="login" />

{# エラーメッセージを表示 #}
{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <p>{{ error }}</p>
        {% endfor %}
     {% endfor %}
{% endif %} 
</form>
{% endblock %}
```

# おわりに

djangoは、認証に関して色々なツールを用意してくれていて、初心者には結構ありがたい。
実用する際には、OAuthなどの対応が必要になるので、その辺りについても調べていきたいです。
VPSで複数のFlaskを用いたサービスを立ち上げる 

#はじめに
１つのvpsで複数のFlaskアプリケーションを立ち上げるためのメモ

Flask，uWSGI，Nginxを使う。
https://qiita.com/morinokami/items/e0efb2ae2aa04a1b148b
ほとんどこの記事に書いてあることなので，
複数アプリケーションを立ち上げるときの違いだけ記述。

app1のドメインはapp1.com
app2のドメインはapp2.com
とする。
ドメインは２つとも同じvpsのIPアドレスを設定しておけば良い。
ディレクトリ構成は下記のようになっているとする。

```
home
 |-strat.sh
 |-app1
    |-app.py
 |-app2
    |-app.py
```

#Nginxの設定
/etc/nginx/conf.d/に.confファイルを作って設定する。
server_nameにドメインを書いておくと，ブラウザで入力されたドメインに応じて動作を切り替えることができる。
この際flaskにつなげるにはUNIXソケットを用いるが，
単に.sockの名前を変えてしまえばいい。

```nginx:sample.conf
server {
    listen       80;
    server_name app1.com www.app1.com;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi_app1.sock;
    }
}
server {
    listen       80;
    server_name app2.com www.app2.com;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi_app2.sock;
    }
}
```

#起動
複数アプリケーションをたちあげるためのスクリプトは以下の通り。

```start.sh
#!/bin/sh

cd app1
uwsgi --socket /tmp/uwsgi_app1.sock --module app --callable app --chmod-socket=666 &
cd ..
cd app2
uwsgi --socket /tmp/uwsgi_app2.sock --module app --callable app --chmod-socket=666 &
```

./start.sh
で起動。
VS Code1.25の新機能 - ポータブルモード

# Visual Studio Code 1.25の新機能・ポータブルモード
https://code.visualstudio.com/updates/v1_25#_portable-mode
https://code.visualstudio.com/docs/editor/portable

ポータブルモードでは、VS Codeの設定情報をアプリケーション本体の近くに配置することによって、USBメモリやファイル共有などの環境において、設定情報込みでVS Codeを共有させることができる。

なお、WindowsやLinuxの場合はZIP版のVS Codeを用意する必要がある。

## 設定
### Windows, Linux
ZIP版のVS Codeを解凍したフォルダ内に`data`フォルダを作成する。

### macOS
VS Codeのアプリケーションと同じ場所に`code-portable-data`フォルダを作成する。

## 設定情報のポータブルモードへの移行
上記手順によって通常モードとポータブルモードで別々の設定情報が保持されるようになるが、通常モードのVS Codeの設定をポータブルモードに移行したい場合はさらに以下の作業を行う。

1. 通常版のVS Codeの設定フォルダを上記で作成したフォルダの下にコピーし、フォルダ名を`user-data`に変更する。設定フォルダの位置は下記の通り。
    - Windows: `%APPDATA%\Code`
    - macOS: `$HOME/Library/Application Support/Code`
    - Linux: `$HOME/.config/Code`
1. 同様に、拡張機能のフォルダもコピーする。こちらはフォルダ名はそのまま。
    - Windows: `%USERPROFILE%\.vscode\extensions`
    - macOS: `~/.vscode/extensions`
    - Linux: `~/.vscode/extensions`

ちなみに自分の環境(Win)の場合だと、1.が900MBくらい、2.が250MBくらいだった。

## tmpフォルダの扱い
tmpフォルダはそのままの状態だとシステムのtmpフォルダが使用される。tmpフォルダについてもポータブルモード独自のものを使用したい場合は`data`フォルダの下にtmpフォルダを作成するとそちらのほうのtmpフォルダが使われる。
Dockerfile の ADD と COPY の違いを結論から書く

# ADD

- リモートからもファイル追加できる
- 圧縮ファイルが自動解凍される

# COPY

- リモートからのファイル追加は出来ない
- 圧縮ファイルは自動解凍されない

# Dockerfileの例

```dockerfile:Dockerfile
FROM alpine

# Auto unarchive
ADD add.txt.gz /tmp

# Can ADD from remote
ADD https://github.com/github/fetch/blob/master/README.md /tmp

# Not auto unarchive
COPY copy.txt.gz /tmp
```

# 動作確認の例

ローカルには `copy.txt.gz` `add.txt.gz` があるものとする。

## イメージをビルド

```
$ docker build . -t example
```

## コンテナを走らせてディレクトリを確認

```
$ docker run example ls /tmp
README.md
add.txt
copy.txt.gz
```


- `add.txt.gz` が `add.txt` に解凍されているのが分かる。
- リモートから `README.md` がコピーされているのが分かる。


# 環境

- Docker version 18.03.1-ce, build 9ee9f40

# 参考

- [ADD | Docker Documentation](https://docs.docker.com/engine/reference/builder/#add)
- [COPY | Docker Documentation](https://docs.docker.com/engine/reference/builder/#copy)


# チャットメンバー募集

オープンチャット「アジト 〜プログラマの巣窟〜」
https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ftp サイトのミラー　(lftp)

lftp を使って ftp サイトのミラーをする方法です。

インストール
>Arch Linux

>```bash
sudo pacman -S lftp
```
Ubuntu

>```bash
sudo apt install lftp
```

>CentOS

>```bash
sudo yum install lftp
```

設定ファイル
ホームに .lftprc を作成
　これを作成しないとエラーメッセージが出ます。

```text:$HOME/.lftprc
set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-allow yes
set ftp:ssl-protect-list yes
set ftp:ssl-protect-data yes
set ftp:ssl-protect-fxp yes
set ssl:verify-certificate no
```

使用例

```text
$ lftp -u scott,tiger123 ftp.example.com

> ls
> mirror
```
TouchDesigner | Instanceで複数動画を貼る

## 全体
![screenshot 2018-07-14 19.26.45.png](https://qiita-image-store.s3.amazonaws.com/0/199903/5cabfdb3-f129-38ab-4282-e493a638b241.png)
<br />

## Point SOP | Add Texture
![screenshot 2018-07-14 19.30.11.png](https://qiita-image-store.s3.amazonaws.com/0/199903/45f3ce1c-2c11-613d-c342-75162fc557e0.png)


「% 9」は画面を9つ構成にしてるから
<br />

##Instance 2 | Texture Mode→[W] & [Texture Index] にCustum Attribを入れる
![screenshot 2018-07-14 19.33.59.png](https://qiita-image-store.s3.amazonaws.com/0/199903/a86bf3cf-7e35-1bfe-79d7-cc760e2cfa2f.png)


Instance Texturesには動画ファイルを入れる
<br />

## GLSL Multi TOP
![screenshot 2018-07-14 19.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/199903/f8a17ead-e4aa-3e36-9e22-9fea4cadad71.png)


<br />
書き換え前

```
void main()
{
    //vec4 color = texture(sTD2DInputs[0], vUV.st);
    vec4 color = vec4(1.0);
    fragColor = TDOutputSwizzle(color);
}
```

書き換え後

```
void main()
{
    vec4 color = texture(sTD2DInputs[0], vUV.st);
    //vec4 color = vec4(1.0);
    fragColor = TDOutputSwizzle(color);
}
```
【VSCode】.NET Coreのエラー箇所へのジャンプが「ファイルが見つかりません」となる問題への対処

# 問題点
WorkspaceRootがcsprojよりも上階層となるディレクトリ構成で.NET Coreの環境を構築したときに、自動生成されるビルドタスクだとエラー箇所へのジャンプが「ファイルが見つかりません」となり困ったため、これの対処方法を記載しておきます。

### NGの構成
- WorkspaceRoot
    - .vscode
        - launch.json
        - tasks.json
    - Project
        - Program.cs
        - Project.csproj

### OKの構成
- WorkspaceRoot
    - .vscode
        - launch.json
        - tasks.json
    - Program.cs
    - Project.csproj

# 対処方法
「task.json」の「problemMatcher」の設定で、相対参照のルートとなるディレクトリ設定を.csproがあるディレクトリに変更します。

### 変更前
```json:tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/Project/Project.csproj"
            ],
            "problemMatcher": "$msCompile"
        }
    ]
}
```

### 変更後
```json:tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/Project/Project.csproj"
            ],
            "problemMatcher": {
                "base": "$msCompile",
                "fileLocation": ["relative", "${workspaceRoot}/Project"]
            }
        }
    ]
}
```

# 現在分かっている問題
上記で示した対処は、別のライブラリプロジェクトを参照設定するようなプロジェクト構成で、かつ、ライブラリプロジェクト側にビルドエラーがあった場合はうまく認識しません。
「dotnet build」コマンドが出力するファイル名は、対象の.csprojのあるディレクトリをルートとしたものになっているようなのですが、対処方法で示した「problemMatcher」は参照元の.csprojがあるディレクトリ固定としているためです。
まだ TypeScript の tsconfig で消耗してるの？

私は消耗しています。

## なぜ tsconfig で消耗しているのか

型についてのコンパイラオプションを厳しめの設定にしていると、TypeScriptで書かれていないJavaScriptのライブラリを読み込んだときに、型が合わないと言われて悲しい気分になったりします。

一方で、緩めの設定にすると、any型だらけになってしまったりと、TypeScriptの恩恵をほとんど受けられなくなってしまいます。

悩ましい…

## tsconfig で消耗しないために

TypeScriptを使っているプロジェクトの `tsconfig.json` の `compilerOptions` の中身を表にまとめてみました。

https://docs.google.com/spreadsheets/d/1EmGQNJ_VPnunkoW18ytKA4ben76ZJC38OlB7Im26NW0/edit?usp=sharing

![スケッチ.png](https://qiita-image-store.s3.amazonaws.com/0/154409/44f4e8dd-4491-3e37-880f-a8fa13921b7d.png)

これを
パク
参考にすれば消耗せずに済みそうですね！テーブルを生成するのに使ったコードは以下のリポジトリにおいておきます。

https://github.com/arosh/tsconfig-table

### tsconfig.json を書くときに参考にさせていただいている記事

* [がんばらないTypeScriptのはじめ方 \- 角待ちは対空](https://blog.yux3.net/entry/2017/07/18/110000)
* [私的TypeScriptとの関わり方ガイドライン \- 角待ちは対空](https://blog.yux3.net/entry/2017/02/05/000805)
* [TypeScript の型定義ファイルと仲良くなろう \- Hatena Developer Blog](http://developer.hatenastaff.com/entry/2016/06/27/140931)
C言語　九九の計算結果

```c
#include <stdio.h>

void main() {

	int i, j;

	for (i = 1; i < 10; i++) {
		for (j = 1; j < 10; j++) {
			printf("%2d ", i * j);
		}
		printf("\n");
	}
	
}
```
```
 1  2  3  4  5  6  7  8  9
 2  4  6  8 10 12 14 16 18
 3  6  9 12 15 18 21 24 27
 4  8 12 16 20 24 28 32 36
 5 10 15 20 25 30 35 40 45
 6 12 18 24 30 36 42 48 54
 7 14 21 28 35 42 49 56 63
 8 16 24 32 40 48 56 64 72
 9 18 27 36 45 54 63 72 81
```
自由変数の値を変更する

関数の自由変数(Free variable)とそれを調べる方法は、以前[こちら](https://qiita.com/fumitoh/items/915df59bb3d1f753d9fb)の記事で紹介しましたが、自由変数の値を無理やり置換した関数を作るということをやってみました。
通常、そのようなことは出来ませんが、``ctypes``という標準モジュールを用いると、
``CPython``のAPIにアクセス出来ます。
これを用いて自由変数の新しい値をラップする``cell``オブジェクトを作成し、自由変数の定義順に``cell``を並べた``tuple``が新しい``closure``です。
``types``標準モジュールの中に``FunctionType``型が定義されており、最初の引数に元々の関数のコードオブジェクトと、``closure``引数に先ほど作成した新しい``closure``を渡せば、元々の関数の自由変数の値は新しい値に置き換わっています。

もちろんCPythonだけに適用できる方法です。


```python
import ctypes
from types import FunctionType

def outer():
    x, y = 1, 'y'     # 外側のスコープで定義
    def temp_func():
        return x, y   # 内側の関数では自由変数となる
    return temp_func


def _create_cell(value):   # valueの値を持つ新しいcellオブジェクトを作成

    PyCell_New = ctypes.pythonapi.PyCell_New
    PyCell_New.argtypes = (ctypes.py_object,)
    PyCell_New.restype = ctypes.py_object

    return PyCell_New(value)


def _create_closure(*values):   # 複数の値からcellのtupleを作る
    return tuple(_create_cell(val) for val in values)

closure = _create_closure(2, 'z')

func = outer() # 置換前の関数
altfunc = FunctionType(func.__code__, globals(), closure=closure) # 置換した関数を作成
```
```python:実行結果

In[2]: func()
Out[2]: (1, 'y')

In[3]: altfunc()
Out[3]: (2, 'z')
```
C言語　比較する文字列

#比較
```c
#include <stdio.h>

void main() {

	int a = 'a';
	int b = 'A';

	if (a == b) {

		printf("等しいです。");
	}
	else
	{
		printf("等しくないです");
	}

}

```
```
等しくないです。
```
Gitで別のリポジトリに変更を反映する

# 前提
Gitで管理しているプロジェクトAがあり、そのプロジェクトAをベースに別のプロジェクトとして新規にプロジェクトBを作成した。プロジェクトBはプロジェクトAとは別のgitシステムで管理されている。
プロジェクトAの変更をプロジェクトBに加えたい。


# パッチを作る

## 変更を確認

```shell
$ cd (プロジェクトAのパス)
$ git log --oneline
```

適用済みの変更のハッシュ（プロジェクトBに適用されているもの、例：40517da）と適用したい最新の変更のハッシュ(例：8236694)を確認する。

```
プロジェクトA
   ↓
[40517da] →→→→→→→→→→→→→→→→→→→→→ プロジェクトB
   ↓ 差分 'git_diff.txt'　   差分適用→ ↓
[8236694]             　　       [xxxxxxxx]
```
  
## 差分パッチ作成
git diff (古いコミット)...(新しいコミット) > git_diff.txt

```shell
$ git diff 40517da...8236694 > git_diff.txt
```

# パッチを適用する
```shell
$ cd (プロジェクトBのパス)
$ patch -p1 < (プロジェクトAのパス)/git_diff.txt
```

> git lfsで管理されているファイルは個別にコピーする必要がある

## 参考
[Git で変更を patch ファイルにする / patch コマンドで適用する](https://qiita.com/sea_mountain/items/7d9c812e68a26bd1a292)
とほぼ同じだが、指定した変更間の差分を適用したかった。
【Ruby on Rails】タイムゾーンの設定(5.1系)

# はじめに
Ruby on Railsの基本設定ですが、少し困った経緯もあり記載。

# 設定方法

```ruby:config/application.rb
class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Only loads a smaller set of middleware suitable for API only apps.
    # Middleware like session, flash, cookies can be added back manually.
    # Skip views, helpers and assets when generating a new resource.
    config.api_only = true

    ### Railsが表示の際に扱うタイムゾーン ←ココ
    config.time_zone = 'UTC'
    
    ### Rails(Activerecord)がDBへのRead・Writeを行う際タイムゾーン ←ココ
    config.active_record.default_timezone = :utc 

  end
end
```

# 設定例
### DBへの保存はUTCで画面表示もUTC

```
config.time_zone = 'UTC'
config.active_record.default_timezone = :utc 
```

### DBへの保存はJSTで画面表示もJST(日本時間)

`:local`はシステム時間を参照しているのでサーバーのTimezoneを'Asia/Tokyo'にする必要があります！

```
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local 
```

### DBへの保存はUTCだけど画面表示はJST(日本時間)

```
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :utc 
```

# 備考
ActiveRecordでselectを利用してカラム名を指定した場合に日付の戻り型がTime型になっており、上記の設定が自動的に反映されませんでした。特に「DBへの保存はUTCだけど画面表示はJST」で困りました。
Pythonでhbaseをいじる

# はじめに
Pythonでhbaseをいじる際には [happybase](http://happybase.readthedocs.io/en/latest/)を用いることが多いと思います。
ただ、happybaseで対応してないコマンドもあり、その場合はhbaseのshellコマンドを直接用いることしかないと思います。
このページでは、hbase上でよくやる作業をまとめておきたいと思います。乱雑ですが、ご容赦ください。

# tableの一覧表示

happybaseでできるのだろうか？
hbaseのshellコマンドで行なった。

```terminal
$ hbase shell
> list

ns_1:table_1
ns_1:table_2
ns_2:table_1
```

ns_1,ns_2はネームスペース。table_1、table_2はテーブル名。
ネームスペースが異なれば、テーブル名が被っても問題ない。


# namespaceの作成

happybaseではできなそう。

```terminal
> create_namespace "ns_3"
```

参考：http://www.task-notes.com/entry/20160321/1458538973

# tableの作成

happybaseで行える。

```python
families = {
    'cf1': dict(max_versions=10),
    'cf2': dict(max_versions=1, block_cache_enabled=False),
    'cf3': dict(),  # use defaults
}
connection.create_table('ns_3:table_1', families)
```

ただし、namespaceを指定する場合（上記の`ns_3`）は、事前にhbaseのshellコマンドで作成しておく必要がある。

参考：http://happybase.readthedocs.io/en/latest/api.html#happybase.Connection.create_table


# tableの削除

happybaseで行える。

```py
connection.delete_table("ns_1:table_1", disable=True)
```

hbaseはtableを削除するには、テーブルの停止→削除と二段階踏む必要がある。`disable=True`はテーブルの停止も同時に行うオプション。

# tableのfamiliesの確認

```py
table = connection.table("ns_1:table_1")
table.families()
```

# table内の特定familiesの削除

hbaseではあるカラムに入ったデータを一括で削除することはできないようだ。
だが、families単位であれば、一括で削除が可能なようだ。

参考：http://www.ne.jp/asahi/hishidama/home/tech/apache/hbase/shell.html#h_alter

だが、happybaseにはその機能は見当たらない。
そのため、複数カラムを一括で削除したい場合には、テーブルを分けておき、テーブルごと削除→再作成するのが良さそう。
【Ubuntu】マインドマップツールのFreeMind1.0.1をインストールする方法

### Freemind
マインドマップツールです。
[Freemind](https://ja.osdn.net/projects/freemind/)

### キッカケ
FreeMindをWindowsで利用していたのでUbuntuでも利用しようと考えていたら、普通にインストールするとヴァージョンが0.9.0でした。

バージョン依存性が高いため、1.0系で作成した資料が下位互換がないため、ダウンロードした時の方法を記載します。

### debのパッケージを利用
```
$ wget -q -O - http://archive.getdeb.net/getdeb-archive.key | sudo apt-key add -

$ sudo sh -c 'echo "deb http://archive.getdeb.net/ubuntu trusty-getdeb apps" >> /etc/apt/sources.list.d/getdeb.list'

$ sudo apt-get update

$ sudo apt-get install freemind
```
PythonでMeCabの出力をリスト化するモジュール(mecab-python)

#はじめに
前回書いた記事
https://qiita.com/unias_day/items/f041b7c46543f38f78f7
の続きです。

使用環境については、前回の記事を参照してください。

#モジュール
mecab-pythonの出力をリスト化するモジュールを作ってみました。
以下のような感じ。

```python
import MeCab

def mecab_list(text):
    tagger = MeCab.Tagger("-Ochasen")
    tagger.parse('')
    node = tagger.parseToNode(text)
    word_class = []
    while node:
        word = node.surface
        wclass = node.feature.split(',')
        if wclass[0] != u'BOS/EOS':
            if wclass[6] == None:
                word_class.append((word,wclass[0],wclass[1],wclass[2],""))
            else:
                word_class.append((word,wclass[0],wclass[1],wclass[2],wclass[6]))
        node = node.next
    return word_class

```

#使い方
```python
>>> import MeCab
>>>
>>> def mecab_list(text):
...     tagger = MeCab.Tagger("-Ochasen")
...     tagger.parse('')
...     node = tagger.parseToNode(text)
...     word_class = []
...     while node:
...         word = node.surface
...         wclass = node.feature.split(',')
...         if wclass[0] != u'BOS/EOS':
...             if wclass[6] == None:
...                 word_class.append((word,wclass[0],wclass[1],wclass[2],""))
...             else:
...                 word_class.append((word,wclass[0],wclass[1],wclass[2],wclass[6]))
...         node = node.next
...     return word_class
...
>>> test = mecab_list("なんてこったパンナコッタ")
>>> print(test)
[('なんてこった', '感動詞', '*', '*', 'なんてこった'), ('パンナコッタ', '名詞', '一般', '*', '*')]
```
こんな感じで使える。

#おおまかな解説
```python
tagger = MeCab.Tagger("-Ochasen")
```
パーサーの設定。ChaSenという形態素解析器と互換の出力をする設定にしている。

---------------------------------------------

```python
tagger.parse('')
```
パーサーにデータを渡す前にこれを挟むことで、
UnicodeDecodeErrorを避けることが出来る。
具体的な理由は分かっていないが、
おそらく一度tagger.parse('')を挟むことで、
プログラム内で使用されている標準の文字エンコードで
初期化されるのではないかと思う。

---------------------------------------------

```python
node = tagger.parseToNode(text)
```
nodeにsurface(単語)feature(品詞情報)を持つ解析結果を代入している。
node.surface/node.featureでそれぞれにアクセス出来る。

---------------------------------------------

```python
wclass = node.feature.split(',')
```

node.feature部分のデータは

```
品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
```

の構造になっている。
”,”で区切られているテキストデータのため
","でsplitし、wclassに配列として代入している。

---------------------------------------------

```
if wclass[0] != u'BOS/EOS':
```
品詞部分の結果が'BOS/EOS'の場合というのは
BOS は beginning of sentenceで文頭、もしくは
EOS は end of sentence で文末、ということ。
文単位の解析をする際には、データに入れる必要がある。
今回は文単位を考慮しない場合の処理を書いた。

---------------------------------------------
```
if wclass[6] == None:
  word_class.append((word,wclass[0],wclass[1],wclass[2],""))
else:
  word_class.append((word,wclass[0],wclass[1],wclass[2],wclass[6]))
```
word_classは返り値。
内容は(表層形、品詞、品詞細分類1、品詞細分類2、原形)の形にした。
原形はデータが入っていない場合があるため、ifで分岐処理を書いた。
他に必要なデータがある場合などはwclass[]部を適宜変更してください。
また、データが入ってない問題に対してはsplitの時点で空のテキストデータを入れる処理を書いたほうがスマートな感じはします。(出来る人はそっちでやってみるのもいいかも)
ConoHa用コマンドラインツール(CLI)を公開したよ！

[ConoHa](https://www.conoha.jp/) 用コマンドラインツール(CLI)をPyPIで公開いたしました！

簡単にインストールでき、[ConoHa](https://www.conoha.jp/) を コマンドライン上から、
VM作成、起動、停止、再起動、スナップショット作成などが行えるようになってます。

新しくConoHa始める方、ぜひここから始めてね。笑
https://www.conoha.jp/referral/?token=vLXmPMcQyHDH3I_8ory0ayLI9m9HQsUOPK0wjPJPYtBsmnt5GCE-FN7

---
- [conoha | PyPI](https://pypi.org/project/conoha/)　← conohaなんて公式っぽい名前にしちゃって運営さんごめんなさい...笑
- [issy-s16/conoha | GitHub](https://github.com/issy-s16/conoha)

---

# :robot: インストール手順
以下のコマンドを実行することで **conoha** コマンドが利用可能になります。(Python3 必須)

    $ pip3 install conoha

インストール後、以下のコマンドを実行することで初期設定が完了します。:

    $ conoha
    username: XXXX
    password: XXXX
    tenant_id: XXXX
    Authentication success.

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/28500/a56a58b1-cd27-15fe-5723-a28f3951595f.png)


初期設定を行った内容は \~/.conoha/config にTOML形式で保存されます。
※ユーザ情報が登録されているリージョンは自動で判定されます。

# :lifter_tone3: 使い方
各コマンドには様々なオプションが存在し \--helpオプションで調べることができます。

## VM系
VM一覧取得 (JSON形式)
　--outlineオプションを付けると簡略された内容となります。:

    $ conoha compute vm list
    $ conoha compute vm list --outline

VM一覧取得 (TEXT形式):

    $ conoha compute vm list --text

VM作成:

    必須オプションのみ
    $ conoha compute vm create -i [IMAGE_ID] -f [FLAVOR_ID] --password [ADMIN_PASSWORD]

    キーペア指定、VM名指定
    $ conoha compute vm create -i [IMAGE_ID] -f [FLAVOR_ID] --password [ADMIN_PASSWORD] -k [KEYPAIR_NAME] -n [VM_NAME]

VM起動:

    $ conoha compute vm up [VM_ID]

VM再起動:

    $ conoha compute vm reboot [VM_ID]

VM通常停止:

    $ conoha compute vm stop [VM_ID]

VM強制停止:

    $ conoha compute vm stop [VM_ID] --force

## FLAVOR(プラン)系
プラン一覧取得(JSON形式)
　--outlineオプションを付けると簡略された内容となります。:

    $ conoha compute flavor list
    $ conoha compute flavor list --outline

プラン一覧取得(TEXT形式):

    $ conoha compute flavor list --text

## IMAGE系
イメージ一覧取得(JSON形式)
　--outlineオプションを付けると簡略された内容となります。:

    $ conoha compute image list
    $ conoha compute image list --outline

イメージ一覧取得(TEXT形式):

    $ conoha compute image list --text

指定したVMのスナップショットをイメージとして保存:

    $ conoha compute image save [VM_ID]

## その他
アカウントの請求情報などを取得するコマンドも用意しており、順次拡張予定です。




# :star: おすすめの使い方
[JSONを超絶に読みやすくする jq コマンド](https://tech.basicinc.jp/articles/81) というものがあり、この **conoha**コマンドの結果をパイプして**jq**コマンドに渡すことで、欲しい結果を瞬時に得られることでしょう！

```
$ conoha compute vm list | jq .
$ conoha compute flavor list | jq .
$ conoha compute image list | jq .
```

# :wave: 余談
他にもConoHa-CLIなるものは幾つか既に存在したのですが、
Vagrant向けに特化されていたり、結果をJSON形式で取得したかったため、今回開発することに至りました。

あと、個人的に初めての**PythonによるCLI開発** 、 **PyPI公開** 、 **OSS開発**だったので
それぞれで得たTipsなどは、また別記事で公開しようと思っております。

最後に、ご意見やプルリクなどどしどしお待ちしております！！