OmniAICreator/Qiita-1.07M huggingface dataset:
Japan IT Week 秋 2018からのピックアップ製品紹介

10月24〜26日、幕張メッセにて10ものIT関連展示会が合同で催されるIT総合イベント「2018 Japan IT week 秋」（主催：リードエグジビジョンジャパン）が開催されました。クラウドコンピューティングEXPO、情報セキュリティEXPO、ビッグデータ活用展、IoT/M2M展など10のIT関連展示会での各種展示の中から、AI・業務自動化展を中心にオンラインメディアでの展示に関してレポートしている記事をピックアップして紹介します。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/](https://www.techcrowd.jp/related/)


#[デジタルサイネージや決済システムに「Xperia Touch」や「Xperia Hello!」を活用するソニーの提案を紹介] (http://s-max.jp/archives/1758570.html)

スマートフォンとモバイルを活用するブログメディア「エスマックス」のJapan ITWeekレポート記事です。ソニーモバイルコミュニケーションズの展示の中から、Android搭載プロジェクター「Xperia Touch」やコミュニケーションロボット端末「Xperia Hello」を活用した法人向けソリューションについてレポートしてくれています。

Xperia Touchでは、手書きのメッセージを展示ブース奥にある巨大スクリーン内に表示していたようです。専用の機材を用意することなく、Xperia Touchとパソコン、そしてモニターだけで手書きのプレゼンテーションできる強みを訴求していました。

またXperia Helloを活用したビジネス用途向けの展示はいくつかされていたようです。
・「Xperia Hellox勤怠管理」は、Xperia HelloのNFC読み取り機能を使ってタイムカード端末代わりに活用、打刻時に連絡事項を表示することもできる
・「Xperia Helloレコメンド」は、内蔵のカメラで顔認識を行い、対象の人物の性別や年齢などを推定し、商品を進める
・「Xperia HelloスマートPOSシステム」は、駅のコンビニなどで見かけるキャッシュレス決済用のセルフレジ端末で、安価にセルフレジのシステムができるというもの


#[AIによる音源分離で広がる可能性 - クリスタルメソッド] (https://news.biglobe.ne.jp/it/1029/mnn_181029_0918050238.html)

biglobeニュースのJapan ITWeekのレポート記事です。AIに関する展示は、チャットボットや画像認識などによる業務効率化が図れるとあって、各社多くの来場者の興味を集めていたとのことですが、本記事でピックアップして伝えているクリスタルメソッドブースでは、自動化に貢献するAIを駆使したソリューションを提案していました。

クリスタルメソッドは、2008年に設立され銀行システムや証券トレードシステムなどの開発、日本国内でも急速に推進されつつあるキャッシュレス化等に代表されるフィンテック関連の開発、そして、独自のノウハウで深層学習を業務内にどのようにして組み込むかといった導入支援やAI開発を行う企業。ブースでは、対話型AIや、AIを利活用した音源分離、3Dデータを解析してその物体が何であるかを推定するデモンストレーションが展示されていました。

ユニークだと感じた点として取り上げているのは、AIにより音源を分離することで、例えば工場内で工作機械の異常を音で監視できるのではないかというアイディア。工場内に鳴り響いているさまざまな音に対しては、クリスタルメソッドならではの“AIによる音源分離”というアプローチにより雑音が鳴り響く環境下であっても、特定の音のみを分離・取得する。人が持ついわゆる“カクテルパーティ効果”をAIによって再現し、工作機械が故障した際に発する異音をキャッチ、すみやかに対処できるようになるというものです。


#[複雑過ぎる契約書の審査、AIの力で24時間から1分に――リコーの新技術「ディープアライメント」を見てきた] (http://www.itmedia.co.jp/enterprise/articles/1810/26/news036.html)

ITmediaエンタープライズのJapan ITweekのレポート記事です。リコーがJapan ITweekの中のAI・業務自動化展に出展していた「契約書審査AI支援オプション」を取り上げているレポートです。

「契約書審査AI支援オプション」は、企業が他社と契約を取り交わす際、他社から送られてきた契約書の内容を、AIが一般的な契約書の項目と照らし合わせ、足りない項目を可視化。また、「同じ意味」と判定した文章を1文ずつ色分けして表示してくれる。

当初は「契約書間で単語同士を突き合わせればいいのでは」と考えたとのことですが、契約書の中には実際に同じ単語が何度も登場するため、全くうまくいかなかったとのこと。試行錯誤の末、「企業」「倒産」といった複数の単語の位置や関連性から自動的に文章の大意を推測し、内容を比較する自然言語処理技術「ディープアライメント」を開発。社内に蓄積していた過去の契約書から、6700万語の日本語を学習させることにより上述の機能を実現したとのこと。

開発後、社内の法務部門では、実際に同機能を使って、契約書30件（482条文）を自動で比較した結果を社員がチェックするPoCを実施。その結果、「7～8割の精度だが、チェック業務にかかる時間を24時間から1分に短縮し、チェック漏れを防止するなど十分に業務に貢献する、という判断が現場から出たとのこと。リコーでは、「契約書審査AI支援オプション」を、既に出している企業の法務部門向け製品「法務支援クラウド　RICOH Contract Workflow Service」の新機能として、早ければ2019年4月に正式リリースする予定とのことです。


#[新しい概念のRPAをオリジナル開発　AI・業務自動化展にて発表！] (https://mainichi.jp/articles/20181019/pls/00m/020/506000c)

毎日新聞のWebサイトに掲載された、日本システム株式会社のプレスリリース記事です。Japan IT Week秋　AI・業務自動化展にて、今までにない概念の自社開発RPAエンジン「EoRPA」(エウロパ)を発表することをリリースしています。

「EoRPA」(エウロパ)は、これまでのRPAデハユーザ企業が社内に専任者をおいてその担当者が業務ごとにシナリオを作成・修正する必要があり、ここの難易度が高く導入・活用を断念するユーザが多いという課題を解決するものとのこと。

日本システム開発が委託を受けてシナリオを作成するために、ユーザ企業内に専任者をおく必要がないというのが従来のRPAとの違いとのことですが、要するにいくらで作ってくれるのか、細かいところを修正したい場合に、どのように迅速に対応してくれるかがポイントでしょうか
[Python] with構文で使用できるクラスを実装する

## with構文とは

with構文とは後処理が必要な機能を使う際に、使用者がその機能を安全に、そして簡単に使用できるための構文になります。

### with構文を使わない場合

with構文を使わないの例をみてみましょう。下のコードになります。

```python:sample_with1.py
from stove import Stove

stove = Stove()
stuff = 'うどん'
print('%sを作ります。' % stuff)

try:
    stove.switch_on()
    stove.boil(stuff)
except:
    raise
finally:
    stove.switch_off()

print('%sができました。' % stuff)
```

Stoveクラスを使ってうどん茹でています。最初にswitch_onメソッドでコンロに火を点けて、そのあとboilメソッドでうどんを茹でています。そしてfinally句でswitch_offメソッドを呼びコンロの火を消火しています。finally句でswitch_offメソッドを呼び出しているのは、例外が発生しても確実にswitch_offメソッドを呼びたいからです。
finally句は吹きこぼれをしたり、空焚きしてしまうような例外が発生しても確実に消火するための安全装置のようなものになります。

### with構文を使用する場合

それでは少し危険なStoveクラスですが、with構文を使用して安全に使用してみましょう。
下のコードになります。

```python:sample_with2.py
from stove import Stove

stuff = 'うどん'
print('%sを作ります。' % stuff)

with Stove() as stove:
    stove.boil(stuff)

print('%sができました。' % stuff)
```

with構文を使用しない場合に比べてとてもシンプルになりましたが、try,finallyを使用したコードと同じく安全です。まさに安全装置ですね。

### with構文で使用できるクラス

それでは、with構文で使用できるクラスとはどのようになっているのかを下の例でみてみます。

```python:stove.py
class Stove():

    def __init__(self):
        self.switch = False

    def switch_on(self):
        if not self.switch:
            self.switch = True
            print('コンロ点火しました')

    def switch_off(self):
        if self.switch:
            self.switch = False
            print('コンロ消火しました')

    def boil(self, stuff):
        print('%sを茹でました。' % stuff)

    def __enter__(self):
        self.switch_on()
        return self

    def __exit__(self, exception_type, exception_value, traceback):
        self.switch_off()
```

今までの例に出てきたswitch_on、switch_off、boilメソッド以外に**\_\_enter\_\_**、**\_\_exit\_\_**といったメソッドがみることができます。この二つのメソッドがwith構文で使用できるために必要なメソッドになります。

**\_\_enter\_\_**メソッドはwithブロック内で呼び出されます。そして戻り値には自身のインスタンスを返却する必要があります。Stoveクラスではコンロの点火も同時に行っています。

**\_\_exit\_\_**メソッドはwithブロックを抜けたときに呼び出されます。また、例外が発生した場合にもこのメソッドは呼ばれるため、例外処理もここに記述します。通常例外はraiseされますが、このメソッドでTrueを返却すると例外を握りつぶすことができます。
Stoveクラスではコンロの消火を行っています。
ブロックチェーンのマイニングに対する報酬に関してご質問がございます

表題の通り、ブロックチェーンにおけるマイニングに対する報酬に関して質問です。

通常、ビットコインなどの仮想通貨の取引を可能にしているブロックチェーンでは、「マイニング」と呼ばれるハッシュ値の解析作業により、データ処理の整合性を確かめていると思われます。
世界中のマイナーの中で、マイニングを最も早く成功させた人間にのみ、報酬としてビットコインなどの報酬が支払われるという仕組みになっております。

ここで、ご質問がございます。
通常の企業がブロックチェーンを用いてビジネスを実現させる際、ブロックチェーンを構築させるためのマイニングに対する報酬として何を支払っているのでしょうか？
ICO投資などのようにトークンを発行して支払っているのでしょうか？

どなたか詳しい方がいらっしゃいましたら、お力添えをよろしくお願いいたします。
fastlaneを使ってiOSアプリのApp Store Connectへの登録を自動化する

##プロジェクトのディレクトリで
```
$ bundle init
```

##Gemfileにfastlaneを追記
```terminal:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
gem "fastlane"
```

##パス指定でバンドルインストール
```
$ bundle install --path vendor/bundler
```

##fastlaneの初期化
```
$ bundle exec fastlane init
```
最初にfastlaneのどの機能を使うか聞かれると思うんで、*App Store connectへバイナリをアップロード*みたいなのを選択。

##アップロード
```
bundle exec fastlane release
```

##参考にした記事
- [fastlaneを導入してビルドを楽にする](https://qiita.com/SatoTakeshiX/items/fea8d49216a2a1086cf9)
- [fastlaneの便利な機能を徹底的に活用しよう](https://qiita.com/tattn/items/4ca30e240fd42c20d04e)
- [fastlaneを使って継続的デリバリーを実践する](https://qiita.com/gin0606/items/a8573b582752de0c15e1)
- [アプリの各種作業自動化ツール、fastlaneの導入](https://qiita.com/ysk_1031/items/1cdf92d08319903fa2e7)

##おわりに
すごいあっさりした記事ですけど、これでApp Store Connectへビルドを登録できます。
今後はビルド、バージョン番号のインクリメントとスクショの更新。
laneを遂行完了でスラックなんかに通知。
を、実現したいです。
あと、みなさんがどこまで自動化してるのか知りたい。。。
DockerをWindows10にインストールする方法

##Windows10をProにする

Windows10の他のバージョンの場合、利用できません


##BIOS の設定変更

Intel(R) Virtualization Technology を Disabled から Enabled へ変更

Hyper-V の開始

Windowsの機能 から、Hyper-V にチェックを入れ、Hyper-Vの有効化を実行する


##以下のコマンドの実行
```
bcdedit /set hypervisorlaunchtype auto
```

##Docker をインストールする

https://www.docker.com/

公式サイトからDockerをダウンロードし、インストールの実行

インストール時のオプションは特に変更する必要なし


##おまけ

仮想ディスクの保存先の変更

以下のコマンドの実行（例：DドライブのVirtual Hard Disksフォルダへ変更）

C:\>mklink /D "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks" "D:\Virtual Hard Disks"

※先にCドライブのVirtual Hard DisksフォルダをDドライブに移しておく必要あり。
.htaccessでBASIC認証

# .htaccess の記述

.htaccessに設定を書いてBASIC認証を有効にする場合、以下のように記述する。
.htaccess があるディレクトリだけでなく、サブディレクトリにも適用される。

```
AuthUserFile /etc/apache2/.htpasswd
AuthGroupFile /dev/null
AuthName "Basic Auth"
AuthType Basic
Require valid-user
```

1行目の AuthUserFile は認証で使うユーザ名とパスワードを記述したファイル（パスワードファイル）を指定する。このファイルの作り方は後述。
2行目の AuthGroupFile は認証で使うグループを記述したファイルを指定する。使わない場合は /dev/null とすればよい。/dev/null 以外が指定されているのを見たことがない。解説サイトとかでも大体 /dev/null でいいと書いてある。
3行目の AuthName は認証領域(authentication realm)を表す。ID・パスワード入力のダイアログに表示されるが、単なる表示用テキストではない。
4行目の AuthType は認証の方式を指定する。BASIC認証の場合は "BASIC"。
5行目の require この制限でアクセスを許可するユーザやグループを指定する。"valid-user" は認証されたすべてのユーザ、つまりAuthUserFileで指定されたファイルに記述されたすべてのユーザにアクセスを許可する。


# htpasswdコマンド

BASIC認証で使うパスワードファイルは htpasswd コマンドを使用する。
最初にファイルを作成するときは -c オプションを付けて実行する。

`htpasswd -c ＜パスワードファイル名＞ ＜ユーザ名＞`

ユーザを追加する場合はオプションなしで実行する。

`htpasswd ＜パスワードファイル名＞ ＜ユーザ名＞`

ユーザを削除する場合は -D オプションを付けて実行する。

`htpasswd -D ＜パスワードファイル名＞ ＜ユーザ名＞`


# IPアドレスによるアクセス制限との組み合わせ

BASIC認証とIPアドレスによるアクセス制限を組み合わせには、.htaccess に以下のように記述する。

```
AuthUserFile /etc/apache2/.htpasswd
AuthGroupFile /dev/null
AuthName "Basic Auth"
AuthType Basic
Require valid-user
 
Satisfy Any
 
Order Allow,Deny
Allow from 192.168.36.0/24
```

7行目の Satisfy のパラメータは Any または All である。

- Satisfy Any：IPアドレス制限とBASIC認証の**どちらか一方**を満たせばアクセスが許可される。
- Satisfy All：IPアドレス制限とBASIC認証の**両方**を満たす場合にアクセスが許可される。

# 参考
[ApacheによるWebサーバ構築（10）：ユーザー認証によるアクセス制限（ベーシック認証編） (2/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0110/23/news001_2.html)
[mod_auth - Apache HTTP サーバ](http://httpd.eu.apache.org/docs/2.0/ja/mod/mod_auth.html)
[Apache チュートリアル: .htaccess ファイル - Apache HTTP サーバ バージョン 2.2](http://httpd.apache.org/docs/2.2/howto/htaccess.html#how)
[htpasswd コマンドの使い方 - KUNITAKE's Wiki](http://www.kunitake.org/fswiki/static/htpasswd.html)
[ApacheでのBasic認証とIPアドレスによるアクセス制限 - 積み重ねた日々](https://aknot.hatenablog.jp/entry/20100630/1277897799)
[htaccessの上位ディレクトリでallowをしているとベーシック認証が効かない。｜パソコンいろいろ](https://ameblo.jp/donkun502/entry-10093533765.html)
[ミケネコの htaccess リファレンス](http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/access.html)
[Basic認証を使用したサイトの構築(CentOS+Apache) - ぬけラボ](http://nuke.hateblo.jp/entry/20110608/1307527020)
[アクセス制限の記述(Order, Allow, Deny) - アクセス制限 - Apache入門](https://www.adminweb.jp/apache/allow/index1.html)
[.htaccess概論｜.htaccess｜Web制作 W3G](https://w3g.jp/others/htaccess/outline)
Google Compute EngineにWinSCPを使ってSSH接続する方法

##SSH Keyの作成

WinSCP のインストール
https://ja.osdn.net/projects/winscp/

Program Files (x86) > WinSCP > PuTTY > puttygen.exe を起動

PuTTY Key Generator 起動後、Generate を押下

マウスを動かして SSH Key の作成 > Key comment に ユーザー名を入力

Save public key を押下して任意のファイル名で保存 >
Save private key を押下して任意のファイル名で保存（こちらのファイルを使用）

Key のところに表示されている英数字記号の羅列を適当なところに保存


##Google Compute Engine の設定

Google Compute Engine からメタデータを開く

SSH 認証鍵を選択

　編集 > 項目を追加 > 先程適当なところに保存した Key の内容をコピペ > 保存


##WinSCP の設定

WinSCP を起動 > 新しいサイト

> 転送プロトコル：SCP

> ホスト名：Google Compute Engine のVMインスタンスの外部IP

> ユーザ名：SSH 認証鍵を作成した時に入力したユーザー名と同一
> パスワード：不要

> 環境 - SCP/シェル > シェル：sudo su -
> SSH - 認証 > 秘密鍵：SSH Key 作成時に保存した private key を選択
すごいH本読んだからまとめ 8 「ラムダ式」

## はじめに

* [すごいHaskellたのしく学ぼう](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86%EF%BC%81-%EF%BC%AD%EF%BD%89%EF%BD%92%EF%BD%81%EF%BD%8E%EF%BC%AC%EF%BD%89%EF%BD%90%EF%BD%8F%EF%BD%96%EF%BD%81%EF%BD%83%EF%BD%81-ebook/dp/B009RO80XY)を読んだのでちょっとずつまとめていきたい。まとめていきたい。

* シリーズ
  * [すごいH本読んだからまとめ 1 「関数の呼び方、関数の定義の仕方」](https://qiita.com/yumakkt/items/ce82eb3ffae874faf249)
  * [すごいH本読んだからまとめ 2 「リスト,タプル」](https://qiita.com/yumakkt/items/36d95c738a3bc17119bd)
  * [すごいH本読んだからまとめ 3 「型」](https://qiita.com/yumakkt/items/f47e8ee810679978869f)
  * [すごいH本読んだからまとめ 4 「関数の構文」](https://qiita.com/yumakkt/items/c50dcd286cf7521e31a0)
  * [すごいH本読んだからまとめ 5 「再帰」](https://qiita.com/yumakkt/items/ecb3244446de17aaa7fa)
  * [すごいH本読んだからまとめ 6 「カリー化」](https://qiita.com/yumakkt/items/e2b4379317d9ca5f94e9)
  *[すごいH本読んだからまとめ 7「高階関数」](https://qiita.com/yumakkt/items/95554aace5da53cc7e22)


## ラムダ式

### そもそもラムダ式とは

+ 一回だけ使用する関数を作りたいときに使う
+ 別名は`無名関数`
+ `(\ <引数> -> <式>)`で定義できる
+ 定義の先頭の`\`は`λ`にみえるんじゃないかなーと思う

```haskell
-- mapで与える引数にラムダ式を使ってみる
*Main Lib> map (\x -> x * 3 + 5) [1,2,3,4,5]
[8,11,14,17,20]

*Main Lib> map (\xs -> length xs < 3) ["aiueo", "aiu", "ai", "a"]
[False,False,True,True]

*Main Lib> map (\xs -> head xs) ["aiueo", "aiu", "ai", "a"]
"aaaa"
```

* カリー化を表現するような書き方もできる

```haskell
-- 引数を一部与えると「残りの引数を与えたときに全体の値を返す関数」を返す関数を定義
*Main Lib> (\x -> \y -> \z -> x * y * z) 3 2 1
6
*Main Lib> multiple6 = (\x -> \y -> \z -> x * y * z) 3 2
*Main Lib> multiple6 7
42

-- flip関数を自分で定義するときはこの書き方が便利
flip' :: (a -> b -> c) -> b -> a -> c  
flip' f = \x y -> f y x 

```
Qiitaでお金が稼げるなら質の高い記事がもっと増えるのではないかという提言

最近Qiitaで、[全ての開発者がQiitaへのアウトプットをやめるべき理由](https://qiita.com/qiitadaisuki/items/2160a390ce91283707a1)という記事を見つけました。この記事を読んだ率直な感想は、「云わんとしていることは分かるが、解決策間違ってね？」というものでした。

僕は逆に、「Qiitaがこのように変わってくれたら、もっと良記事が増えて、Qiitaへ来る人が増えて、日本のエンジニア界隈がさらに盛り上がるのではないか」という視点で、Qiitaに投稿するという形で意見を書きたいと思います。

意見とは、タイトルにもあるように、**Qiitaでお金が稼げるなら質の高い記事がもっと増えるのではないか**というものです。

# なぜエンジニアはQiitaに記事を書くのか

エンジニアがQiitaにアウトプットをする一番大きな理由は、

**日本のエンジニアが集まるプラットフォームとして最大級だから**

だと思っています。Qiitaに質の高い記事を書けば多くのエンジニアが注目してくれて、半ば勝手にはてブやTwitter等で拡散されて多くのエンジニアの目に触れます。また、Qiitaのコントリビューション数をアウトプットの証明として使うこともできます。

ゴミ記事問題や、アカウント停止問題など様々ありますが、これらもQiitaを多くの人が使っているからこそ話題になっている話だと思っています。


# 「お金が稼げる」というモチベーション

シェアリングエコノミーが流行っていますが、その中でも「何でも売れるし、何でもお金に変わる」という部分に注目しています。

[若者を考察するための”視点”｜ハヤカワ五味｜note](https://note.mu/hayakawagomi/n/nfcf509bdd5f4)


情報だってお金に変わるのです。そして、**お金が稼げるというモチベーションってめちゃくちゃ強くないですか？**情報でお金を稼ぐという文脈で、3つのサービス・方法を取り上げて見たいと思います。

- 個人ブログによる広告収入
- note
- Medium

です。これらの良い点・悪い点を整理してみます。


## 個人ブログ

個人ブログでお金を稼ぐ方法の大部分は、**広告収入**だと思います。

- 良い点：プラットフォームとして成長したら広告収入が安定してたくさん入って来る
- 悪い点：ブログ自体の構築が大変
- 悪い点：ある程度の収入を得るまでがとても大変

個人ブログは、収入を得るまでに「記事を書いて拡散してPV数増やして」という部分が大きな障壁になります。

## note

<img width="300" alt="Screen Shot 2018-11-11 at 20.13.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/0ba6a0b4-3033-7c2e-2220-287c0658a7e4.png">

続いて、[note](https://note.mu/)です。

- 良い点：有料記事・マガジンの作成ができる
- 悪い点：人が集まっていないため、拡散チャンネルが別に必要

有料記事等を簡単に作成できる一方で、SEOがめちゃくちゃ弱いため、それを購入してもらうには別で拡散チャンネルを持っている必要があると思っています。つまり、そもそも有名な人でないと売れない印象です。

## Medium

<img width="300" alt="Screen Shot 2018-11-11 at 20.17.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/191ce03f-c7de-1905-2dd7-1a1c29aede38.png">

続いて、[Medium](https://medium.com/)です。

- 良い点：clap（いいね)に応じて収入が得られる
- 良い点：人が集まっている（主に英語圏）
- 悪い点：日本人が集まっていないため、英語で記事を書く必要性がある

人が集まり、いいねによってお金が稼げるという最高のプラットフォームですが、メインは英語圏のユーザーです。英語で記事をかける人にしかメリットはありません。


# Qiitaに質の高い記事がもっと増えるのではないかという仮説と要望

じゃあQiitaはどうかというと、

- 良い点：誰でも記事が簡単にマークダウンでかける
- 良い点：日本のエンジニアが集まっている、つねに注目されている

上で挙げた、個人ブログ・note・Mediumの悪い点を全部クリアしている印象を受けます。あとは、お金稼ぎができるという部分があったらもっと盛り上がるのでは？というのが僕の主張です。

ある、めちゃくちゃ優秀なエンジニアの知り合いがボソッと言っていました。**昔はQiitaに記事を書いていいねをたくさん稼いで有名になっていたが、今はそれをすることによるデメリットの方が多い。価値のあるコンテンツを公開するだけの時間がもったいない。でもnoteとかだったらそれがお金に変わるからいいよね。**

確かに、**コンテンツを公開してお金を稼げるのは最高だ、それならみんなもっと頑張るのではないか**と強く思いました。

次に、Qiitaでお金を稼げるようになるとしたら、どのような方法がいいのか検討したいと思います。

## noteのように有料記事がかける
Qiitaの良いところは、全ての良記事が当たり前のようにタダで読める点です。Qiitaで「この記事いいな」と思って見てみたら途中から有料だったら萎えます。基本的に大部分の人は100円であっても払いたくないのです。「Qiitaでいいなと思う記事は基本的に有料だよね」とか「無料の記事って基本的に質が低いよね」という風潮になって、Qiitaに人が集まらなくなる懸念があります。

## Mediumのようにいいねに応じてお金がもらえる
Qiita運営側としては集客で得た広告費の一部をユーザーにあげる形になると思います。そのため、ユーザーとしては今まで通りに記事をみて「いいね」をするという行動は変わりません。記事を書く人も質の高い記事を書こうというインセンティブが働きます。結果、「いいね」を獲得できるような良記事が増えるだろうと予想します。

# 結論

**Qiitaに「いいね」の数に応じて記事の作成者がお金をもらえる機能**があったら、さらに良記事が増えて素晴らしいプラットフォームになるのではないか。

# 最後に

もちろん、捨てアカウントで「いいね」を稼ぐなどと言った行動をスクリーニングしないといけないなど、アイデアだけでは実行できない部分もあるので一筋縄ではいかないとは思いますが、アイデアとしては良いかなと思っています。

どうですか？ぜひみなさんの意見をください。Qiita運営側も意見くれたら嬉しいです。
そして、この記事はデータに基づいているわけではなく個人の感覚で書いているだけなので、定量的に間違っているよなどという意見も大歓迎です。

Twitterでも色々と発信しているのでぜひ見てください。
👉https://twitter.com/hiromu_bdy
【GCP/GAE】app.yamlの書き方

##Go言語の場合
###app.yaml
```
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app
```

###ファイル構成
```
appname/
    app.yaml
    main.go
```

###デプロイ
```
gcloud app deploy
```


##Python3の場合
###app.yaml
```
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
    python_version: 3
```

###requirements.txt
```
##### インポートするモジュール #####
numpy
pandas
date
```

###ファイル構成
```
appname/
    app.yaml
    main.py
    requirements.txt
```

###デプロイ
```
gcloud app deploy
```
PythonのプログラムからTwitterで呟かせる方法

##PythonのプログラムからTwitterで呟かせる方法。


###Twitter Developerサイトからトークンを発行

https://developer.twitter.com/


###プログラムにTwitter呟き機能を組み込む
requests をインポート

```python
import json, config
from requests_oauthlib import OAuth1Session
```

###使用する変数の定義

```python
twConsumerKey = ""
twConsumerSecret = ""
twToken = ""
twTokenSecret = ""
twitter = OAuth1Session(config.twConsumerKey, config.twConsumerSecret, config.twToken, config.twTokenSecret)
twurl = "https://api.twitter.com/1.1/statuses/update.json"
```

###def文を使って関数 twitterBot を定義

```python
def twitterBot(message):
    params = {"status" : message}
    req = twitter.post(twurl, params = params)
    if req.status_code == 200:
        print("Succeed!")
    else:
        print("ERROR : %d"% req.status_code)
```
エラーで403を出力していたら、Twitter側のエラーで、同じ文章は連続投稿できません！ってエラーの可能性が高いです。


###変数 message に出力したい文章を入れる

```python
message = "Twitterで呟かせたい文言"
```

###関数 twitterBot を呼び出す

```python
twitterBot(message)
```

###または、関数 twitterBot を呼び出す時に引数を渡す

```python
twitterBot("Twitterで呟かせたい文言")
```
AWS勉強 -RDSの基本-

# RDSについて学んでいく

次のステップとしてRDSを学んでいくことにした.

## RDSとは

**フルマネージドなRDBサービス**

* エンジンをインストール
* OSのパッチ当て
* バックアップのしくみ作り

を全て最初から提供している.
マネジメントコンソールからボタンを押すだけで構築が進む!!

### 対応しているエンジン

* MySQL
* PostgreSQL
* MarinaDB
* Oracle
* MS SQL Server
* Amazon Aurora

[Amazon Aurora](https://qiita.com/kumagi/items/67f9ac0fb4e6f70c056d)
MySQLとPostgreSQLより性能がいいみたい.

## RDSの重要な機能

### Master-Slave構成を容易に構築可能

* Master(メインのDB)とSlave(副系のDB)を自動で用意してくれる
* メインのDBの内容が書き換わったら副系のDBに自動で[レプリケーション](https://www.weblio.jp/content/レプリケーション)してくれる
* エンドポイントで接続しているのでMasterに障害があった際に向先がSlaveに変わるのでシステムが止まることなく継続する

### リードレプリカ

* 参照専用のレプリカを用意しDBレイヤーの負荷を削減できる
    * 更新系→Master
    * 参照系→ReadReplica

レプリカのレプリカも作ることができるみたいw

### 自動バックアップ取得

* 定期的にスナップショットを取得することが可能(時間指定できる)
* スナップショットを元に新たなRDSインスタンスを構築することが可能

### パッチ当ての自動実施

* OSレベルのパッチ当てやMySQLのマイナーバージョン上げを自動でやってくれる
* メンテナンスウィンドウで時間設定してその間にアップデートを実施することができる

### パラメータ設定

* RDSインスタンスにはSSHできないという制約がある
    * MySQLコマンドでつなぎに行く必要がある
* パラメータグループを作ってマネージメントコンソールから設定する
    * スロークエリログをとるときのフラグはここでできる
* 即時反映もでき,次のメンテナンスウィンドウで反映することもできる

## 感想

RDSの基礎的なことがわかった.
次からは実際に触っていくので身につけられるようにわからない部分は適宜知識を補完しつつ取り組んでいく.
指数表記を文字列型の読みやすい形に変換

## 概要

たとえば、`4 / 100000`を計算した時に、`0.00004`として結果を見たいが、`4e-05`となる時がある。文字列型で`0.00004`にする方法。

```
>>> 4 / 100000
4e-05
```

## 方法

format()を使い、桁数を指定する。

```
>>> "{:.5f}".format(f)
'0.00004'
```

## 参考
https://docs.python.jp/3/library/string.html
ロジックレベルを3.3Vと5Vで双方向にコンバートする

とあるプロジェクトで、Raspberry Pi(以下ラズパイ)からマイクロサーボSG90を動かす必要がありました。その際気づいたのは、ラズパイからサーボ駆動に必要な5VのPWM信号が出力できないということ。困った(ただ、実際は3.3Vの信号でも動くケースが多いみたいです)。

## ロジックレベルコンバーター
必要なのは5VのPWM信号。やろうとしているのはいわゆる、「ロジックレベルコンバート」というテクニックで、あるいは「レベルシフト」とも言われます。ちなみに、ロジックレベルコンバーターに関しては、以下の記事が分かりやすく説明されています。
[5V Arduino+3.3V I2Cデバイス+双方向ロジックレベルコンバータを試す](https://qiita.com/hnw/items/926e5fcd2270b8ab1bad)

さて結論からすると、以下のような完成モジュールを使ってしまうのが手っ取り早いです。極めて安いですし。
[TXB0104双方向レベルシフタ](https://www.switch-science.com/catalog/1779/)

まあ学習ということで、以下はディスクリートでやるときの解説です。

材料は、
- テキサスインスツルメンツのTXB0101DBVR
- バイパスコンデンサ0.1μFを2個
- カーボン抵抗4.7kΩ
- 配線材を適当に

## TXB0101
ICですが、端子は、3.3V、5V、GND、OE、3.3V信号、5V信号の6本。5ピンのOEを少し解説すると、これは、Output Enableで、接地していると信号はHIGH/LOWいずれでもなくなる（ハイ・インピーダンス）ため、3.3V、5V両方が立ち上がるまではそうしておくのが教科書通りのようです。したがってここでは、OEは3.3Vに接続し、また同時にプルダウン抵抗を介して接地すればよいです。また、3.3V、5Vそれぞれはバイパスコンデンサで接地してノイズ対策しておきます。これは任意で。あとはピン通りにつなげるだけですが、1ピンを3.3V、2ピンを5Vとして電圧的には1ピン<2ピンとしてください。

## 回路図
![level-shifter.png](https://qiita-image-store.s3.amazonaws.com/0/242602/e9cd8610-ae5d-ba28-fa81-44dd3947617a.png)

ブレッドボード上に組むと以下のような感じになりました。表面実装のICなため、細かい半田付けで1時間かかりました。

![foo.jpg](https://qiita-image-store.s3.amazonaws.com/0/242602/870f29e2-676a-9bf1-08d8-2cd8d5afda46.jpeg)

## 参考情報
公式データシート
[TXB0101 1-Bit Bidirectional Level-Shifting and Voltage Translator](http://www.tij.co.jp/jp/lit/ds/symlink/txb0101.pdf)
gitignore.ioのCLIコマンドで.gitignoreの内容がうまく生成できないときの対処法

## gitignore.ioとは

gitignoreをいい感じに生成してくれるWebサービスです。
コマンドラインからAPIを叩いて言語ごとにgitignoreを生成できたりします。便利ですね。

## 公式サイトに書いてあるインストール方法
https://www.gitignore.io/docs

Macでzshを使っている方の場合

### 以下のコマンドをターミナルで実行
```zsh
echo "function gi() { curl -L -s https://www.gitignore.io/api/\$@ ;}" >> ~/.zshrc && source ~/.zshrc
```

上記のコマンドを実行後、`gi node >> .gitignore`などのコマンドを実行することでgitignoreを生成することができると書いてあるが動作しない

## 原因

```zsh
curl -L -s https://www.gitignore.io/api/\$@ ;
```

curlの部分だけ

```zsh
curl -L -s https://www.gitignore.io/api/node
```
こんな感じで試してみたが何も出ません。。。おそらくここでイカれてますね

取得先がhttpsから始まるURLなのでおそらくSSL関係でなにかコケてうまく取得できない状態になっているケースが多そうです。自分がそうでした。

## 対処法

### コピペしたcurlのオプションの引数に`-k`をつける

`-k… SSLのエラーを無視して処理を継続`

先程のコマンドに`-k`を足してターミナルで実行してみましょう。

```zsh
curl -L -s -k https://www.gitignore.io/api/node
```

### 結果(一部)
```zsh
…

# dotenv environment variables file
.env

# parcel-bundler cache (https://parceljs.org/)
.cache

# next.js build output
.next

# nuxt.js build output
.nuxt

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless

# FuseBox cache
.fusebox/

# End of https://www.gitignore.io/api/node
```

上手く出たので動きました！

```zsh
echo "function gi() { curl -L -s -k https://www.gitignore.io/api/\$@ ;}" >> ~/.zshrc && source ~/.zshrc
```

これで動くことが確認できました。

## まとめ

gitignoreを秒で生成したかったので導入したのですがどこかでエラーが発生して詰まってしまいました。
動かすだけなら`-k`をつけるだけでいけそうですが、セキュリティ的な観点で言うとあまりベターな方法ではなさそうです。

あくまですぐ動かしたい！という方向けの記事ということをご理解ください。
1分でわかる依存関係逆転の原則(DIP)

#はじめに
ドメイン駆動設計(DDD)のアーキテクチャについて調べていたところ「DIP」という謎の略語を見つけたので整理してみました。

#レイヤー化アーキテクチャ
昔からあるアーキテクチャの一つ。基本的な思想は以下の通り。

- レイヤごとに関心事を分離する
- 上位のレイヤは下位のレイヤにのみ依存する

レイヤごとに関心事を分離することで各レイヤの開発が容易になります。例えば、ユーザーインターフェース層を担当する開発者は何のデータベースを使うかというインフラストラクチャ層の関心事を意識せずに開発を進めることができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/212045/984bcbb5-bcc7-3889-c89c-bbeefba1f28d.png" width=40%>

##各レイヤの役割
####ユーザーインターフェース層
ユーザーへの画面表示やユーザーによるアプリケーションへの操作を担当します。
例：ブラウザへの表示、入力フォームからの登録
####アプリケーション層
システムで実現するユースケースを担当します。
例：ユーザーの入力値をもとにデータを参照・登録・更新・削除する手続きを提供
####ドメイン層
ドメインのルールに基づいてデータを加工・計算・判断します。
例：値オブジェクトによるドメインのルールの定義、アプリケーション層への手続きの提供
####インフラストラクチャ層
データの永続化や外部システムとの連携部分を担当します。

「上位のレイヤは下位のレイヤにのみ依存する」という原則にもとづくと、ある意味ではインフラストラクチャ層の変更が上位のレイヤに影響を与えてしまうことになります。例えば、OracleからPostgreSQLへ移行するとなるとアプリケーション層やドメイン層が影響を受けてしまうのです。

#DIP(Dependency Inversion Principle) - 依存関係逆転の原則
とりあえず図を見てみましょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212045/36f224b7-6ccd-ccea-0d8a-09bcaa8b4e0b.png" width=40%>
ついでに、従来のレイヤー化アーキテクチャと横並びで見てみましょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/212045/60ec24a5-c64c-71cf-4264-b9298f7a16ca.png" width=65%>

これまで最下層に存在していたインフラストラクチャ層が最上位に移動しています。これによって、永続化の変更や外部システムへの連携（データの取得・送信）の仕様が変更となっても下位のレイヤは何の影響を受けません（というよりはむしろ、影響を受けないように実装しなければなりません）。

##DIPの定義
>上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも、抽象に依存すべきである。
>抽象は、実装の詳細に依存すべきではない。実装の詳細が、抽象に依存すべきである。
[実践ドメイン駆動設計](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Object-Oriented-SELECTION-%E3%83%B4%E3%82%A1%E3%83%BC%E3%83%B3%E3%83%BB%E3%83%B4%E3%82%A1%E3%83%BC%E3%83%8E%E3%83%B3/dp/479813161X/) p.118

##「抽象に依存する」とは何か
具体的には、ドメイン層で定義したインターフェースに依存することです。インターフェースは、具体的な実装ではなく手続きの仕様を提供するため、その意味で「抽象」の役割を担うことになります。
例えば、ProductRepositoryというインターフェースに基づき、ProductMySQLRepositoryImplやProductOracleRepositoryImplを実装することで機能を実現します。抽象への依存を実現する手段としてはDI(Dependency Injection)などがあります。

#参考資料
[実践ドメイン駆動設計](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Object-Oriented-SELECTION-%E3%83%B4%E3%82%A1%E3%83%BC%E3%83%B3%E3%83%BB%E3%83%B4%E3%82%A1%E3%83%BC%E3%83%8E%E3%83%B3/dp/479813161X/)
Oculus Riftが壊れたと思った時にやった事

# はじめに
本記事は2017年4月時点での情報です。書きかけで投稿し忘れていたので、当時のメールを見返して編集、追記しました。


# 結論
結論を先に言うと、Riftとパソコンを繋ぐケーブルが断線していたらしく、Rift本体を修理に出して新しいRiftに交換して頂けました。
2017年3月3日に購入したRiftが届き、問い合わせをしたのが3月15日で、日数が経っていなかったので初期不良扱いでした。

# エラー内容
Riftでゲームなどを実行しているとPC側に以下のエラーが表示され、Riftの表示が真っ暗になってしまいました。

右下に出ていたエラー文言
「Hardware Notification 
We Can't find your headset. 
Please connect your headset. 
Oculus」
![2017-03-15.png](https://qiita-image-store.s3.amazonaws.com/0/126821/b4020e0e-96f1-d5ea-8858-c552eba4d332.png)
画像は「Robo Recall」起動中のエラー文言です。

# 修理に出す前に試した事
だいたい思いつく事と思いますが、以下のどれを試しても改善しませんでした。少しだけ映ったりしてましたが、すぐに接続解除されてしまっていました。
・Rift本体のケーブルを、パソコン側とヘッドマウントディスプレイ側の両方とも抜いてから接続しなおす
・Oculusを再起動
・パソコン再起動
・[製品版Oculus RiftのHDMI接続が認識されなくなった時の対処法。](http://yoruoha.hateblo.jp/entry/2016/06/22/205427)


# 公式サポートに問い合わせ
前述したように修理に出す前にいろいろ試しましたが、ダメっぽかったのでOculusサポートに助けてもらうことにしました。
[Oculusサポート](https://tickets.oculus.com/hc/ja/requests/new)

# サポートからの返答
以下の項目がサポートからの返答でした。

>1. お客様がRiftを接続されたPCのスペックをお伺いできますでしょうか？デスクトップとノートPCのどちらをお使いですか？
以下リンク先よりOculus互換性チェックツールを使用し、USBがサポートされている事をご確認ください。
また、結果をスクリーンショットで撮っていただきお送りいただけますでしょうか？その際に、各項目の右に記載されている白い矢印をクリックしていただき、Graphics Card, Operating System, Prossecorのメーカー名や種類を表示してからスクリーンショットを撮ってください。
https://support.oculus.com/help/oculus/1357437467617798/

>2. Oculus App (Oculus Home)は最新のバージョンでしょうか？
バージョンは、Oculus App→ネジマーク→Settings→Generalでご確認できます。

>3. ご本人様確認のため、下記の事項をお送りいただけますでしょうか？
①Riftの黒い収納ケースの底にシールで貼ってあります、Serial Number
（WMVから始まるナンバーでございます。）
②お名前と現在のご住所をお伺いできますでしょうか？
③ご注文時にご登録いただいたメールアドレス

>また、お手数ですが、以下のトラブルシューティングもお試しいただけないでしょうか？

>1. Oculus AppのRestart Oculusはお試しいただきましたか？
Oculus App→ネジマーク→Settings→Beta→Restart OculusでRestartが実行できます。

>2. Oculusアプリのアンインストールと再インストールをお願いできますでしょうか？
コンピューターにある、すべてのOculus Softwareを削除してください。Oculusに関連する、すべてのフォルダーやファイルが、AppDataフォルダー内から削除されていることをお確かめください。AppDataフォルダーは、通常隠しファイルとなっておりますので、設定を変えてご覧いただける状態にし、削除を行ってください。
   1. Windowsをセーフモードにし、Oculus Homeをアンインストールしてください。
   2. C:\Program Filesを開き、Oculusに関連する全てのフォルダーを削除してください。
    3. C:\Users\YourUserProfile\AppDataを開き、Local, LocalLow, Roamingというフォルダーが入っていますが、これらのそれぞれのフォルダーの中にある、「Oculus」「OculusClient」などの名前の付いたフォルダーをそれぞれ全て削除してください。
＊注意：AppDataフォルダーには他のアプリケーションの情報も含まれているため、これら以外のフォルダーを削除したり、AppDataフォルダーをまるごと削除されないよう、お願い致します。
    4. PCを再起動し、再度Oculusアプリをインストールしてください。

>※Oculus Softwareの削除についてですが、下記リンク先にも記載がある通り、アプリデータをバックアップしない限り、ゲームやアプリも一緒にアンインストールされます。そのため、Oculus Softwareの削除前にバックアップを取る必要があります。詳細は以下をご覧下さい。
https://support.oculus.com/help/oculus/1715420212071737/?helpref=hc_fnav

>隠しファイルの出し方（Windows ８の場合）
1. エクスプローラー→コンピューター→Cドライブ（起動ディスクがC以外の場合はそのドライブ）を開いてください。
2. 「ユーザー」フォルダ（Usersという表記になっている場合もあります）を開いてください。
3. ご自身のユーザー名のフォルダを開け、ウィンドウ上部にある「表示」を押してください。
4. 「表示／非表示」セクション内の「隠しファイル」の項目にチェックを入れてください。これにより、フォルダー内に隠しファイルであるAppDataフォルダーが表示されるようになります。
5. AppDataフォルダーを開いてください。 AppDataフォルダー内にはLocal, LocalLow, Roamingというフォルダーが入っていますが、これらのそれぞれのフォルダーの中にある、「Oculus」「OculusClient」などの名前の付いたフォルダーをそれぞれ全て削除してください。

# 返送後、新品が届きました
上記手順を試しましたが、改善しなかった旨をメールで伝えると、「Riftを返送して本社で調査後、修理、もしくは新しい製品をお送りします。」という内容の返答が来たので、書かれている通りにRiftを送りました。
平日は対応ができなかったこともあり、3月25日にRiftを送り、1週間後の4月2日には新品が自分のもとに届きました。早かったです。
メールは日本語でしたし、返答も早かったです。

今は手順などが変わっている可能性がありますが、上記手順で直る可能性があるかもしれないので、参考までに。
[Flutter][Widget]画像を円形で表示する

# 画像を円形で表示させる
こんなふうに(右側)
![SS_14.jpg](https://qiita-image-store.s3.amazonaws.com/0/288658/bb6c7f35-32eb-c6dd-eaad-404b1e9cb62d.jpeg)


## コード
- Container() から　BoxDecoration() を使って `shape: BoxShape.circle` を使う。
- あとは`image` にAssetImage()やNetworkImage()で画像を指定してあげる

``` dart:circle.dart
Container(
  width: 110.0,
  height: 110.0,
  decoration: BoxDecoration(
    shape: BoxShape.circle,
    image: DecorationImage(
      fit: BoxFit.fill,
      image: AssetImage("images/testdata1.jpg")
    )
  ),
),
```

- サンプル画像を表示する Widgetコード

``` dart:main.dart
var _data = <Widget> [
  SizedBox(
    width: MediaQuery.of(context).size.width,
    height: 120.0,
    child: RaisedButton(
      onPressed: () {},
      color: const Color(0xFFFCFF7F),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.start,
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          new Image.asset(
            "images/testdata1.jpg",
            fit:BoxFit.fill,
            width: 110.0,
            height: 110.0,
        ),
          Container(
            width: 110.0,
            height: 110.0,
            decoration: BoxDecoration(
              shape: BoxShape.circle,
              image: DecorationImage(
                fit: BoxFit.fill,
                image: AssetImage("images/testdata1.jpg")
              )
            ),
          ),
        ]
      ),
    )
  ),
];
```
PythonのプログラムからLINE通知する方法

##PythonのプログラムからLINE通知する方法。

botの監視用としても使えるし、バックテスト用としても使える。
買い時が来たら知らせてくれるようにする事でチャートに張り付いていなくても大丈夫になるかもしれない便利機能。

##LINE公式サイトからトークンを発行

https://notify-bot.line.me/doc/ja/


##プログラムにLINE通知機能を組み込む
###requests をインポート

```python
import requests
```

###def文を使って関数 lineNotify を定義
```python
def lineNotify(message):
    line_notify_token = "ここに取得したトークンを入力"
    line_notify_api = "https://notify-api.line.me/api/notify"

    payload = {'message':message}
    headers = {'Authorization': 'Bearer' + line_notify_token}
    requests.post(line_notify_api, data=payload, headers=headers}
```


###変数 message に出力したい文章を入れる
```python
message = "LINEで通知させたい文言"
```


###関数 lineNotify を呼び出す
```python
lineNotify(message)
```


###または、関数 lineNotify を呼び出す時に引数を渡す
```python
lineNotify("LINEで通知させたい文言")
```
Service Workerとクロスドメイン

強力かつ柔軟なクライアントサイドキャッシュを適用できるService Workerですが、ブラウザ内で動くJavaScriptである以上、クロスドメインによる制約がかかってきます。

## クロスドメインなソースからWorkerの登録

Service Workerは`navigator.serviceWorker.register(pathToJs)`で登録しますが、この`pathToJs`にはクロスドメインなURLは**渡せません**。

ただ、アセットだけ別サーバに置いているような場合など、クロスドメインで登録したくなることがあるかもしれません。このような場合、

0. 同じドメインあるいは[`Blob`の形で](https://benohead.com/cross-domain-cross-browser-web-workers/)、「`importScripts()`するだけのService Worker」を登録する
1. `importScripts()`はクロスドメインでも問題なし

という2段階を踏むことで、クロスドメインに置いたJavaScriptのコードをService Workerとして登録することが可能となります。

## クロスドメインなリクエストのキャッシュ

ワーカーを導入できれば、キャッシュ管理も可能です…が、やはりクロスドメインには注意点が多々あります。

### opaqueなレスポンス

CORSに対応していないサーバに対して`fetch(url)`としても失敗するだけですが、専用のモードがあって、`fetch(url, {mode: 'no-cors'})`とすれば`fetch`自体は成功します。

ただし、CORS外で情報が漏れないように、`fetch(url, {mode: 'no-cors'}).then(request => ...)`で返ってくる`request`オブジェクトは、opaque（不透明）になっていて、リクエストしたURL以外、ほとんど情報が得られません。

* `cache.add('https://crossdomain.example/some-asset')`のようにした場合、内部的には`fetch`を実行していますが、成功/失敗すら情報が得られないので、キャッシュには追加されません。
* opaqueなレスポンスを`cache.put()`した場合、キャッシュに追加はされますが、**リクエスト失敗でも問答無用で追加されてしまいます**。

ということで、CORS非対応なリソースをキャッシュさせる場合は、時折破棄するなどしないと、たまたま踏んづけたエラーが残り続けるというまずい事態も発生しかねないので要注意です。
Google Cloud Platform+WordPress+お名前.com【自分用メモ】

##Google Cloud Platform

Google Cloud Platformのアカウント登録（Googleアカウントで登録可能）

ハンバーガー → Marketplace → WordPress


ハンバーガー → VPCネットワーク → 外部IPアドレス → タイプを静的に変更


ハンバーガー → ネットワークサービス → Cloud DNS → ゾーンを作成 → レコードセットを追加

→ ドメイン名で作成し、IPアドレスはVPCネットワークの静的IPアドレスを入力


##お名前.com

お名前.comのネームサーバー設定を開く

他のネームサーバーを利用を選択

ネームサーバー情報を入力で、Cloud DNS作成時に表示されていたアドレスを4つ入力
log4j2の下書き中

####log4j2####
```xml:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<Configuration status="off">
  <!-- ログに使用するAppenderの設定 -->
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout>
        <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}], %-5p, %t, %c, %m%n</pattern>
      </PatternLayout>
    </Console>
    <RollingFile name="FILE" fileName="./log/appLog.log" filePattern="appLog-%d{yyyy-MM-dd}-%i.log">
      <TimeBasedTriggeringPolicy />
<!--      <SizeBasedTriggeringPolicy size="100MB" /> -->
      <DefaultRolloverStrategy max="3"/>
    </RollingFile>
  </Appenders>

  <!-- 出力に使用するロガーの設定 -->
  <Loggers>
    <Root level="DEBUG">
      <AppenderRef ref="STDOUT" level="INFO"/>
<!--      <AppenderRef ref="FILE" /> -->
    </Root>
  </Loggers>
</Configuration>
```
```text:ログレベル
DEBUG　＜　INFO　＜　WARN　＜　ERROR　＜　FATAL
```
```java:任意のJAVA.java
logger.info("入力されたパラメータは「{}」です。", name);
// 以下loggerのテスト
logger.debug("logger.debug");
logger.info("logger.info");
logger.warn("logger.warn");
logger.error("logger.error");
logger.fatal("logger.fatal");
```
```text:結果
INFOの場合
[2018-11-10 13:16:40.479], INFO , http-nio-8080-exec-2, sample.HelloWorldAction, 入力されたパラメータは「テスト」です。
[2018-11-10 13:16:40.481], INFO , http-nio-8080-exec-2, sample.HelloWorldAction, logger.info
[2018-11-10 13:16:40.481], WARN , http-nio-8080-exec-2, sample.HelloWorldAction, logger.warn
[2018-11-10 13:16:40.481], ERROR, http-nio-8080-exec-2, sample.HelloWorldAction, logger.error
[2018-11-10 13:16:40.481], FATAL, http-nio-8080-exec-2, sample.HelloWorldAction, logger.fatal
ERRORの場合
[2018-11-10 13:19:16.131], ERROR, http-nio-8080-exec-9, sample.HelloWorldAction, logger.error
[2018-11-10 13:19:16.147], FATAL, http-nio-8080-exec-9, sample.HelloWorldAction, logger.fatal
```
Writing Custom Ansible Module with PyCharm quickly

# 目標
The Goal

は次のイメージのように、カスタマイズしたAnsibleモジュールをPyCharmを利用して作成することです。

is to build custom ansible module with PyCharm like following:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/1c38c09e-2cd1-93c2-4779-258ff848fec7.png)

## tkim_ansibl_module ディレクトリ構成
file structure

上記のイメージで全てのことがお分かりになると思いますが、少し補足を申しますと、

위의 이미지 만으로 충분히 설명하고 있다고 생각하지만, 그래도 보충하자면,

I believe that the above pycharm image shows everything enough but to say extra explanation,

```
play.yml
[library]
  |_ tkim_host_check.py
  |_ test_tkim_host_check.py
```

pycharm projectを作る時に、Conda環境を選びました。

to make a project with pycharm, I chose Conda Environment.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/3136a467-dbed-6e22-d866-a59f100ff5fe.png)

## Script内容

Ansible Script:

```yaml

- hosts: localhost
  tasks:
    - name: tast that my module works
      tkim_host_check:
      register: result

    - debug: var=result
```

tkim_host_check.py

```python

#!/usr/bin/python
from ansible.module_utils.basic import *


def main():
    module = AnsibleModule(argument_spec={})
    response = {
        "basic process check": "ok(dummy)",
        "basic process disk": "ok(dummy)",
        "basic process memory": "ok(dummy)",
        "advanced configuration check": "ok(dummy)",
    }
    module.exit_json(changed=False, meta=response)


if __name__ == '__main__':
    main()

```

## 作ろうとした目的


このモジュールは、次のような場合に使用するために実装されました。
이 스크립트는 다음과 같은 경우에 사용하기 위해서 구현되었습니다.
This script is encouraged for use in the following cases:

1. エージェントレスホスト検査(에이전트없는 호스트 검사, Agentless Host Check)
2. 定型化されたホスト検査(정형화된 호스트 검사, formal host checking)
3. マルチレイヤの対応(멀티레이어의 대응, handling multi-layers)

すべての接続された端末に同時にコマンドを投げられる端末エミュレータの機能やtmuxのようなツールを利用しても可能ですが、定められている内容をすぐに対応するには、Code As A Infrastructure化するのも良いと思います。

모든 연결된 터미널에 동시에 명령을 내릴 수 있는 터미널에뮬레이터의 기능이나 tmux와 같은 툴을 이용해도 가능하지만, 정해져 있는 내용을 빨리 대응하기 에는 Code As A Infrastructure 화 하는 것도 좋습니다

It is possible to use a terminal emulator feature that can throw commands at the same time to all connected terminals ( or server-side tool like tmux), but in order to respond quickly to the formalized script, I believe that Code As A Infrastructure is a good idea also.
Gitメモ

# はじめに
毎回同じGitコマンドを検索してしまうので、使うコマンドをメモしていく.

## Gitの初期設定
コミット作業をした際に付加される名前とメールアドレスの設定をする.

```bash
$ git config --global user.name "[名前]"
```
```bash
$ git config --global user.email "[メールアドレス]"
```

## リポジトリの作成
ローカルに指定した名前のリポジトリフォルダを作成する.

```bash
$ git init [リポジトリ名]
```

既存のURLからプロジェクトをダウンロードする.

```bash
$ git clone [ダウンロード先URL]
```

## 変更の作成
新規または変更のあるファイルを一覧で表示をする.

```bash
$ git status
```

ステージされていないファイルの差分を表示する.

```bash
$ git diff
```

ステージングと最終ファイルバーションとの差分を表示する.

```bash
$ git diff --staged
```

指定した新規または変更のあるファイルをステージングに追加する.

```bash
$ git add [ファイル名]
```
新規または変更のあるファイルを全てステージングに追加する.

```bash
$ git add .
```
コミットするファイルにコメントを付加し,付加する.

```bash
$ git commit -m "コメント"
```

## 履歴の確認
```bash
$ git log
```

## ブランチの操作
作業リポジトリ上のローカルブランチを一覧で表示する.

```bash
$ git branch
```

指定した名前でブランチを作成する.

```bash
$ git branch [ブランチ名]
```

指定した名前のブランチを削除する.

```bash
$ git branch -d [ブランチ名]
```

指定したブランチ名に切り替える.

```bash
$ git checkout [ブランチ名]
```

作業しているブランチに指定したブランチの履歴を統合する.

```bash
$ git merge [ブランチ名]
```

変更ファイル名を新ファイル名に変更する.

```bash
$ git mv [変更ファイル名] [新ファイル名]
```

## 変更ファイルの一時保存
変更した全てのファイルを一時的に保存する.

```bash
$ git stash save #saveは省略可能
```

メッセージをつけて変更した全てのファイルを一時的に保存する.

```bash
$ git stash save "コメント"
```

一時的に保存した変更一覧を表示する.

```bash
$ git stash list
```

直近に一時保存されたファイルを復旧する.
**復旧後は保存していた変更分は消えてしまう.**

```bash
$ git stash pop
```
直近に一時保存されたファイルを復旧する.
**popとの違いは復旧後に保存していた変更分が残っている.**

```bash
$ git stash apply
```

一時保存された変更を破棄する.

```bash
$ git stash drop
```

## コミットの修正
コミットした内容を取り消す.変更したローカルの内容はそのまま.

```bash
$ git reset [コミット]
```

指定したコミットに戻り,それ以降の変更を全て破棄する.

```bash
$ git reset --hard [コミット]
```

## ファイルの削除
作業ディレクトリ上からファイルを削除した後に,テージングに追加する.

```bash
$ git rm [ファイル名]
```

リモートのバージョン管理上からファイルを削除する.変更したローカルの内容をそのまま.

```bash
$ git rm --cached [ファイル名]
```
GPSのデータをQGISで利用する

RTKLIBの変換機能（pos2kml)を使わなくても直接QGISでposファイルを開ける方法を教わったので使ってみました。
[前回:GPSのデータを使ってシェイプファイルの作成](https://qiita.com/m_take/items/bfa40e3bf2ed822f6de2)

---
「新規作成」-「プロジェクトの参照座標系」-「WGS84：投影なし（ESPG:4326）」
「XYZ　Tiles」-国土地理院タイル　全国最新写真（シームレス）https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg
をレイヤに追加（以下の　[画像の出典](https://maps.gsi.go.jp/development/ichiran.html) )

「レイヤの追加」-「デリミテッドテキストレイヤの追加」
![qgis1-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/261581/100e0d77-6ffd-d799-f9ea-b9ed784084ef.jpeg)

posファイルを選択し　カスタム区切り文字   　-[x]  　空白、- [x] 最初のレコードはフィールド名を保持している、- [x] 空フィールドを削除する
Xフィールド-「longtitude(deg)」　Yフィールド-「latitude(deg)」  --「追加」
![qgis1-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/261581/e8c301f6-2d7c-f6b9-3620-1bd397461946.jpeg)

「レイヤプロパティ」-「シンポロジー」-「Graduated」-「カラム」：height(m）-「モード」：分位数（等級）　シンボル、カラー、分類数はお好みに
![qgis1-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/261581/6eccd04d-cba6-3865-17e8-4d44a745c8e1.jpeg)


なんとなく高低差が出てる？これは田植機の軌跡なので地表面ではなく耕盤（車輪が沈んだ状態での高さ）ですがそれっぽく見えます。
![qgis1-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/261581/f3c57262-dc6a-7e6a-e094-ed5d6c67ed23.jpeg)

別の日のデータではこんな感じでした。左上の圃場は数年前に4枚の田んぼを1枚にまとめたものですがまだムラがあるのがわかります。
![qgis1-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/261581/38bf9599-ba54-89c7-4d0c-aad02dc519b4.jpeg)

参考教材　2018.11.9 FOSS4G 2018 Tokyo ハンズオン「QGIS 初級」の資料　
https://speakerdeck.com/yukosame/qgis-chu-ji-opundetadedi-tu-wozuo-rou-and-qgis-3d-ti-yan
onamae.com で　サブドメインの設定ができるかどうかの判定方法

例えば、example.com というドメイン名を所有していれば、aaa.example.com というサブドメインを　別の IP　にアサインすることができます。

それを、onamae.com で設定できるかどうかの判定方法です。
次のコマンドを実行します。

``bash
dig example.com
```

実行結果で、

```text
;; AUTHORITY SECTION:
example.com.		85077	IN	NS	02.dnsv.jp.
example.com.		85077	IN	NS	01.dnsv.jp.
```

と出れば、01.dnsv.jp, 02.dnsv.jp は onamae.com のドメインサーバー（ネームサーバー）なので、サブドメインの設定ができます。

実行結果で、

```text
;; AUTHORITY SECTION:
example.com.		85077	IN	NS	uns02.lolipop.jp.
example.com.		85077	IN	NS	uns01.lolipop.jp.
```

と出ると、onamae.com のドメインサーバーでないので、サブドメインの設定ができません。

AUTHORITY SECTION の設定を切り替える必要があります。
```
【デバッグ共有】undefined method `〜' for #<ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition:0x007fe7975659b0>

#bin/rake db:migrateすると下記エラーが吐かれる
undefined method `date_time' for #<ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition:0x007fe7975659b0>

date_timeが定義されていないとのこと。
環境はPostgrSQL

#デバッグ
えそんなわけないやんと思って、まずはマイグレーションファイルを確認。
原因がわからず、参考URLの通り、NATIVE_DATABASE_TYPESという文字でエディタ検索をかけると、postgresql_adapter.rbにてActiveRecordと実際のDBの型を確認。

```postgresql_adapter.rb

class PostgreSQLAdapter < AbstractAdapter
      ADAPTER_NAME = "PostgreSQL".freeze

      NATIVE_DATABASE_TYPES = {
        primary_key: "bigserial primary key",
        string:      { name: "character varying" },
        text:        { name: "text" },
        integer:     { name: "integer", limit: 4 },
        float:       { name: "float" },
        decimal:     { name: "decimal" },
        datetime:    { name: "timestamp" },
        time:        { name: "time" },
        date:        { name: "date" },
        daterange:   { name: "daterange" },
        numrange:    { name: "numrange" },
        tsrange:     { name: "tsrange" },
        tstzrange:   { name: "tstzrange" },
        int4range:   { name: "int4range" },
        int8range:   { name: "int8range" },
        binary:      { name: "bytea" },
        boolean:     { name: "boolean" },
        xml:         { name: "xml" },
        tsvector:    { name: "tsvector" },
        hstore:      { name: "hstore" },
        inet:        { name: "inet" },
        cidr:        { name: "cidr" },
        macaddr:     { name: "macaddr" },
        uuid:        { name: "uuid" },
        json:        { name: "json" },
        jsonb:       { name: "jsonb" },
        ltree:       { name: "ltree" },
        citext:      { name: "citext" },
        point:       { name: "point" },
        line:        { name: "line" },
        lseg:        { name: "lseg" },
        box:         { name: "box" },
        path:        { name: "path" },
        polygon:     { name: "polygon" },
        circle:      { name: "circle" },
        bit:         { name: "bit" },
        bit_varying: { name: "bit varying" },
        money:       { name: "money" },
        interval:    { name: "interval" },
        oid:         { name: "oid" },
      }

```

ここで確認すると、date_timeではなく、datetimeであることがわかる。
どうやらこのファイルでPostgreSQLの場合の初期の型設定がなされているらしい。
datetimeに変更し、無事bin/rake db:migrateができました。
エラー内容自体は初心者感丸出しですが、この確認方法知っとくといいと思って、ご共有させていただきます。


#参考
[Rails探訪 ~ create_table 編 ~](https://moneyforward.com/engineers_blog/2014/08/13/rails%E6%8E%A2%E8%A8%AA-create_table-%E7%B7%A8/)
東京公共交通オープンデータチャレンジのバスapi

#概要

東京公共交通オープンデータチャレンジの、バスapi叩いて見た。

#バスapiを調査。

| odpt       |       名前 |    内容    |
|:-----------------|:------------------|:------------------|
|odpt:Bus	|	バス情報	|	バス車両の位置、行先など、バス車両のリアルタイムな情報が記述される
|odpt:BusTimetable	|	バス時刻表	|	バスがあるバス停、バス標柱にいつ到着するか、いつ出発するかが記述される |
|odpt:BusroutePattern |	バス運行路線情報	| バス運行における運行路線情報が記述される |
|odpt:BusroutePatternFare |	バス運賃情報 |	バスの運賃が記述される |
|odpt:BusstopPole	|	バス停標柱情報 |	バス停における標柱情報が記述される geoは、ここ|
|odpt:BusstopPoleTimetable |	バス停標柱時刻表 |	バスがあるバス停標柱にいつ到着するか、出発するかが記述される|

odpt:Busは、odpt.BusstopPole:Toeiでフィルターかける。
odpt:BusTimetableは、データ取れない。
odpt:BusstopPoleTimetableは、owl:sameAsでフィルターかける。

#全バス停標柱を表示。

http://jsdo.it/ohisama1/yRMZ

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/y/R/M/yRMZ.jpg?t=1541905714)


#バス位置を表示

http://jsdo.it/ohisama1/amHb

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/a/m/H/amHb.jpg?t=1541928487)

#バス停時刻表

http://jsdo.it/ohisama1/QkJ8

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/Q/k/J/QkJ8.jpg?t=1542011610)

以上。
MVCについてざっとまとめてみた

アプリケーションを開発する上で効果的なデザインパターン

Model View Controller （MVC）についてまとめてみる。

<h1>MVCとは</h1>
MVCとはアプリケーションを3つの主要なパーツに分割し

効率よく開発するデザインパターンである。

以下の図がMVCを表す概略図である。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3133393437302f32303066373837662d313765662d636266392d336337632d3839366163663765336662612e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/296641/dc47d78c-9b91-2cf0-bde4-337da5096230.png)
https://qiita.com より引用

MVCは、Model、View、Controllerの3つから構成されて

おりその頭文字をとってMVCと名付けられている。

また、それぞれ役割がある。

<h1>Modelとは</h1>
Modelでは主にビジネスロジックを記述する。

Modelはアプリケーションそのものであり

データベースの操作も絡んでくる。

例えば、データの検索、変換、処理、検証、関連づけなどは

Modelで開発される。

よって、開発するアプリケーションによって

Modelのオブジェクトは異なることに注意しなければならない。

<h1>Viewとは</h1>
Viewでは、Modelの表示や入出力を担当する。

モデリングされたデータの表現を描写したりする。

これは、ユーザが直接触れるだろう動画や音楽などの

データを指している。

<h1>Controllerとは</h1>
Viewの入力を受け取って判断し、Modelを起動する。

また、Modelの結果をViewに渡す。

そして、Controllerではユーザからのリクエストも扱う。

<h1>MVCを扱うメリット</h1>
・アプリケーションを分割することで効率的に開発できる

→MVCは独立性があるため仕様変更に柔軟に対応できる

・古い機能の改変、新しい機能の追加を簡単に行うことができる

→独立性が保たれているため、各3つのパーツは複雑に紐づいていないため
 追加、削除を行いやすい

・開発者とデザイナーが同時に作業できる

→同時に作業できるので迅速にプロトタイピングできる

<h1>MVCを扱うデメリット</h1>

・開発方法によってMVCどれかを肥大化させる可能性がある

→肥大化することでトラブルの原因にもなりかねないので開発チームメンバーとよく相談してMVCを定義する必要がある。チーム内規約をアプリケーションごとで確認するなど日々意識してアプリ開発をする。

・定義が人によって曖昧なのでそれぞれがMVCを適用するとシステムがぐちゃぐちゃになる

→これも上述と同様にチーム内規約を作り、MVCを明瞭化させることで防ぐことができる。チーム内規約の例としては、チームとしてやってはいけないことを決めておくなど。また、定期的にコードレビューを行いチームにとって最適なMVCを保てているか確認をする。

<h1>まとめ</h1>
MVCはModel、View、Controllerで構成されていることは

どこの開発グループでも同じだろうが、開発グループによってさらには

案件によってMVCの規則はさらに細分化されて決まっている可能性がある。

もし、何かのプロジェクトでMVCを元に開発を進めているのならば

開発チームのメンバーと日々コミュニケーションをとって

効率よく開発を進めていきたい。

<h1>参考資料</h1>
[MVCを理解する](https://book.cakephp.org/2.0/ja/cakephp-overview/understanding-model-view-controller.html)
[MVCモデルについて](https://qiita.com/s_emoto/items/975cc38a3e0de462966a)
[ぼくがかんがえたさいきょうのMVC](https://www.slideshare.net/karupanerura/mvc-26371063)
SwiftのCollectionsにおけるzipメソッドについて

##はじめに
SwiftのStandard Libraryに Collectionsのメソッドとしてzip(_:_:)というものがあることを知りました。備忘もかねて記載します。

##検証環境
以下の環境を使用しています。

* macOS High Sierra Version 10.13.6
* Xcode Version 10.0.0

## Collectionsにおける zipメソッドについて
以下で定義されます。

```Swift
func zip<Sequence1, Sequence2>(_ sequence1: Sequence1, _ sequence2: Sequence2) -> Zip2Sequence<Sequence1, Sequence2> where Sequence1 : Sequence, Sequence2 : Sequence
```

ここで返却値であるZip2SequenceはSequence1、 Sequence2 から生成されるTupleのSequenceになります。例えば、下記のようになります。firstNamesの文字列配列とlastNamesの文字列配列から(String, String)のtupleの配列が生成されています。

```Swift
let firstNames = ["Immanuel", "George", "Raymond"]
let lastNames = ["Kant", "Orwell", "Carver"]
let fullNames = zip(firstNames, lastNames)

fullNames.forEach { tuple in
    print(tuple)
}

// 出力
//("Immanuel", "Kant")
//("George", "Orwell")
//("Raymond", "Carver")
```

なお、上記は一つ目のSequenceと2つ目のSequenceが同数の場合の挙動ですが、要素数が異なる場合は下記のように少ない要素数に合わせてTupleのSequenceが生成されます。

```Swift
let firstNames = ["Immanuel", "George", "Raymond"]
let lastNames = ["Kant", "Orwell", "Carver", "Троцкий"]
let fullNames = zip(firstNames, lastNames)

// lastNamesの最後の文字列が出力に含まれません
// 出力
//("Immanuel", "Kant")
//("George", "Orwell")
//("Raymond", "Carver")
```

##考えられる使用用途
他にもたくさんあるかとは思いますが、下記の画像のようなUIを作成する際に、元のデータが2つの配列に別れているとします。そのような場合にはデータの挿入時にzipを使用するというのも選択肢の一つとして考えられるのではないでしょうか。
また2次元座標系のx, y　の要素がそれぞれ配列で与えられており、そこから2次元座標の組みを作成するといった用途にも使えそうです。

<img width="326" alt="スクリーンショット 2018-11-11 18.34.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/154099/16e8af04-09f7-15f7-e79e-13d369f8a601.png">

## 参考資料
* [GitHub stdlib/public/core/Zip.swift](https://github.com/apple/swift/blob/master/stdlib/public/core/Zip.swift)
* [Apple Document generic function zip](https://developer.apple.com/documentation/swift/1541125-zip)
プログラムはどのように動いているのか~二進数の世界~

プログラミングを学び始めたとき、「このプログラムはどうやってこのような動きを実現しているのか」と疑問に感じたことはないでしょうか。私は二進数に変換されているくらいの曖昧な認識しかなく、友人にこの疑問を投げかけられたとき何も応えられませんでした。
そこでプログラムが動く仕組みについて調べてみるとなるほど面白い。
プログラミングを学ぶ上で知っていて損はないと思える内容なので記事にしようと思います。

#はじめに
まずなにより**私がプログラミング初心者である**ことを念頭に記事を読んでほしいです。記事の内容に間違い等があれば是非指摘してください。もう一つ大事なのはこの記事はコンパイラ型言語、特に**C言語について**扱っていきます。

#コンパイル
C言語の場合プログラムを実行前にコンパイルという作業があります。これはC言語が二進数で表される機械語を、人間が理解できる形にした**高級言語**だからです。なのでコンピュータが理解できる**機械語**に変換する必要があります。
ちなみに、コンピュータで直接処理できるように変換されたコードを**オブジェクトコード**、プログラミング言語で記述されたコードを**ソースコード**といいます。そして、オブジェクトコードを解析しソースコードを作成することを**逆コンパイル**といいます。

#１と０
機械語は二進数で表されています。二進数で十進数の数を表したり、文字コードにより文字を二進数で表現できることはご存知の方も多いでしょう。もし知らない方がいたら少し調べてみるといいです。
また、**論理演算**が大事なものとなります。AとBのどちらか一方でも１のとき１を返す論理和(OR)、両方が１のときに１を返す論理積(AND)、１なら０・０なら１を返す否定(NOT)などがあります。これら論理演算を組み合わせて１と０の値を変更し、目的の動作を実現させます。

#少し長い機械の話
###トランジスタ
機械ではどのように１と０を判断しているのでしょうか。それは電圧で判断しており、多くの場合＋５Vの直流電流が１を表し、０Vが０を表します。そしてこのスイッチの役割をしているのがトランジスタと呼ばれる半導体素子です。論理演算の話に戻ると、論理和は並列、論理積は直列に二つのスイッチを繋いだら良いことがわかりますね。
集積化は進み最新のマイクロプロセッサ－には１０億個を軽く超える数のトランジスターが集積されているようです。１０億個のスイッチがパソコンに内蔵されていると思うとすごいですね。
###CPU(Central Processing Unit)
機械語となったプログラムの内容を解釈して実行する装置はCPUです。主に「レジスタ」「制御装置」「演算装置」「クロック」の４つに分かれており、相互に電気的に接続されています。**レジスタ**は処理対象となる命令やデータを格納する領域で一種のメモリーのようなものです。**制御装置**はメモリー上の命令やデータをレジスタに読み出し、命令の実行結果に応じてコンピュータを制御します。**演算装置**は、メモリーからレジスタに読み出されたデータを演算します。**クロック**はCPUが動作するタイミングとなるクロック信号を発生させます。

特に大事なのがレジスタであり、演算を行うデータおよび演算後のデータを格納する「アキュムレータ」や、次に実行する命令が格納されたメモリーのアドレスを格納する「プログラム・カウンタ」などいくつかの種類があり、ひとつのCPUの内部に２０～１００個のレジスタがあります。

###メインメモリー
**メインメモリー**命令とデータを格納するところで、読み書き可能なメモリー素子で構成されています。１バイト(８ビット)ずつに**アドレス**とよぶ番号がついています。CPUと制御用チップなどを介して繋がっており、CPUがアドレスを指定してメインメモリーに格納された命令やデータを読み出し・書き込みをおこないます。

#命令と対象
これまでの説明でプログラムが実行される仕組みが何となくわかってきたでしょうか。ここまでくるとC言語で書かれたプログラムと大差ない気もしてきませんか。C言語は原則ソースコードの上から下に読んでいきます。CPUも同じでプログラムカウンタは命令を一つ実行し終えるごとにアドレスの値を一つずつ増やします。基本、命令とその対象のアドレスは離れています。
例えばAという値が100番地に入っていて、Bという値が101番地に入っているとき、1番地の命令が「レジスタXに100番地の値を読み込みなさい」、2番地の命令が「レジスタXの値と101番地の値の和を102番地に入れなさい」とすれば、A＋Bの値が102番地に格納されるという具合です。
C言語のアドレスやポインタと同じ考えですね。
ちなみに命令部分を**オペコード**、命令対象を**オペラント**ということも覚えておくとよいでしょう。

#おわりに
以上で今回の説明は終わりです。図もなくわかりにくい説明になっていると思いますが、初投稿なのでどうかお許しください......。他の方の記事なども参考にしてくれたらと思います。
また、機械語に近いアセンブリ言語を学ぶと、より理解が深まるかもしれませんので、興味のある方は是非調べてみてください(私も学ぼうと思っています)。


#####余談
・コンピュータでの処理に適した形式のコード全般をオブジェクトコードといいますが、C言語コンパイラが生成するコードは、特定の機種のみで実行可能なので特にネイティブコードといいます。これはJavaなど機種に依存せず実行できるものと区別するためらしいです。
・逆コンパイルにより得られるソースコードが自分の意図したものであるとは限りません。これはある動作をさせるプログラムの書き方が何通りもあることを考えれば理解できると思います。
・トランジスタのオンオフ切り替えのタイミングは同時であり、１秒間あたりの切り替え回数をクロック周波数という。切り替えがはやいほどコンピュータの性能は高いです。

####参考文献
・図解雑学-コンピュータのしくみ　著:山田宏尚
・プログラムはなぜ動くのか　著:矢沢久雄

(twitter → @Programshi )