OmniAICreator/Qiita-1.07M huggingface dataset:
Unity 宴 会話シーンのメッセージ送りをゲームパッドで行う方法


**読者対象**
・Unity初心者の方
・Project内に宴を使った会話シーンを組み込み済

**目標**
・Unityのアセット宴を使って会話シーンを追加したProjectを
　ゲームパッドでも文字送り出来るようにする（ジャンプボタンを押した時に文字送りする）

**筆者**
・Unity初心者
・和尚本のお写経をしてアクションゲームを作成
・宴をアセットストアで購入し、使い方を勉強中

# 1.はじめに
Unityでアクションゲームのお写経が完成し、宴のアセットを使って会話シーンをゲーム内に入れ込むことが出来ました。
クリックやEnterを押すと会話も進んでいくし、動作も問題ない。
しかし、アクションゲームは、ゲームパッドでも遊びたいでしょう～ということで、ゲームパッドのボタンを押すと宴で作った会話シーンも進むようにしたいと考えました。

何はなくとも公式のマニュアルが肝心だー！
__宴のマニュアル（http://madnesslabo.net/utage/?page_id=9794）
マニュアル > UIを変更する > キーボード入力など、独自の入力処理を実装する__
にアクセスしました。

しかし、初心者の私には？？？？だらけの内容で、書いてある意味すら分かりません。
初心者からの目線としての印象ですが、宴の公式マニュアルは、プログラム未経験者には、難易度が非常に高いと感じました。
プログラム未経験者でも簡単にノベルゲームが作れるという触れ込みのアセットの割に、初心者殺しのマニュアルだな～という印象が拭えませんでした。

# 2.何をすれば希望の動作を行えるのか？
諸先輩方のお話しによれば「クリック判定の仕方を変える」の項目に書いてある。
『自分が呼びたい判定の仕方、タイミングで、「AdvUguiManager」の「OnPointerDown」を呼びます。』
を行えばゲームパッドでの操作が可能になるらしい。

しかし、私はここで困った事がありました。
「AdvUguiManager」が、どこにあるのか？どうやって「OnPointerDown」を呼びだすのかといったことが分からないのです。

# 3.AdvUguiManagerがついたオブジェクトはどこあるの？
「OnPointerDown」は、Scene >Hierarchy >AdvEngine >UI InputManagerに格納されていました。

あらかじめ画像のようにUIをPlayerのオブジェクトにセッティングしておきます。
![WS003819.JPG](https://qiita-image-store.s3.amazonaws.com/0/362908/690b0e12-5bf5-d96a-9fcc-ba1bd4e95131.jpeg)

# 4.どうやって「OnPointerDown」を呼び出そうか？
・シーン内にAdvUguiManagerがついたゲームオブジェクトがある
・自分のスクリプトにAdvUguiManager型の変数を用意して、
　そのオブジェクトをインスペクタでセットしておく
・キーパッドが押されたらOnPointerDownを呼び出すコードを
　自分が作成したPlayerを操るスクリプトに追加する
どうやらこれらのことを行えば今回やりたい動作を行えるようだ。

ゲームパッドで現在動いているボタン（"Jump"）に「OnPointerDown」のコードを埋め込めば手っ取り早いか？と考えた私は、

```C#
public AdvUguiManager advUguiManager;
```
```C#
advUguiManager.OnPointerDown()
```
を追加しました。……が、動かない！ 以下のエラーが出てきます。

>__引数 0 を指定するメソッド'OnePointerDown'のオーバーロードはありません。__

このエラーメッセージは｀PointerEventData｀ って型の引数が必要との意味らしいので、以下に修正。

```C#
advUguiManager.OnPointerDown(new PointerEventData())
```
すると今度はこんなエラーが・・・
>__型または名前空間の名前'PointerEventData'が見つかりませんでした(using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。__

# 5.どうやってエラーを倒そうか？
どうやら先程のエラーは「今 using している namespace 達の中には PointerEventData って型のクラスか構造体が見当たらないよ！」という意味らしい。

C# は、namespace を using することで「その namespace に含まれるクラスとか構造体とかを使えるようになる」仕様なので、上の方にある「using なんたら～」を書き足さないといけなのです。

ということで、以下の必要な記述を追加しました。

```C#
using Utage;    //宴を使うために必要な記述
using UnityEngine.EventSystems; //PointerEventDataを使うために必要な記述
```
```C#
public AdvUguiManager advUguiManager;   //宴標準のAdvUguiManagerマネージャー

// ジャンプボタンを押した
	public void PushJumpButton () {
		if (canJump) {
			goJump = true;
            //宴の会話送りを進める動作を呼び出す
            advUguiManager.OnPointerDown(new PointerEventData(EventSystem.current));   
        }
	}
```
やったーーーーーー！ 動いたーーーーっ！ 動きましたよっ！ 先生いぃーーーーーーーヽ(*ﾟ∀ﾟ*)ﾉ

# 6.まとめ
__・宴のイベントを呼び出す際には OnPointerDown メソッドを自前で呼び出す必要がある
・OnPointerDown メソッドは PointerEventData 型の引数を1つ要求する
・PointerEventData は ｀UnityEngine.EventSystems｀ namespace 以下に居るので using の追加が必要
・PointerEventData の初期化には EvemtSystem のインスタンスが必要__
PythonでGoogle Places API使ってデータ取得してみた

## 概要
Pythonを使用してGoogle Places APIのデータを取得した忘備録です。
APIでデータ取り出すだけならJSとかで問題ないんですが、その後データをこねこねしたかったのでPythonで取得しました。~~（結局使わなかったけど）~~

##  公式ドキュメント等
[Google Developers Places API](https://developers.google.com/places/web-service/intro) (Googleドキュメント)
[google-maps-services-python](https://github.com/googlemaps/google-maps-services-python) (PythonクライアントのGit)
[Python Client for Google Maps Services](http://googlemaps.github.io/google-maps-services-python/docs/) (Pythonライブラリドキュメント)

### 1. Google Place APIを使えるようにする

GCPのプロジェクト作成~API有効までの手順は以下のブログを参考にさせていただきました。
[Google Places APIで会社付近の「お食事処」を取得してみる](https://www.indetail.co.jp/blog/googleplaces-lunch/)

GCPはAPIの無料枠があるのでそれを使用します。(クレジットカードの登録が必要です)
また、APIキーのアクセス制限では、「リクエストを受け入れるサーバーIPアドレス」に自身のIPアドレスを設定するなどしておくと安全です。
キー盗まれてXX万円請求くるとか話聞くので・・・。

### 2.APIリクエストを送ってデータ取得

Pythonクライアントのライブラリを以下コマンドでインストールします。

```python
$ pip install -U googlemaps
```

以下はファイルの内容です。
「東京渋谷駅」で位置情報を検索して、その位置から半径200m以内のレストランの情報を取得します。

```main.py

import googlemaps
import pprint # list型やdict型を見やすくprintするライブラリ

key = 'Your API' # 上記で作成したAPIキーを入れる
client = googlemaps.Client(key) #インスタンス生成

geocode_result = client.geocode('東京都渋谷駅') # 位置情報を検索
loc = geocode_result[0]['geometry']['location'] # 軽度・緯度の情報のみ取り出す
place_result = client.places_nearby(location=loc, radius=200, type='food') #半径200m以内のレストランの情報を取得
pprint.pprint(place_result)

```
### 実行結果

上記ファイルを実行するとコンソールにレストランの情報一覧が表示されます。

おしまい！

### 最後に

レビューデータを大量に欲しかったんですが、ドキュメントみると
`reviews[] a JSON array of up to five reviews. `
とあり、取得制限があったので諦めました。笑
Twitter APIでも取得制限で苦しめられた覚えがあります。。。
何かいい方法があったら教えてください。
また、記事に間違いや不明な点があれば遠慮なくご指摘ください。
Ubuntuで付箋を使いたい

(初めてQiitaに投稿します😉)

#Ubuntuで付箋使いたい!

今の時代手帳もデジタルになってしまいつつあり(私はもうデジタル派です)
付箋ももうデジタルにしちゃいたいですね。
特にいつも使うノートパソコン(私はUbuntu16.04)のデスクトップに
表示させておくと便利ですね。
(図書館の本の返却期限とかレポートの期限をよく忘れてしまう...)

そして、Ubuntuで使えるなにか良い付箋ないか探してみて、
**indicator-stickynotes**
というのがありました。

###以下のサイトで分かりやすく、インストール方法もまとめてくれていた！
[デスクトップでUbuntuを使っています](http://linux-user.hatenablog.com/entry/2016/09/14/100820)

```
$ sudo add-apt-repository ppa:umang/indicator-stickynotes
$ sudo apt update
$ sudo apt install indicator-stickynotes
```

これでUbuntuにインストールする事ができます。
(最新のUbuntu18.04はできるか分かりません。)

あとは、簡単に上のバーから選んで、書くだけです。
本当に簡単です。
皆さんも使ってみて下さい。

![Screenshot from 2019-02-18 23-41-33.png](https://qiita-image-store.s3.amazonaws.com/0/297375/b1f6f8dc-04f6-c71f-3969-824514011153.png)
SW4STM32でST-Link V2からSWDで書き込みできた

NucleoやDiscoveryといった評価ボードではなく、自作ボードなどのマイコンにST-Linkを使ってSWD経由で書き込む時の注意点を発見したのでメモ。
BluePillもこの方法が使えるだろう。

SW4STM32で各マイコンに対応したプロジェクトを作り、実行ボタンをクリックして書き込もうとすると
"unable to reset target"
などとエラーが出て書き込めない。

※現在この記事ではPleiadesで日本語化したSW4STM32を例に説明しています。

# 解決するには
1. "実行の構成"->変更したい構成を選択->"デバッガー"を選択
1. "Configuration Script"で"ユーザー定義"にチェックを入れる。
1. "適用"をクリックし"実行の構成"を閉じる。
1. プロジェクト内のcfgファイル(例えば "Debug myproject Run.cfg")を書き換える。
2.reset_configの行をコメントアウトする。

```
# reset_config srst_only srst_nogate connect_assert_srst # この行をコメントアウト
```
Hammerspoonで特定のアプリでだけショートカットキーを有効にする

Hammerspoonで特定のアプリでだけキーバインドを有効にするのが意外と大変だったのでメモ。

まずキーマップを作って、アプリの変更を監視して、特定のタイトルを持つアプリが前面に来た時にキーバインドを有効にします。

```.lua
local YourKeyMap = hs.hotkey.modal.new()

local function appTitle()
   app = hs.application.frontmostApplication()
   if app ~= nil then
      return app:title()
   end
end

local function chooseKeyMap()
   if appTitle() == 'YourAppTitle' then
      print('Turning ON keybindings for: ' .. appTitle())
      YourKeyMap:enter()      
   else
      print('Turnning OFF keybindings for: ' .. appTitle())      
      YourKeyMap:exit()
   end
end

local function appWatcherFunction(appName, eventType, appObject)
   if (eventType == hs.application.watcher.activated) then
      chooseKeyMap()
   end
end

local function sendKey(mods, key)
   return function()
      hs.eventtap.keyStroke(mods, key, 10000)
   end
end

YourKeyMap:bind({'ctrl'}, 'a', sendKey({}, 'b'))

chooseKeyMap()
local appWatcher = hs.application.watcher.new(appWatcherFunction)
appWatcher:start()
```
Visual Studio は例外を検出しました。拡張機能が原因である可能性があります。

Unityで作成したシェーダーファイルを編集する際、Visual Studio 2017で開いたときに、
「Visual Studio は例外を検出しました。拡張機能が原因である可能性があります。詳細な情報を得るには、コマンドラインで/logパラメータを指定してアプリケーションを実行し、`C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Visual Studio\15.0_b4048e60\ActivityLog.xml`ファイルを調べてください。」
というエラーが発生しました。(他のファイルは問題なし)

そして、そのファイルを見てみると、エラー部分のDescriptionに、
"Microsoft.VisualStudio.CppSvc.Internal.CodeAnalysis.ICodeAnalysisService"
と書かれていたので、そのまま検索してみたところ、問題がほぼ同じ以下の記事を見つけました。
https://developercommunity.visualstudio.com/content/problem/390661/visual-c-compositionfailedexception-icodeanalysiss.html

この記事によると、Visual Studioを修復し、再起動したら解決したということでした。
なので、同様に、Visual Studioのインストーラーを開き　→　インストール済みのVisual Studioの詳細　→　修復　→　再起動し、
再度、Unityからシェーダーファイルを開いてみるとエラーが消えました。

一応、問題解決はしましたが、原因は分かりません。

環境：
Windows 10 pro
Visual Studio 2017 15.9.3
AtCoderの提出結果に効果音をつける

「ABCのA問題がちゃんとACしてるか気になって、おちおちBの問題文が読めない…」

そんな悩みを解消するブラウザスクリプトを作成しました。

https://github.com/yoshrc/atcoder-bell

# インストール方法

まず、ブラウザに[TamperMonkey](https://tampermonkey.net/)をインストールします。

そして、[このページ](https://greasyfork.org/ja/scripts/377923-atcoder-bell)に飛んで、「スクリプトをインストール」をクリックします。TamperMonkeyの管理画面が表示されるので、「インストール」をクリックします。

## Google Chromeの場合

インストールに加えて、音声の自動再生を許可する必要があります。

URL欄に `chrome://flags/#autoplay-policy` と入力し、設定画面に飛びます。Autoplay policy を "No user gesture is required." に変更し、Chromeを再起動します。
 
# 使ってみる

AtCoderの[この問題](https://atcoder.jp/contests/abc118/tasks/abc118_a)に、Python 3でACするこのコードを提出してみましょう。

```python
[a, b] = map(int, input().split())
print(a + b if b % a == 0 else b - a)
```

「自分の提出」画面に飛ばされるので、しばらく待ちます。ACが確定すると、いい感じの音が鳴ってくれます。

次に、WAになるこのコードを提出してみましょう。

```python
[a, b] = map(int, input().split())
print(a + b)
```

WAが確定すると、嫌な感じの音が鳴ります。

# おわりに

「自分の提出」ページのタブがバックグラウンドであっても音が鳴ってくれるので、安心して次の問題文を読み進めることができますね。

このスクリプトが素敵なAtCoderライフの一助になれば幸いです。
python入門(8)~if文~

#if文
if文は条件分岐を行うときに使います．条件式には比較演算子や論理演算子を使用します．

```python:div.py
a = 3
print(a, 'は', end ='')
if a % 2 ==0:
    print('偶数')
else:
    print('奇数')
```

```text:実行結果
3 は奇数
```
if文では条件を書いた後に「:」をつけます．また，pythonではインデントによって処理の塊であるブロックを指定します．インデントでは，空白半角4文字分が推奨されています．
##elif
elifとは他言語でいうelse ifと同じものです．また，if文では最初にtrueだった条件を実行しそれ以降は実行しません．

```python:div2.py
a = 78
print(a, '点の人は', end = '')
if a >= 90:
    print('秀です．')
elif a >= 80:
    print('優です．')
elif a >= 70:
    print('良です．')
elif a >= 60:
    print('可です．')
else:
    print('不可です．また来年会いましょう．')
```

```text:実行結果
78 点の人は良です．
```
##if文のネスト
if文などの制御文の中にさらに制御文を入れることをネストと言います．

```python:div3.py
year = 2000
print(year, '年は', end = '')
if year % 4 == 0:
    if (year % 100 != 0) or (year % 400 == 0):
        print('閏年です．')
else:
    print('閏年ではありません．')
```

```text:実行結果
2000 年は閏年です．
```
##最後に
if文は他言語との違いが少ないので基本は簡単にできると思います．自分のペースで学習しましょう．
【Kaggle・データ分析 入門者へ】タイタニックチュートリアルの解き方を比較してみた

## kaggleやデータ分析の入門といったら
kaggleやデータ分析に挑戦したい人がまずやることといえば、**タイタニックチュートリアル**でしょう。ありがたいことに、検索すると良質な日本語記事がたくさん出てきます。それら記事を読むうちに、**データ分析の基礎**がわかってくるはずです。複数の方法を見ることで、共通の手法や独自の手法を意識できます。タイタニックチュートリアルに様々な角度からアプローチすることで、初心者はより深い理解が得られるはずです。

そこで、この記事では、タイタニックチュートリアルの複数の解き方を比較・整理します。

## この記事の対象読者
・データ分析の基礎を知りたい
・Kaggleに挑戦してみたい
・機械学習の基礎は分かってきたから、使ってみたい

こんな希望を持つ方々向けの記事になっています。新しい分野へ入門するときは、**入門書を3冊読め**と言われます。いくつかの視点から情報を入れることは、バランスの良い入門になるはずです。

実際のコードなどは、各記事にアクセスして確認してみてください。


## データの確認
まずは、どんなデータを分析することになるのか、確認をしてみましょう。
<img width="992" alt="タイタニック＿データ.png" src="https://qiita-image-store.s3.amazonaws.com/0/281138/cf81475a-02cf-601d-b62b-2cc54f32cd4d.png">
データを見ると、次のことがわかります。
* 数字ではなく文字列のデータがある
* データがかけている場所がある

精度が高い分析をするために、これらをどう処理していくかが重要になります。いくつかのチュートリアル記事を見ながら、
* 欠損値の扱い
* 文字列データの扱い
* 特徴量の扱い
* どんな機械学習アルゴリズムを使うか
などを比較しながら、勉強していきましょう。



## 1. 【Kaggle初心者入門編】タイタニック号で生き残るのは誰?
[【Kaggle初心者入門編】タイタニック号で生き残るのは誰?](https://www.codexa.net/kaggle-titanic-beginner/)

### 欠損値
* Ageには中央値を
* Embarkedには、一番多いSを
* Cabinは不使用

### 文字列から数値へ
* Sex　　0、1
* Embarked　　0、1、2

### モデル作成
* "Pclass","Age","Sex","Fare", "SibSp", "Parch", “Embarked”を特徴量とし、決定木を使用。





## 2. Kaggleのtitanic問題で上位10%に入るまでのデータ解析と所感
[Kaggleのtitanic問題で上位10%に入るまでのデータ解析と所感](http://www.mirandora.com/?p=1804
)

### 欠損値
* 生存が、性別、年齢と相関が高いことに注目。敬称”mr”、”master”、”miss”、”mrs”と年齢との関係を使い、欠けている年齢を推定する。

### モデル作成
* SVM



## 3. KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)
[KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)](https://lp-tech.net/articles/0QUUd)

### 欠損値
* Ageには平均値を
* Embarkedには平均を
* Cabinは不使用

### 文字列から数値へ
* Name　敬称によって分類
* Ticket 先頭の文字、文字列の長さで分類
* Cabin　先頭の文字で分類

### 新しい特徴量の追加
* FamilySize　何人家族か
* IsAlone　一人かどうか

### モデル作成
* ランダムフォレスト　グリッドサーチによるパラメーターの最適化あり


## まとめ
* 欠損値の扱い
* 文字列データの扱い
* 特徴量の扱い
* どんな機械学習アルゴリズムを使うか

これら注目ポイントを確認できたでしょうか？この流れに触れることが、データ分析への一歩になるはずです。
MojaveでVMware Fusion 8は動作した


今回はMacOSX Mojaveでいつぞやのブラックフライデーセールで買った
VMware Fusion 8.xを動作させる方法です。

調べてみるとMojaveにアップデート後にFusionが正常に動作しない人がちらほらいるようです。
(中には断念してMojave正式対応している11を購入している人も。。。)

##症状
症状としてはインストールイメージ選択後、仮想OSの画面操作時にマウスやキーボードといった類の操作を
**全く受け付けません**。また、仮想ディスクも正常に読み取れていないようにも見えました。


##ソフトウェア要件を確認してみる##
下記VMwareの公式見てみると8.x系のソフトウェア要件には **Mac OS X 10.9 以降** と書いてあります。
別に**mojave非対応**とは書いてありません。

[VMware Fusion のシステム要件 (2005196)](https://kb.vmware.com/s/article/2005196?lang=ja)

##原因はアクセシビリティの設定##
いきなり答えとはなってしまいますが原因はMojaveから追加されたアクセシビリティの設定を
行っていなかった為です。

実はvmware初回起動時にアクセシビリティに追加するか確認のメッセージが出てきます。
ただ、私は [ESETにやられて](https://qiita.com/senmu/items/39ed7644ea0442821fd6) アクセシビリティが正しく追加できてませんでした。
ESETをアンインストールしたのちアクセシビリティをきちんと設定してあげたことで解決しました。

##対処方法
1. **システム環境設定　> セキュリティとプライバシー > プライバシー > アクセシビリティ** に進みます。
2. 画面下の**＋**ボタンからアプリケーションフォルダ配下のVMware Fusionのアイコンを選択する。

<img width="673" alt="スクリーンショット 2019-02-18 22.09.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/363633/dd7d7d17-3363-45a0-6044-bd13c75c5a9a.png">
ちなみに自分はフルディスクアクセスにも追加してありますがこちらは必要ないかも。
<img width="673" alt="スクリーンショット 2019-02-18 22.09.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/363633/1c316f21-0c89-f696-e28b-e44c8247fa95.png">
(というかMojaveに正式対応してないアプリってだいたいこの設定してあげれば動くんじゃ...)
GCPにWindowsサーバを立ててみた(その1)

#サーバがない！
自由に使えるサーバがなくて困ったことはないでしょうか？
以前はオンプレでVMwareサーバを用意していたのであまり困ったことがなかったのですが、現在の職場には余っている物理サーバもなく、AWSやGCPといったクラウド環境も用意されていないので、気軽に試せるサーバがなくて困りました。

#AWSとGCP
AWSは無料試用したことがありましたので、今回はGCPの無料試用を利用してサーバを立ててみることにしました。
GCPが良いと感じたのは、無料試用期間が終わっても勝手に請求されることはない点です。
以前AWSを無料試用した際に、「ディスクの削除漏れ」に気づかず、無料試用終了後に課金されて初めて「削除漏れ」に気づいたことがありました。
GCPではこういった不安がない為、お試しするには大変お勧めです。

#GCPアカウント作成
わかりやすい記事がありましたのでこちらを参考に。
https://blog.a-know.me/entry/2016/09/18/212947

#仮想サーバ構築
GCPのアカウントが作成出来たらログインし、「VMインスタンス」を選択します。
![2019-02-17_18h04_20.png](https://qiita-image-store.s3.amazonaws.com/0/359386/a231308a-b8be-5ab8-4856-3ec683798bf1.png)

「インスタンスを作成」をクリック
![2019-02-18_22h53_10.png](https://qiita-image-store.s3.amazonaws.com/0/359386/4c8716e5-8cca-0637-525f-5b60a32b681b.png)

②「名前」は好きな名前を付けてください。、
③特に理由がなければ「リージョン」と「ゾーン」は「asia-northeast」で良いと思います。
④マシンタイプは vCPU × 2 メモリ7.5GBとしました。
　vCPU × 1 メモリ3.75GBでも動きますが、私は遅くて耐えられませんでした。
⑤ブートディスクは今回Windows Server 2019 Datacenter を選択しています。
⑥HTTPSトラフィックを許可しておきましょう。チェックを入れていないとRDPが繋がりません。

![2019-02-18_22h49_00.png](https://qiita-image-store.s3.amazonaws.com/0/359386/1e85b3bc-930c-e3c1-9e10-96cf41546585.png)

今日はここまで。次回続きを書きます。
Hyper-V 上の Linux に 別のマシンから SSH で接続する

2023/05/19 追記
https://atmarkit.itmedia.co.jp/ait/articles/2008/14/news018.html
分かりやすい。"Default Switch" では WinNAT でホストを経由してゲストもインターネットへはアクセスできるけど、他のマシンからは見えない。それをやるためには external (外部) switch にする必要がある。

2022/04/18 追記
単に Hyper-V マネージャー -> 仮想スイッチマネージャー から、新しい仮想ネットワークスイッチ -> 外部で作成したほうが楽かも。次回試してみる。

デスクトップ PC の Hyper-V 上に Ubuntu を構築したんだけど、別のノート PC から SSH 接続したかったときのやりかたまとめ。

NAT テーブルにポートフォワーディングを設定する。以下のサイトを参考にした。(というかそのまま)
http://www.vwnet.jp/Windows/WS16TP5/2016050502/TP5NAPTvSW.htm

IPv6 は無効にしておいたほうがいいかも
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194352/292f4de2-93f1-cc8c-f127-15fcc3c67340.png)

ポイント

- すでに "Default Switch" という仮想 NAPT スイッチがあるが、こちらは使わず新しいスイッチを追加する。
- 名前やアドレスなど細かいところを変えてもいいと思うが、愚直にコピーした。
- DNS サーバの "8.8.8.8" は、Google が提供しているパブリック DNS とのこと。
- Mura さんのサイトはとても分かりやすくていろいろと勉強になりました。
    - http://www.vwnet.jp/Windows/WS12R2/Hyper-V/Hyper-V_Network.htm
ライブラリの導入と、Alamofireの導入手順

# はじめに...
初心者からすると触りにくいライブラリの導入について、自分が一番簡単だと思っている手順を紹介します。
自分がすごく壁を感じてたところだったので、初めての人にわかりやすいように書けたらなと思ってます。。

開発環境は xcode Version10.1です。


それでは最初にライブラリの導入の種類を簡単に紹介します。

# ライブラリの導入の方法の種類の説明
#### 1.CocoaPods
ライブラリの設定が手軽で、多くの人はこのやり方をしているんじゃないでしょうか。
しかし、実は面倒な作業が発生するし、柔軟性がないためあまり推奨はしていません。(特にチーム開発）
Cocoapodsでは配布時に必要となるPodSpecをプロジェクトに追加しなければなりません。
しかし、ここに追加する情報は、XcodeとGitHubに既に存在している情報なので,結果情報が重複していることになるのです。
#### ２.swift Package Manager
ついにswiftの公式Packageが出ましたが、以前からあった他の二つのやり方に比べて、難しいし使い勝手もまだ悪いです。
#### ３.Carthage
正直、projectとCartfileを結びつつけるのはめんどくさいとも言われています。
でも一度覚えてしまったら難しいことではないので大丈夫です。
いい点としては、brewにインストールするので簡単ですし、ライブラリを最初にインストールしてしまうことで、buildが他の方法より早くなります。
Carthageが好まれるのはこの点ではないでしょうか。


私はCarthage推奨派なので、今回このやり方で進めさせていただこうと思ってます。
# プロジェクト作成からライブラリの導入まで
### Homebrewの導入
(Homebrewとは`パッケージ管理システム`の一つです。)
この処理はPC内で一度してしまえば,それ以降する必要はありません。
下のコマンドでHomebrewがインストールできます。

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
### Carthageの導入
さっきインストール経由してCarthageをインストールする。
下のコマンドでインストール。

```
brew install carthage
```
これも一度PCでしてしまえばそれ以降する必要はありません。
ここまででCarthageを用いる準備ができました。
### ライブラリの導入
最初にライブラリを導入したいプロジェクト(今回`Qiita_Viewer`で作っています)のところまで移動。

```
cd ~/Desktop/Qiita_Viewer
```
その後、

```
touch Cartfile　// Cartfileを作成
vim Cartfile // Cartfileを編集
```
ここで作った`Carfile`のなかに下のコードを書き込んでください。

```
github "Alamofire/Alamofire"
github "SwiftyJSON/SwiftyJSON"
```

編集方法はこうです。
`i`を押して入力モード`esc`で入力モードから抜ける。
その状態で`:wq`で保存して終了。
保存したくない場合は、`:q!`で保存せず終了できます。

~~~~
carthage update --platform iOS
~~~~
結構時間がかかりますが、完了すると以下のような状態になります。

<img width="764" alt="スクリーンショット 2019-02-18 22.10.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/363627/2342409a-5bc3-48d7-d344-e2cad28af298.png">

*これでライブラリの導入は完了！*

次に実際にプロジェクト内でライブラリを追加する作業を行います。
### プロジェクト内にライブラリを追加
まず、新しいプロジェクトファイルを`SingleViewApp`から立ち上げてください。

まずプロジェクトファイルのGeneralタブから、
`Linked Frameworks and Library`にある＋ボタンを押します。
<img width="1440" alt="スクリーンショット 2019-02-18 22.20.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/363627/b53e1de6-138e-4ae4-2d7a-640e66e60ab9.png">
FrameWorksを選択する画面になるので、`Add Other..`を選択。
<img width="491" alt="スクリーンショット 2019-02-18 22.30.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/363627/8269eed1-31dd-4a0c-17e7-f6c419a19e3c.png">


プロジェクトのディレクトリ内から、Carthage/Build/iOSと移動し、
ライブラリのAlamofire.frameworkとSwiftyJSON.frameworkを選択します。
<img width="673" alt="スクリーンショット 2019-02-18 22.31.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/363627/87c2866f-eb73-c919-a2c0-a8dc2853deb8.png">
ライブラリが追加できたら、`Build Phases`タブに移動し、
＋ボタンから、「New Run Script Phase」を選択します。
<img width="850" alt="スクリーンショット 2019-02-18 22.41.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/363627/46cdbb04-9f2d-27c5-eccd-43073aad082a.png">
その後、`shell`の部分に

~~~~
/usr/local/bin/carthage copy-frameworks
~~~~
そして次に「input Files」にて＋ボタンを押し、以下のようにframeworkの情報を記述します。

~~~~
$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework
~~~~
<img width="849" alt="スクリーンショット 2019-02-18 22.51.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/363627/39ba683b-2122-1cac-b569-70fb0a6e6271.png">

これでライブラリの追加は完了です！
THEAI3rd「時代の適者生存」

この記事は私の報告です、Ledge.ai THE AI 3rdのコンファレンスを行きました。
Ledge.ai THE AI 3rdのコンファレンスの内容はちょっと共有したいです。そこに何が見るとか何聞くのことを共有します。
もし、間違い内容があったら、是非下にコメントしてください。
と間違えた日本語がある場合は申し訳ございませんでした。

# バックグラウンド
Ledge.ai THE AI 3rdは、AI x ビジネスのコンファレンスです。AI x ビジネスの大規模カンファレンスとして開催してきたTHE AI。
Ledge.ai THE AI 3rdは虎ノ門ヒルズに開催しました。2019年2月13日（水）。
第1回を開催した1年前と比較して事例や着手企業が増えている中、
Ledge.ai での日々の取材を通しても 
AI・ディープラーニング技術の確かな浸透を見てとれる一方で
未着手領域においては、改めて喫緊の課題であると肌で感じています。

この1年間だけでも、AI・ディープラーニング技術の進化によって変革は進み
AIを導入するための選択肢、提供サービスや働き方の多様化はさらに速度を増して拡張しています。

THE AI 3rdは「今のAI」を捉えて自分の仕事に活かし、
さらなる進化を目指す人のためのイベントです。

# 参加したの講演タイトル

### 基調講演：多様性社会とAI駆動型課題解決
スピーカーはメディアアーティストの落合陽一さん

落合陽一は，大学教員やJST CRESTの研究プロジェクトリーダーとして，AIを用いたタスク指向型開発による社会実装として，身体障害や認知機能の補完を目指すプロジェクトを行なっている．この講演では，そういったタスク指向型システムを開発する注意点や，実世界指向システム周辺の研究動向，ケーススタディなどをお伝えする．

彼がしているのは技術を使った研究であり、技術を持つ人々を助けることです


### キャンバスは無限大のリアル空間～ Design AI ～
スピーカーはフューチャー株式会社の貞光九月さんとライブリッツ株式会社の村澤清彰さん

彼らがしている製品の一つはスポーツのためのAIです。
彼らは分析野球スポーツのためにAIを使用します、どこで打った後にボールが着地するのに最適な位置か、またはボールが着地する場所。

### AI・4K・5Gで進化するALSOKの警備サービス
スピーカーは綜合警備保障株式会社の干場久仁雄さん

ALSOK、製品はカメラのセキュリティです。
それがどのように機能するかは、彼らが写真のより良い解像度を得るために4kの解像度のカメラを使うことです、それで、写真の解像度が明確であるので、AIはそれをよりよく分析できます。 彼らはまた、街中にそんなにたくさんのカメラを持っています、それのすべては、AI分析がそれを分析するシステムの中心にそれを送るのに5G技術を使うことです。

### 士業の業務はAIに代替されるか～「AI‐CON」の挑戦～
スピーカーはGVA TECH株式会社の山本俊さん

「AI con」は、AIを中心とした新しいスタートアップ技術です。
製品はAIを使って手助けするという契約です。
ユーザー企業は、複数の質問に答えるだけで契約書のドラフトを作成可能。契約書のファイルを作成すると、1営業はAIを使って契約書の作成から干渉までをサポートするサービスです。日以内に条文ごとのリスク判定と修正案が提示される。秘密保持契約（NDA）や業務委託契約、ライセンス契約などさまざまな契約書の条項リスク判定に対応する。

AIがレビューした内容を弁護士がチェックすることで、契約業務を効率化。弁護士に直接契約書のレビューを依頼するよりも費用を抑えている。

### AI導入の工夫　コンビニ銀行の事業高度化アプローチは？
スピーカーは株式会社セブン銀行の松橋正明さん

コンビニエンスストア銀行は、外国人もコンビニエンスストア銀行からお金を引き出せる商品を作りたいと考えています。 「アメリカ急行」のような、など
それらの製品は、私たちの顔を検出することで自動認証を検出するカメラを使用するだけで、より便利にコンビニ銀行を作成することです。 とても高齢者も簡単にそれを使用することができます

### Google Cloud の AI 技術をビジネス活用する方法
スピーカーはグーグル・クラウド・ジャパン合同会社の大薮勇輝さん

グーグルクラウドは私たちがすぐに使えるサービスを提供しています。その中にはすでにビッグデータがあり、そのデータは分析のために使われています。
この会議で紹介されているGoogleクラウドAPIには、ビジュアルAPI、言語API、会話APIなどの機械学習APIがあります。
KVMに環境をサクッと立ち上げる

RHEL、CentOSでOSのインストール作業を自動化する "kickstart" を利用して、サクッと環境を構築します。

## 前提
KVMホスト：CentOS7


## 0. virtmanagerの有効化
```
# yum -y install virt-manager qemu-kvm libvirt
```


## 1. ksファイル作成

```
cat <<EOS> /var/iso/centos-ks.cfg
#version=RHEL7

install
cdrom
text
cmdline
skipx

lang ja_JP.UTF-8
keyboard --vckeymap=jp106 --xlayouts=jp
timezone Asia/Tokyo --isUtc --nontp

network --activate --bootproto=dhcp --noipv6

zerombr
bootloader --location=mbr

clearpart --all --initlabel
part / --fstype=xfs --grow --size=1 --asprimary --label=root

rootpw --plaintext password
auth --enableshadow --passalgo=sha512
selinux --disabled
firewall --disabled
firstboot --disabled

reboot

%packages
%end
EOS
```

## 2. ゲストOSディスクの作成
今回は検証目的だったため、ディスクは 10GB で作成しました。
必要に応じてディスクサイズは調整してください。

```
# sudo qemu-img create -f qcow2 /var/lib/libvirt/images/centos.img 10G
Formatting
 '/var/lib/libvirt/images/centos.img', fmt=qcow2 size=10737418240 
encryption=off cluster_size=65536 lazy_refcounts=off
# ls
centos.img
```

## 3. インストールスクリプト実行
```
# cat <<EOS> /var/iso/centos_virt-install.sh
#!/bin/sh
virt-install \
  --name centos7 \
  --hvm \
  --virt-type kvm \
  --ram 1024 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel7 \
  --boot hd \
  --disk /var/lib/libvirt/images/centos.img \
  --network network=default \
  --accelerate \
  --graphics none \
  --serial pty \
  --console pty \
  --location /var/iso/CentOS-7-x86_64-Minimal-1804.iso \
  --initrd-inject /var/iso/centos-ks.cfg \
  --extra-args "ks=file:/centos-ks.cfg console=ttyS0,115200"
EOS

# /var/iso/centos_virt-install.sh
```
約10分ほどで構築完了。


## 参考にさせていただいたサイト
* [KVM に virt-install でコマンドラインだけで CentOS 7 を インストール](https://qiita.com/ngyuki/items/fd469fec1cea873de0bf)
サイトにフォントを追加してみた件

#やってみること
厨二っぽいフォントを使って何か作りたいと思ったので稲塚春さんの__MagicRing__というフォントを使ってサイトを作る！
今回はとりあえずダウンロードしてきたフォントをCSSで指定できるようにします！

#内容
##準備
[ここから](http://inatsuka.com/extra/magicring/)稲塚春さんの__MagicRing__を頂きました。
これを適当な場所に解凍しておきます。（作るhtmlと一緒のディレクトリのほうが指定が楽！）
##追加してみる

```html:index.html
<!DOCTYPE html>
<html lang=ja>
  <head>
    <meta charset="utf-8">
    <title>font_test</title>
    <style media="screen">
      @font-face {
      	font-family: 'magicring'; <!--使用する名前を決める-->
      	src: url('./MagicRing.ttf');<!--fontファイルのあるところを指定-->
      }
      h1{
        font-family: "magicring";
      }
      h1:hover{
        color:red;
      }
    </style>
  </head>
  <body>
    <h1>hogehoge</h1>
  </body>
</html>
```

![SnapCrab_NoName_2019-2-18_22-16-44_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/323051/2b6027ea-2311-a765-e7dc-339a84ea66d3.png)
↑適用前
↓適用後

![SnapCrab_NoName_2019-2-18_22-16-30_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/323051/d3f53cb1-8348-802e-3295-e79c7e10a9b7.png)

こんなかんじで出来ました！

#遊んでみた
厨二心をそそられたのでこんな装飾をつけてみました。
[厨二ページ](http://yumr.html.xdomain.jp/font_test/)



以上です。
OSX MojaveとESETの相性問題

初投稿です。せんむです。
今回はOSX MojaveとESETの相性問題です。

##発生した事象
1. OSX標準の"画面共有.app"でリモートサーバ接続後、制御権のあるアカウントであるにもかかわらず  
リモートセッションの**制御**ができない。(マウス、キーボードが反応しない。)  
2. **システム環境設定 > セキュリティとプライバシー > プライバシー >   
アクセシビリティ/フルディスクアクセス** に登録したアプリケーションが**表示されなくなる**。  
以降はアプリケーションが**追加できない**。

##原因はESETにあり
2.の症状はESET側の障害情報ということで開発元より正式に広報されています。
1.の症状は2.の対処としてESETをアンインストールしたことで治りました。 

[ESET製品をインストール後、アクセシビリティ/フルディスクアクセスの登録内容が表示されなくなる](https://eset-support.canon-its.jp/faq/show/12752?site_domain=default)



##対処方法
下記ページに記載の通り、**インストーラー付属のアンインストーラーを使用して完全にESETを削除します。**
削除後、**ESET V6.6.300.2** をインストールします。

[アンインストール方法（Mac環境向け）](https://eset-support.canon-its.jp/faq/show/1360?site_domain=default)

自分は削除したままV6.6.300.2はインストールしてないので 1. の症状が改善されてるかは未確認です。

余談ですがESETのパーソナルファイヤーウォールを有効にしてるとOS側で**リモートログインを有効**にしても
**22番ポートは遮断されますので**例外設定を別途行う必要があります。(当たり前か)
Rails　Herokuにpushで詰まった話

#git push heroku masterで詰まった
今回は,Herokuにアップロードしようとした所で詰まったので記録しておきます。

```
$ git push heroku master
・
・
・
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !       Push rejected to tranquil-wave-48446.
remote: 
To https://git.heroku.com/tranquil-wave-48446.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to・・・以下略
```

```
remote: -----> Ruby app detected
remote: 
remote:  !
remote:  !     You must use Bundler 2 or greater with this lockfile.
remote:  !

```

実行した所複数のエラーが発生し、何が原因化を模索・・・

pgの指定がおかしいのか、gemfile.lock、bundlerのバージョンが問題なのか調べても中々解決策が見つからない、わからない

#bundler バージョンが問題？
自分の環境とHeroku上の環境でbundlerのバージョンが異なることによるエラーが原因（？）の様でした。


https://github.com/bundler/bundler/issues/6784

以上の記事を参考にさせていただきました。


```
$ heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
```

を実行の後、再びHerokuへPushした所無事にアップロードができました！！！

#感想
問題解決後にエラーを再検索してみると、同じ様なエラーになった人の記事がチラホラとありました。

もっと早い段階で気がつくことはできなかったのだろうか？
調べ方に改善の余地があるのかもしれない
ローカル修正済みのファイルがリモートでフォルダ構成を移動されていた場合に対象ファイルを抽出する

#ローカル修正済みの(pushしていない)ファイルがリモートでフォルダ構成を移動されていた場合に、ローカルの対象ファイルを抽出するコマンド

そんなことある？？？？？？と思われるかもしれないが、あった。

フォルダ構成を(`git mv`あるいは`filter-branch`を使わずに)変更した場合はファイルが削除&追加されてしまう。そのままマージすると、同じファイルが(別の履歴・内容を持った状態で)2つ存在することになるはずである。従って、ローカルのコミットに含まれる当該ファイルを排除した状態でマージを実行したい。
普通に`diff --name-status`を取るとリモートで移動したファイルがすべて(DおよびAで)表示されてしまう。今回は変更ファイルが数百程存在したため諦めた。

欲しいものは、ローカルの変更ファイルとリモートの移動済みファイルの集合である。
順序はどちらでも良いが、今回はローカル側の変更ファイルの方が少なかったため「ローカルの変更ファイルのうち、移動済みだったものを探す」方向で考えた。

```git:bash
$ git diff HEAD~..HEAD --name-only | xargs -n1 -I{} git diff --name-status --diff-filter=A origin/develop..HEAD {}
```
`git diff <SHA1>..<SHA1> --name-only`の標準出力を`xargs`コマンドによるパイプで繋いで`origin/develop`とのdiffに渡している。フィルダ構成が変わっている＝gitは新ファイルとして認識しているので`--diff-filter=A`で抽出している。`diff`の`--name-status`はdiff-filterと効果が被るが、分かり易さ優先で付けた。更にパイプで繋ぐ場合は`--name-only`にすると良いと思う。

```shell:出力
A       some/file/path/and/file_name.cpp
A       some/file/path/and/file_name.h
  ...以下差分ファイル一覧
```
今回は結局、ローカルのコミットが1つだけであり、さらに対象のファイルは2つだけだったため、一旦`reset --soft HEAD~`してから`git reset */file_name.*`してコミットした。その後にマージしたりなんやかんやして、ローカルの変更をコピペで反映して事なきを得た。
Terraformモジュール利用を断念したAWSリソースを纏める

Terraformのモジュール利用を断念したリソースとその理由を自分の備忘として残しておこうと思います。
Terraformのコード設計時は全てのAWSリソースでモジュール利用した方が
開発効率が高いと思っていましたが、違う場合もありました。。という話です。
モジュールを利用する方針とした理由は下記の記事に書いています。
https://qiita.com/toma_shohei/items/06c210b9481a46f2c20e

#利用AWSリソース
セキュリティ：IAM、Certificate Manager
NW：VPC、VPC Peering、VPN、DirectConnect、CloudFront、Route53
Server:EC2、ELB、S3、EFS、NATGateway、SES、EC2 Auto Scaling
DB：RDS、RDS（Aurora）、ElastiCache
CI/CD：CodeDeploy
監視、運用：CloudWatch、CloudTrail
分析：Elasticsearch Service、Athena、QuickSight

#RDS（Aurora）
パラメータグループがモジュールに引き渡しできない。

#CodeDeploy
ec2_tag_filterをモジュールに引き渡しできない。

#RouteTable
RouteTableを作成するモジュールがなかった。（ルートテーブルにルールを追加するモジュールはあり。）

#S3
S3の暗号化機能やログ取得オプションなどを有効にする設定はモジュールでの実現は難しい。
（設定パターンごとにCountを利用して無理やり作ることは可能だが非効率）
デフォルト設定などで利用する場合はモジュール利用可能だが、今回は全てモジュール利用しない方針とした。



※まだ構築完了したわけではないので、追加あれば書いていきます。
picoCTF 2018 assembly-1 - Points: 200

#問題

https://2018game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ebc6471e-f3c4-730e-76a7-0bcb0ec1418f.png)

#解いてみた

asm1(0xcd)のときにリターンは何かという問題です。
似たような問題が以前もありました。
[picoCTF 2018 assembly-0 - Points: 150](https://qiita.com/CTFman/items/cd67cdc8acfe58301672)

まずはダウンロードしてみます。
問題のとおり、アセンブラでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/3a2baa39-dc13-ca8d-5c44-1e02f1eba2de.png)


まず前提として以下は忘れないように。

- 引数はebp+0x8に入っている
- 戻り値は関数が終わったときのeax

順に追っていきましょう。

9行目の

```
cmp	DWORD PTR [ebp+0x8],0xde
```

で0xcdと0xdeを比較しています。
もちろん異なりまして0xcd＜0xdeです。

10行目の

```
jg 	part_a
```

は「＞」のときにジャンプする命令なので、今回はジャンプしません。

次に11行目の

```
cmp	DWORD PTR [ebp+0x8],0x8
```

は0xcdと0x8の比較です。
もちろん0xcdと0x8は異なります。

12行目の

```
jne	part_b
```

は等しくなければジャンプなので22行目にジャンプします。

23行目の

```
mov	eax,DWORD PTR [ebp+0x8]
```

でeaxに0xcdが代入されます。

24行目の

```
sub	eax,0x3
```

はeax-0x3をeaxに代入します。
0xcd-0x3は0xcaなのでeaxが0xcaになります。

25行目の

```
jmp	part_d
```

でジャンプ。

part_dはretがあるので関数の終了。
あれ？これで終わり？
他のところはダミーでしょうか？

とりあえず現状のeaxの値は0xcaなのでこれを入れてみると正解でしたー。
Mac mini はアプリ開発者の救世主かもしれない

# はじめに
モバイルアプリ開発にとって、マシンスペックは開発効率に直結しますよね。
iOSアプリ開発を行なっているときの、ビルド時間が長いこと長いこと。。。

さすがに時間が勿体なさすぎたので、
MacBook Pro 13-inch (2017) -> Mac mini (2018) に乗り換えました。

その結果、**めちゃめちゃ快適になりました。**

今後、弊社アプリチーム全体に高スペックMacを導入すべく、簡単に比較を行いました。

iMac Proはちょっと無理。。。って場合に、25万ほどのMac miniは乗り換えの有力候補になると思いますので、参考までにどうぞ。

# ビルド時間比較
私が関わっているiOSアプリのクリーンビルドを10回行いましたので、
そのビルド時間平均を記載します。

* 環境
    * Mojave
    * Xcode 10.1

| Mac mini | MBP |
|---|---|
| 44.8184 sec | 92.1546 sec |

約1/2の時間でビルドが完了するようになりました。

<details><summary>計測時間詳細</summary><div>

| Mac mini | MBP |
|---|---|
| 43.655 | 93.531 | 
| 45.136 | 92.335 |
| 44.224 | 91.599 |
| 44.480 | 92.748 |
| 44.399 | 92.554 |
| 44.926 | 91.984 |
| 44.748 | 91.456 |
| 44.511 | 92.276 |
| 46.918 | 91.549 |
| 45.187 | 91.514 |

</div></details>

# スペック比較
今回利用したマシンスペックは、こんな感じです。

| | Mac mini | MBP |
|---|---|---|
| CPU | Intel Core i7-8700B | Intel Core i5-7360U |
| Memory | 32GB 2,666MHz DDR4 | 16GB 2,133MHz LPDDR3 |
| Storage | 512GB SSD | 256GB SSD |
| [Geekbench](https://browser.geekbench.com/mac-benchmarks) Multi-Core スコア | 24243 | 9075 |

# 乗り換え時に気をつけるポイント
- Mac miniには入力/出力インターフェースを外付けする必要があるので、持っていない場合は別途購入が必要です。
    - キーボード
    - マウス or トラックパッド
    - ディスプレイ
- GPUのアップグレードはできません。もし、増設したい場合はeGPUを買いましょう。
    - https://www.apple.com/jp/search/eGPU

# さいごに
ビルド時間が半分以下になったことで、ストレスが大きく軽減されました。
さらに、ビルド中にSketch, Chrome, Slack などのチェックをしていても、
全くカクツクことはなく、ここも大きなストレス軽減ポイントの一つです。

2,3月は費消の時期なので、交渉したらサクッとOKもらえるかもしれませんよ。
【Rails】Active Storage環境下でGoogle Cloud Visionのセーフサーチを実装

個人開発のWebアプリ**「[まちかどルート](https://machiroute.herokuapp.com/)」**v5.42への実装メモです。
![cloudvision (1).png](https://qiita-image-store.s3.amazonaws.com/0/335872/413407af-8f57-e113-1d5f-ddcbed0a2cf2.png)

# まえがき

Rails 5.2のファイルアップローダーであるActive Storage環境下だと**Google Cloud Vision**のセーフサーチがうまく動かなかったので下記のように工夫しました。

具体的には画像ファイルを /public にいったん配置して、そのパスを指定して画像分析にかけ、終わったら /public から削除するという流れです。

```ruby:posts_controller.rb
# 画像の選択の有無を判断
if post_params[:image] != nil
 # 画像を uploaded_file に格納
 uploaded_file = post_params[:image]
 # /public へのパスを指定
 output_path = Rails.root.join('public', uploaded_file.original_filename)
 # ファイルを開いて image_file に格納
 image_file = File.open(output_path)

 # Google Cloud VisionのAPIを使う
 image_annotator = Google::Cloud::Vision::ImageAnnotator.new
 response = image_annotator.safe_search_detection image: image_file
 response.responses.each do |res|
  safe_search = res.safe_search_annotation
  # if文では公式ドキュメントと違って .to_s を付ける必要がありました
  if safe_search.adult.to_s == "VERY_LIKELY" || safe_search.adult.to_s == "LIKELY"
    flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"
    redirect_to root_path
    return
  elsif safe_search.violence.to_s == 'VERY_LIKELY' || safe_search.violence.to_s == 'LIKELY'
    flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"
    redirect_to root_path
    return
  elsif safe_search.medical.to_s == 'VERY_LIKELY' || safe_search.medical.to_s == 'LIKELY'
    flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"
    redirect_to root_path
    return
  end
 end
# 最後に /public の画像ファイルを削除します
File.delete(output_path)
end
```
上記のコードを適所に書けばGoogle Cloud Visionのセーフサーチが機能します。そこで`VERY_LIKELY`または`LIKELY`と判断されれば`root_path`にリダイレクトされるようになります。

# あとがき

Active Storage環境下だと公式ドキュメントどおりにやってもうまくいきませんでした。また、事前に`gem 'google-cloud-vision', '~> 0.32.2'`を`bundle install`したあとに「protobufが見つかりません」という内容のエラーが出ました。そこで`Gemfile` に `gem 'google-protobuf', '~> 3.7.0.rc.2'`を追記のうえ`gem update google-protobuf`を実行することで回避できました。

こちらの記事も合わせてどうぞ。

[【Rails】Active Storage + S3 + Active JobでGoogle Cloud Visionセーフサーチ](https://qiita.com/west2538/items/e94db445e22e6151718d)
Django Webアプリ作成(4) モデル作成

環境
OS : macOS Mojave
Anaconda : python3.6.7
Django==2.1.5

#今回の目標
アプリの中身の最重要部分"モデル"の作成

#モデルとは
簡単に言うと、"データベースのデータの集合"
データベースにデータを格納しておいて状況に応じて取り出すイメージ

#必要なデータは...
今回のアプリは、ブログということで当然タイトルと内容(テキスト)は必要でしょう。
その他、筆者と作成日時と更新日時を要素(データ)としよう！

#models.py
models.py内にPostクラスを作成

```python:blog/models.py
from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

```

#データベースの作成と追加
データベースの作成

```:Terminal
python manage.py makemigrations
```

データベースの追加

```:Terminal
python manage.py migrate
```

#管理者ページ(Django admin)の作成
blog/admin.pyに作ったモデルクラスを登録

```python:blog/admin.py
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
```

#スーパーユーザーの作成
管理者サイトにログインできるスパーユーザーを作成する。

```:Terminal
python manage.py createsuperuser
```
#管理者ページにログインして記事を投稿
開発サーバを起動

```:Terminal
python manage.py runserver
```
ブラウザでアクセス

```:ブラウザ
http://127.0.0.1:8000/admin
```

先程登録したユーザー、パスワードでログイン
無事ログインできましたか?
3つほど記事を投稿してみましょう!

次回はWebサイトのページを作っていきます！
プログラミングでわかりやすい変数名の決め方

# 目的
**「読みやすいコードを書く」**

読みやすいコードを書く上で、わかりやすい変数を命名することは非常に重要。
自分が日頃から意識している命名ルールをまとめる。


＊[na90ya](https://qiita.com/na90ya)様にコメントでご指摘いただいた点を改善しております。ありがとうございます！
## ルール一覧
- 1. df, tmp, data, a, 等の名前は使わない！
- 2. 何を指している変数かすぐわかる名前をつける
- 3. 一つの変数に一つの意味
- 4. 略語を使うならば、意味を残しておく


## 1. df, tmp, data, a, 等の言葉は使わない！
読みやすいコードを書く目的は、コードレビューやコードの改善、機能の追加等が考えられるが、その時に全ての変数がa1, a2, a3...とかだったら、なんのことやらわからない。

だから、変数名を決める時はめんどくさがらずに意味を持った名前をつける！

＊例外
(例)２つの変数の中身を入れ替えるコード

```python
right = 0
left  = 1
if right < left:
    tmp = right
    right = left
    left = tmp
print(right, left)
```

このような場合、tmpという名前で全く問題ない。
tmpはデータの一時保管場所の役割を果たしており、「この変数は他に役割がない」ことを示している。
変数の寿命（変数が3行しか登場しない）が十分短い時はこのように使用してもいい。

＊pythonでは下記のように簡単に記載できるが、tmpの例として上記をあげている。

```python
right, left = left, right
```
## 2. 何を指しているすぐ変数かわかる名前をつける
その変数名を見て何のデータかすぐにわかる名前をつける

例）new_dataの意味は？
1. 新たに生成したデータ
2. 何かしらフィルタをかけた後のデータ

newの意味は幅広く一見何を表しているかわからない。
もしも、上記の意味のデータならば

1. created_data
2. selected_data, filtered_data

等の単語を使うべきだろう。
その言葉を見ただけで、なんのデータかわかるようにするといい。

＊オススメのサイト
[codic: プログラマーのためのネーミング辞書](https://codic.jp)
日本語を記入すると、それに対応する短くわかりやすい英単語を返してくれるサイト。
[使い方はこちら](http://niisi.hatenablog.jp/entry/2016/08/17/171000)

## 3. 一つの変数に一つの意味
##### 途中で変数の意味を変える  or  一つの意味のデータなのに複数変数名がある　はNG!

- 途中で変数の意味を変える
これは当たり前だが、途中で変数の内容が変わったら読みにくい。
一度変数を決めたら、その後は変数を変更しないようにする！

- 一つの意味のデータなのに複数変数名がある
user_ID, account_ID, ID ...
別々のIDだから名前を変えていると推測するため、一つのデータには一つの変数名のみを使用する。

## 4. 略語を使うならば、意味を残しておく
よく使う単語は略したくなる。
filter -> _f
select -> _sel
columns -> col

こうして並べてみると一目瞭然だが、何も知らない人が見たらわからないかもしれない。
だから、できるだけつけるのはやめたほうがいい。
もしつけるのならば、チームで共有する。最初に略語一覧を書く。等を意識する。



# まとめ
自分以外の人が読む時のことを常に意識しながらプログラミングすることは非常に重要なので、ぜひ意識して実践して欲しい。

### 名前をつける上で非常に参考になるサイト・書籍
- [プログラミングでよく使う英単語のまとめ【随時更新】 - Qiita](https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923)

- [リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)   Dustin Boswell] (https://www.amazon.co.jp/dp/4873115655/ref=cm_sw_r_tw_dp_U_x_PdRACbQAXPAM4 )
以上です。ご意見・感想があれば嬉しいです。
AtomにおけるPython開発環境構築

# はじめに

﻿[Atom](https://atom.io/)テキストエディタに[Python](https://www.python.org/)開発環境を最小限の拡張パッケージで構築します。各節の名称がパッケージ名になっているので，その名前でパッケージを検索してインストールしてください。Pythonの実行環境は、[Miniconda](https://conda.io/en/latest/miniconda.html)を使い、`C:\Users\daizu\Miniconda3`以下にインストールされていることを想定します。適宜読み替えてください。

## [platformio-ide-terminal](https://atom.io/packages/platformio-ide-terminal)

Atom内でターミナルを実行します。

### Settings

* Auto Run Command: C:\Users\daizu\Miniconda3\Scripts\activate.bat base
* Shell Override: C:\Windows\System32\cmd.exe

（後から、仮想環境`base`はデフォルトで使う別の仮想環境名にしても構いません。）

## [MagicPython](https://atom.io/packages/magicpython)

Python言語のパッケージとしてMagicPythonを使います．コアパッケージのlanguage-pythonはdisableにします．

## [atom-ide-ui](https://atom.io/packages/atom-ide-ui), [ide-python](https://atom.io/packages/ide-python)

AtomでPython開発をするときの必須パッケージです。まずは、Minicondaの仮想環境`atom`を作成します。Atomエディタで [Ctrl]-\` を入力し、platformio-ide-terminalのコマンドプロンプトを開き、以下を実行します。

```bash
(base) > conda create -n atom python
(base) > activate atom
(atom) > pip install python-language-server[all] pyls-isort pyls-mypy
```

Atomが`atom`環境を認識できるように、パスを追加します。AtomのFile->Init Script...で`init.coffee`を開き、

```coffee
process.env.PATH = [
  "C:\\Users\\daizu\\Miniconda3\\envs\\atom",
  "C:\\Users\\daizu\\Miniconda3\\envs\\atom\\Library\\bin",
  "C:\\Users\\daizu\\Miniconda3\\envs\\atom\\Scripts",
  process.env.PATH
].join(";")
```

を追加します。（後述するように、続けて別の仮想環境をパスに追加することもできます。）これで、pycodestyle, pyflakes, isort, mypyなどがAtom上で使えるようになります。

## [Hydrogen](https://atom.io/packages/hydrogen)

[Jupyter](https://jupyter.org/)を使って，Atom上でPythonコードの実行ができます．インタラクティブな実行が可能なので，非常に重宝します．Hydrogenを使う仮想環境下（仮に`daizu`とします）で，以下を実行します。

```bash
(base) > conda create -n daizu python
(base) > activate daizu
(daizu) > conda install jupyter
(daizu) > python -m ipykernel install --user --name daizu
```

`init.coffee`を開き、以下のように変更します。

```coffee
process.env.PATH = [
  "C:\\Users\\daizu\\Miniconda3\\envs\\atom",
  "C:\\Users\\daizu\\Miniconda3\\envs\\atom\\Library\\bin",
  "C:\\Users\\daizu\\Miniconda3\\envs\\atom\\Scripts",
  "C:\\Users\\daizu\\Miniconda3\\envs\\daizu",
  "C:\\Users\\daizu\\Miniconda3\\envs\\daizu\\Library\\bin",
  "C:\\Users\\daizu\\Miniconda3\\envs\\daizu\\Scripts",
  process.env.PATH
].join(";")
```

以上で、開発環境が整いました。
JavaScriptのforEachで同期的にawaitが使えない問題の対処法

JavaScriptのforEachでawaitが使えない問題とは、次のような問題です。

```javascript
const arr = [1, 2, 3];

arr.forEach(async (el)=>{
  await someFunction(el)
})
```
これは、someFunctionを同期的に3回呼び出そうとして書いたコードです。
しかし実際に実行すると分かるのですが、
someFunction(1)
someFunction(2)
someFunction(3)
はそれぞれの完了を待たずに一斉に呼び出されています。
これはforEachメソッドの性質ですので、どうすることもできません。
## JavaScriptのforEachで同期的にawaitが使えない問題の対処法
`for of`文を使い、全体をasync関数でラッピングすることでこの問題は解決できます。

```javascript
const arr = [1, 2, 3];
(async(){
  for(let el of arr){
    await someFunction(el)
  }
})()
```
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Goの文字列操作でよく使う関数

Goの文字列操作でよく使う関数を記載しています。

## 文字列の結合

```go
strings.Join([]string{"I'm","love in it"}, " ") // "I'm love in it"
```

## 文字列のカウント

```go
strings.Count("Mac Mac Mac Mos", "Mac") // 3
```

## 部分文字列の検索

```go
strings.Contains("Macdonald", "Mac") // true

// 指定した文字列のどれかが含まれるか
strings.ContainsAny("Macdonald", "Md") // true

// Prefixで検索
strings.HasPrefix("Macdonald", "Mac") // true

// Suffixで検索
strings.HasSuffix("Macdonald", "donald") // true
```

## 文字列の置換

```go
strings.Replace("I love Mac", "Mac", "Mos", 1) // "I love Mos"
strings.Replace("MacMacMac", "Mac", "Mos", 2) // "MosMosMac"
strings.Replace("MacMacMac", "Mac", "Mos", -1) // "MosMosMos"
```


## 文字列の分割

```go
strings.Split("Mos,Mac,BergerKing,Lotteria,KFC", ",") // []string{"Mos", "Mac", "BergerKing", "Lotteria", "KFC"}
```

## 大文字/小文字変換

```go
strings.ToLower("MACDONALD") // "macdonald"
strings.ToUpper("macdonald") // "MACDONALD"
```

## 空白トリム

```go
strings.TrimSpace("  Macdonald . ") // "Macdonald ."
```
Abstractive Summarization of Reddit Posts with Multi-level Memory Networks 

## [[DL輪読会]Abstractive Summarization of Reddit Posts with Multi-level Memory Networks](https://www.slideshare.net/DeepLearningJP2016/dlabstractive-summarization-of-reddit-posts-with-multilevel-memory-networks-132350977?ref=https://deeplearning.jp/abstractive-summarization-of-reddit-posts-with-multi-level-memory-networks/)

![スライド02.png](https://qiita-image-store.s3.amazonaws.com/0/140539/cebcaf8b-fe7b-d8c5-0c6a-394a328d18f2.png)
###[Reddit TIFU dataset](https://github.com/ctr4si/MMN)
![スライド03.png](https://qiita-image-store.s3.amazonaws.com/0/140539/90aa6298-0345-a19f-d935-bd18f60f8dbf.png)
![スライド04.png](https://qiita-image-store.s3.amazonaws.com/0/140539/0d80eb2a-70f0-c256-e0dd-ddc2848a66e6.png)
![スライド05.png](https://qiita-image-store.s3.amazonaws.com/0/140539/b35883bd-f7af-4dec-d227-f321d72c9cb8.png)
![スライド06.png](https://qiita-image-store.s3.amazonaws.com/0/140539/74767438-097f-f350-1a3e-d77770e76ee3.png)
![スライド07.png](https://qiita-image-store.s3.amazonaws.com/0/140539/8b012c76-4798-3388-acb0-a0af79d6e475.png)
![スライド08.png](https://qiita-image-store.s3.amazonaws.com/0/140539/f3f6aa8d-cfd9-63a7-b8ae-b8fe7f757aa8.png)
![スライド09.png](https://qiita-image-store.s3.amazonaws.com/0/140539/9aaa9577-3373-48fe-4bde-e3d199cdf580.png)
![スライド10.png](https://qiita-image-store.s3.amazonaws.com/0/140539/564ac72b-ee50-9cd6-310d-428aef0efea8.png)
![スライド11.png](https://qiita-image-store.s3.amazonaws.com/0/140539/371adcfe-467f-3ea8-6ccd-63669b0eb3bc.png)
![スライド12.png](https://qiita-image-store.s3.amazonaws.com/0/140539/54e6d5ac-1e21-e550-341a-24240d86646f.png)
![スライド13.png](https://qiita-image-store.s3.amazonaws.com/0/140539/bb1d2c81-2fd8-972d-b6bd-480b75d54383.png)
![スライド14.png](https://qiita-image-store.s3.amazonaws.com/0/140539/6f00c1ec-319b-731f-ebdf-833bde2843d3.png)
![スライド15.png](https://qiita-image-store.s3.amazonaws.com/0/140539/d9133fa8-582b-52b8-b678-d4cade01f030.png)
![スライド16.png](https://qiita-image-store.s3.amazonaws.com/0/140539/48d01c9e-052c-7658-3362-d3969bd5abd7.png)
![スライド17.png](https://qiita-image-store.s3.amazonaws.com/0/140539/08be975a-4fba-ef08-50e0-4992f1a4d87a.png)
![スライド18.png](https://qiita-image-store.s3.amazonaws.com/0/140539/7ad32511-d46d-b4c4-99ba-1636bed969d5.png)
![スライド19.png](https://qiita-image-store.s3.amazonaws.com/0/140539/715d09e4-405d-f177-757e-15c69a6a96b5.png)
![スライド20.png](https://qiita-image-store.s3.amazonaws.com/0/140539/04127ec1-30dd-c869-e81e-432241daa745.png)
世界のCSIRT/CERT #オセアニア編

#はじめに
世界の国・地域に存在するCSIRT/CERTの情報をまとめていこうという取り組みです！

>**過去記事**
>世界のCSIRT/CERT #アジア編
>https://qiita.com/yifey/items/1d8f7854bdef7c4d6e1e

#ソース、調査方針
以下のWikipediaのページの情報およびFIRST加盟団体を参照しつつ作成しました。
また、上記ソースにない情報は個別の国名のGoogle検索でも調査しました。

>Computer emergency response team - Wikipedia
>https://en.wikipedia.org/wiki/Computer_emergency_response_team

>FIRST Teams
>https://www.first.org/members/teams/

地域に関する情報は、以下のWikipediaのページおよび、そのリンク先から。

>国連による世界地理区分
>https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%80%A3%E3%81%AB%E3%82%88%E3%82%8B%E4%B8%96%E7%95%8C%E5%9C%B0%E7%90%86%E5%8C%BA%E5%88%86

各サイトのURLは、日本語>英語>その他言語の優先度で調査し、トップページのURLを掲載しています。
また、FIRST加盟団体には、備考欄に「FIRST」と記載しています。

#オセアニア

| 国名 | 組織名 | URL | RSS | Twitter | 備考 |
|---|---|---|---|---|---|
| オーストラリア |AusCERT|https://www.auscert.org.au/about/|  - |  - | FIRST |
| オーストラリア |ACSC|https://www.acsc.gov.au/| -  | - | FIRST |
| ニュージーランド|CERT NZ|https://www.cert.govt.nz/| - | [@CERTNZ](https://twitter.com/CERTNZ) | FIRST |
| パプアニューギニア|PNGCERT|https://www.pngcert.org.pg/|-|-|-|
|トンガ|CERT Tonga|https://www.cert.to/|  - |  - | - |
|バヌアツ|CERT VU|https://cert.gov.vu/|  - |  - | - |

オーストラリア、ニュージーランドには他にも複数のFIRST加盟組織が存在します。
CERT組織の存在が確認できなかった国・地域の記載は省略しました。

#まとめ
オセアニア地域についてまとめてみました。
オセアニアには、海外領土・自治領と呼ばれるような地域も存在するため、それらも加味するとまた違った見え方になるかと思います。
各サイトを眺めてみましたが、個人的にはバヌアツのCERT VUのロゴが好きです（笑）
なお、個人的な調査で内容が精査しきれていない部分もありますのでご了承ください。内容に関して、追加・訂正・削除等のアドバイスがございましたら、コメントでお知らせください。
Javaのシリアル通信ライブラリRXTXの課題と代替調査

# 対象

Javaでシリアル通信したい方向けです。
私自身は、近年IoTが流行ってしまい、ソフトウェア屋さんなのに！素人なのに！電子工作始めることになり、苦労しています(笑)
本文は、簡単な備忘録気分で書いていますので、不足点や不備があるかと思いますが、よかったら読んでやってください。

# 環境
調査時点では、Windows10 64bit環境で動作することを第一としています。
開発環境は以下となっています。

- Eclipse 2018-12
- maven

# RXTX
Javaでシリアル通信をしたいとき、ググると大抵RXTXライブラリがヒットします。
RXTXは、JavaのライブラリとC/C++ネイティブライブラリの2つから構成されており、以下からダウンロードできます。
Windows 32bit, Windows 64bit, Linux, mac等、プラットフォームによってネイティブライブラリを切り替える必要があります。

- [Download - rxtx.qbang.org](http://rxtx.qbang.org/wiki/index.php/Download)
- [RXTX for Java - fizzed.com](http://fizzed.com/oss/rxtx-for-java)

## RXTXの課題
RXTXを使っていて、以下の課題に直面しています。
(他にもあるかも？)

1. 10年以上メンテナンスされていない
1. 亜種バージョン(2.2)やネイティブライブラリもいろいろなサイトで少し異なるバージョンが配布されており、管理・統一されていない
1. ネイティブライブラリの影響で、折角Javaで書いたのにプラットフォーム依存となってしまう

# 代替ライブラリ
上記の課題があると、シリアル通信しようとすると尻込みしちゃいますよね。。。
「でも、RXTXで困ってる人は私だけではないはず！何とかしようとしている勇者がいるはず！」
ということで、2つほど見繕ってみました。
サンプルを実行してみると、Windows 10 64bitではすんなり動いてくれたので、ご紹介します。

## purejavacomm

- [PureJavaComm - sparetimelabs.com](http://www.sparetimelabs.com/purejavacomm/purejavacomm.php)
- [PureJavaComm - github.com](https://github.com/nyholku/purejavacomm)

説明を読むと、JNA(Java Native Access)を利用して、プラットフォーム非依存を確保しつつシリアル通信を実現したそうです。
RXTXで言うところのネイティブライブラリが、JNAに置き換わったという理解です。
RXTXを意識していると書いてある通り、APIは似通っています。

2019-01に1.0.3をリリースしているので、メンテナンスはしてくれている様子です。
(記述時のmavenリポジトリは1.0.2が最新でした)

## jSerialComm

- [jSerialComm](http://fazecast.github.io/jSerialComm/)
- [jSerialComm - github.com](https://github.com/Fazecast/jSerialComm)

こちらもRXTXの代替として作られているようで、APIは類似しています。
ネイティブライブラリはjarに内蔵されており、起動時にプラットフォーム別に利用ライブラリをロードしているようです。
Windows/Linux に加えて、ARMプロセッサにも対応しているとあり、RaspberryPiでも動くようです。
(ソースコードを眺めるとAndroidというキーワードも入っているのでAndroid上でも動作するかも？)

メンテナンスは、2018-12に最新版リリースしています。

# 評価
実際にサンプルを実行すると、purejavacommもjSerialCommも、mavenリポジトリから利用できました。
ネイティブライブラリを意識せずに動作しました。

他ライブラリとの連携という観点では、両者ともにnettyと連携するライブラリが公開されています。

- [netty-transport-purejavacomm - github.com](https://github.com/steveturner/netty-transport-purejavacomm)
- [Netty-Transport-jSerialComm - github.com](https://github.com/Ziver/Netty-Transport-jSerialComm)

メンテナンス・サポートといった面では、purejavacommが良さそうですが、[netty-transport-purejavacomm - github.com](https://github.com/steveturner/netty-transport-purejavacomm)はmavenリポジトリに無いのが惜しいところです。
netty本家サイトでは[Netty-Transport-jSerialComm - github.com](https://github.com/Ziver/Netty-Transport-jSerialComm) が紹介されていますし、mavenリポジトリを利用できるので使いやすいです。

# 今後の課題
今後、purejavacomm と jSerialCommを使ったサンプルを投稿したいと思います。

(2019-02-19)投稿しました。

- [purejavacommを利用したシリアル通信サンプル](https://qiita.com/kyosho/items/b45493f45a9b218bf37f)
- [jSerialCommを利用したシリアル通信サンプル](https://qiita.com/kyosho/items/4a08edc1eec2a34cac8e)
Django Webアプリ作成(3) アプリケーション作成

環境
OS : macOS Mojave
Anaconda : python3.6.7
Django==2.1.5

#ここまでの流れ
[前回](https://qiita.com/yuta_rug/items/95f10dc79e26dfb6d0a8)でDjangoアプリの大枠を作成したので、今回から中身のアプリを作成していこうと思います。

#作成したいWebアプリ
３回目で書くのもおかしいかもしれないが、まず作りたいアプリを決めないといけない。
作りたいものはいろいろあるが、最初ということでブログ形式のサイトを作ってみようと思う。
[Django Girls チュートリアル](https://djangogirlsjapan.gitbook.io/workshop_tutorialjp/)を参考にして作成していく。

#アプリケーションの作成
```:Terminal
python manage.py startapp blog
```
上のコードの"blog"は作成するアプリケーションの名前であり、好きな名前をつけて良い。
実行後のファイル構成は以下のようになる。

```
djangoblog
├── blog
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── config
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── settings.cpython-37.pyc
│   │   ├── urls.cpython-37.pyc
│   │   └── wsgi.cpython-37.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
├── static
└── templates
```
#アプリの登録
設定ファイル(config/setting.py)に今作成したアプリを登録する。

```python:config/setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]
```

これでアプリの大枠は完成！
次回、アプリの中身を作成します！