OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Rails 初期構築

# Ruby on Rails 初期構築
##### バージョンは以下の通り
- Bundler version 1.16.5
- ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

---
# github にリポジトリ作成してクローン


```git
$ git clone https://github.com/xxxx\rails_project
```
--

##### bundle 初期化

$ cd rails_project/
$ bundle init

でGemfileが生成されます。

```ruby:Gemfile
$ cat Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails" # ←コメント外します。
```

---
##### bundle install
```ruby:
$ mkdir -p vendor/bundle
$ bundle install  --path ./vendor/bundle
```
/vendor/bundleに上記のGemfileのパッケージがインストールされて、Gemfile.lockが生成されます。


---
##### Rails プロジェクト生成
```ruby:
$ bundle exec rails new -B -d mysql -f .
```
---
Gemfileがrails用に上書きされます。ので再び
---
##### rails bundle install
```ruby:
$ bundle install
```

```ruby:
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.
```
---
mysql のエラーが表示されたら、

```ruby:
$ brew install mysql
$ bundle install
```

##### データベース作成＆マイグレーション

```yml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root
  host: 127.0.0.1

development:
  <<: *default
  database: RailsStudy_dev

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: RailsStudy_test
```
```ruby:
$ bundle exec rails db:create
$ bundle exec rails db:migrate
```
##### ローカルサーバー起動
```ruby:
$ bundle exec rails server
```

##### http://localhost:3000/ へアクセス
![スクリーンショット 2018-09-27 06.54.58.png](https://qiita-image-store.s3.amazonaws.com/0/33953/29aeb20c-aa9c-3710-090c-0d102da3eb6c.png)
ファイル選択時にPDFのサムネイル表示

#概要
ファル選択時にPDFのサムネイルの表示する方法をまとめました。

#背景
①新規登録画面：ファイルをブラウザにアップロードしたファイルの表示
②更新画面：新規登録時にアップロードし、保存したファイルの表示
②の場合は、ファイルのパスを指定すれば表示することは簡単にてきます。
①の場合は、サーバー上にファイルが保存されていないので、ファイルパスを指定できません。サーバー上に保存されていないファイルのサムネイルを②同様、表示したいと思いました。

#方法
ファイル選択後にサムネイルtを表示するためにHTML5のFileAPIの機能を使います。
FileAPIはローカルファイルを直接読み込むことができます。
また、サムネイルをセットするHTMLタグについてですが、画像を表示する際は、一般的にはimgタグを使用するかと思います。今回はPDFということで、objectタグを使用します。

#実装例
・ｊQuery読み込み

``` js 
<script
  src="https://code.jquery.com/jquery-3.3.1.min.js"
  integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
  crossorigin="anonymous"></script>
<script>
```

・html

``` index.html
<div>
  <input type="file" name="upload_file" class="files"/>
  <object></object>
</div>


```
・javascprit

``` js
$('.files').change(function(e) {

	// ファイル情報を取得
	var fileData = e.target.files[0];
	
	//サムネイル表示エリアのエレメント取得
	var object = $(this).parent().children('object').get(0);
	    
	// FileReaderオブジェクトを使ってファイル読み込み
	var reader = new FileReader();
	// ファイル読取り成功時処理
	reader.onload = function() {

		//ノードの複製
		var cln = object.cloneNode(true);

		//複製したノードのdata要素をにFileAPIの読み込み結果をセット
		cln.setAttribute("data",reader.result);

		object.parentNode.replaceChild(cln, object);
	}
	// ファイル読み込みを実行
	reader.readAsDataURL(fileData);
});
```

これでファイル選択することでPDFのサムネイル表示が実現できます。


既にサーバ上にあるPDFファイルを表示する場合についても紹介します。

``` index.html
<div>
  <input type="file" name="upload_file" class="files"/>
  <object data="{path_to_file}"></object>
</div>
``` 
dataにファイルのパスを指定することで表示されます。
Mac Ruby install

## rbenv install
`$ brew install rbenv`
### 確認
`$ rbenv --version`

## ruby install
`$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build`
`$ rbenv install --list`
`$ rbenv install [好きなversion]`(現在の安定の最新は2.5.1)
`$ rbenv versions`
自分のインストールしたrubyが適応されてないことを確認したところで
適応させます。
`$ rbenv global [インストールしたversion]`
`$ rbenv rehash`
`$ rbenv versions`

## rbenvの環境構築
zshの環境の場合
`$ echo '# Ruby' >> ~/.zsh_aliases`
`$ echo 'export PATH=$PATH:$HOME/.rbenv/bin' >> ~/.zsh_aliases`
`$ echo 'eval "$(rbenv init -)"' >> ~/.zsh_aliases'`
ransackの検索条件に検索対象テーブルにない項目を入れる

初心者です。検索にransackを使用していますが、ransackで使用する日付などといっしょに、geocoderで周辺検索に使用する位置情報もコントローラーに渡したいと考えました。
メンターさんにform_tagを使えばできると教えていただき、今回はセレクトボックスにしたかったので、select_tagを使うことでできました（メンターさんありがとうございました）。

**huntsテーブル（検索対象テーブル）**
レコード登録時に現在地をGoogleMapAPIで取得して以下カラムに保存
float :latitude
float :longitude

**riverpointsテーブル（マスタ）**
渓流のポイント情報についてのマスタ
string :riverpoint_name
decimal :riverpoint_latitude, :precision => 9, :scale => 6
decimal :riverpoint_longitude, :precision => 9, :scale => 6

```hunts_controller.rb
def index
  # 検索の選択肢をviewに渡す
  @riverpoint = Riverpoint.all
end
```

```hunts/index.html.erb
<%= search_form_for @search do |f| %>
　　<%= select_tag :river_point, options_from_collection_for_select(@riverpoint, :id, :riverpoint_name), :prompt => "(選択)" %>
```

```hunts_controller.rb
def index
  # index.htmlから絞り込むポイントの位置情報を受け取る
  riverpoint_id = params[:river_point]
  # ポイント絞込みに使う位置情報を作成
  if riverpoint_id.present?
    riverpoint = Riverpoint.find(riverpoint_id)
    latitude = riverpoint.riverpoint_latitude.to_f
    longitude = riverpoint.riverpoint_longitude.to_f
  end

  if latitude.present? #ポイント絞込みあり
    # geocoderのnearメソッドで絞り込み
    @hunts = @result.near([latitude, longitude], 0.2, units: :km)
  end
end
```
Vagrant + Chef構築メモ

## Cehfとは
Vagrantを利用する際を想定する。
Chefを使用することで複数のVagrantファイルを作成した時
パッケージのインストールをレシピで別で管理することで
Vagrantの環境で自分の作成したレシピを自由に選ぶことができるようになる。

## Chefの環境構築
rubyはrbenvでインストールしておく
Chefは公式からダウンロードもできるが今回はgemでインストールする。

### (ホストOSに)Chef関連のインストール
`$ gem i chef`
`$ gem i chef-solo --pre`
`$ gem i berkshelf`

### (ホストOSに)Vagrantのプラグインをインストール
`$ vagrant plugin install vagrant-omnibus`
`$ vagrant plugin install vagrant-berkshelf`

## knife-soloを使用して環境構築
`cd ~/your/vagrant/path`
Vagrantfileがあるディレクトより一つ親のディレクトリに環境を作成
`$ knife solo init .`

```bash:~/your/vagrant/path
$ ls -1
Berksfile
cookbooks/
data_bags/
environments/
nodes/
roles/
site-cookbooks/
vagrant-ubuntu/
vagrant-xxx/
vagrant-yyy/
```
ESXi + CentOS7 に Docker + minikube + Istio + Knative の導入

# 概要
GCPのGKEなどを利用するにあたり、ローカルに開発環境が欲しくなった。
ほしくなった理由は主に金銭面的なものであるが。。。

ローカル環境へ導入するにあたり、いろいろな記事を参考させていただいたが、
いずれも一つの記事では導入が難しかったので、自分メモとして記載。

# 前提条件
- VMware ESXi 6.0
    - CPU/MMU 仮想化：ソフトウェアをMMU化に使用
- CentOS Linux release 7.5.1804 (Core)
- SELinux：無効
- IPv6：無効

# ネットワークの調整

```
echo -n "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
```

# VirtualBox のインストール
ドライバー対応のため

```
yum -y install libGL* libICE* libSDL* libSM* libX11* libXcursor* libXext* libXinerama* libXmu* libXrender* libXt* libfontconfig* libpng15* libvpx* libxcb* opus kernel-devel gcc make wget perl
rpm -ivh https://download.virtualbox.org/virtualbox/5.2.18/VirtualBox-5.2-5.2.18_124319_el7-1.x86_64.rpm
```

# Docker のインストール
[公式HP参照](https://docs.docker.com/install/linux/docker-ce/centos/)

インストール後、起動 + 自動起動

```
systemctl start docker
systemctl enable docker
```

# Kubectl のインストール
[公式HP参照](https://kubernetes.io/docs/tasks/tools/install-kubectl/)

# minikube のインストール
[公式HP参照](https://github.com/kubernetes/minikube/releases)

```
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.28.2/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
```

# Kuberenetes Cluster の作成
[公式HP参照](https://github.com/knative/docs/blob/master/install/Knative-with-Minikube.md)

```
export MINIKUBE_WANTUPDATENOTIFICATION=false
export MINIKUBE_WANTREPORTERRORPROMPT=false
export MINIKUBE_HOME=$HOME
export CHANGE_MINIKUBE_NONE_USER=true
mkdir $HOME/.kube || true
touch $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config
minikube start \
--kubernetes-version=v1.10.5 \
--bootstrapper=kubeadm \
--docker-env NO_PROXY=192.168.100.0/24,127.0.0.1/32 \
--extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
--extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \
--extra-config=apiserver.admission-control="LimitRanger,NamespaceExists,NamespaceLifecycle,ResourceQuota,ServiceAccount,DefaultStorageClass,MutatingAdmissionWebhook"
```

# Istio のインストール

```
curl -L https://raw.githubusercontent.com/knative/serving/v0.1.1/third_party/istio-0.8.0/istio.yaml \
  | sed 's/LoadBalancer/NodePort/' \
  | sed 's/-statsd.mapping-config/--statsd.mapping-config/' \
  | kubectl apply --filename -
※ -statsd.mapping-config の置換は yaml ファイルの記載ミスに伴う回避策

kubectl label namespace default istio-injection=enabled

# 状況確認
kubectl get pods --namespace istio-system
```

# Knative のインストール

```
curl -L https://github.com/knative/serving/releases/download/v0.1.1/release-lite.yaml \
  | sed 's/LoadBalancer/NodePort/' \
  | kubectl apply --filename -

# 状況確認
kubectl get pods --namespace knative-serving
```

# サンプルアプリのデプロイ
[公式HP参照](https://github.com/knative/docs/blob/master/serving/samples/helloworld-php/README.md)

# Kubernetes のダッシュボード表示
```
 minikube dashboard --url=true
```
Windows操作の基本（ファイル・ソフト）

元リンク
[パソコン未経験者の中級者への道筋](https://qiita.com/strong_suzuki/items/e70ccd7253fa32428ca1)


# Windows操作の基本（ファイル・ソフト）
Windows とはOS（オペレーティングシステム）の名称。OS とは、物理的な部品であるメモリやCPUやモニターやマウス・キーボード等のハードウェアを操作するためのシステム、ソフトウェアの事。

パソコンの蓋を空けたりするといろいろな基盤や機器が組み合わさっているが、OSは基本的には HDD/SSD に格納されている。電源を入れると、マザーボードという部品に含まれるBIOS（バイオス）という、ハードウェア起動用のソフトウェアが動き、BIOSが OS を探して、それから Windowsが動く。

ソフトウェアはパソコンに電源を入れてから動くもので、物理的な格納場所はCDやUSBやHDD/SSD。WindowsもOSという種類のソフトウェア。WordやExcelは有料のソフトウェア。ChromeやAdobe Readerなどは無料のソフトウェア。

ハードウェアは物理的な機械の事。マウス・キーボード・スピーカー・モニターなどの入出力機器の他、メモリ・CPU・HDD/SSD・マザーボードなどもハードウェア。

### パソコンでみんな何をしているのか
仕事でも学校でも、パソコンを使ってデスクワークをしている人達は、種類は違えどみなだいたい同じことをしている。
パソコンを使ってソフト（ソフトウェアの略）を利用して、ファイルを作っている。
例えば建設関連の人達は、図面作成用のソフトを使って、図面ファイルを作っている。
IT業界の人達も、ソフトウェアを作ることが多いけどそれらも細かいファイルが集まった集合体の事をソフトと呼んでおり、仕事で作っているのはファイルになる。
イラスト・デザイン・出版業界の人達などは、イラストレーターソフトやフォトショップソフトを使って、印刷レイアウトファイルや画像ファイルを作るのが仕事だ。
パソコン用ソフトウェアは文字通り無数にあり、それぞれ操作方法や出来る事が多いため、ソフト操作に習熟している事が経験年数やキャリアとして評価されるのが一般的となる。

種類や規模こそ違えど、デスクワークでパソコンを使う目的は、ファイルを作ること。デスクワーク未経験の人も、あまり苦手意識を持たずこの基本的な事を把握しておくこと。

### Windowsでファイルを操作する
ファイルを作成するのに、例えば「メモ帳」というソフトがある。スタートメニューのWindowsのアクセサリという場所にあるので起動してみよう。
ちなみに、[ Windowsキー+ R ] で 「ファイル名を指定して実行」ウィンドウを開き、「notepad」と入力してエンターキーを押すことでも起動できる。
「ファイル名を指定して実行」ウィンドウは、Windowsの機能の一つ。ちなみにメモ帳ソフトもWindowsの機能の一つ。

メモ帳に何か文字を入力して、メニューバーにある「ファイル（F）」から「名前を付けて保存」を押すと、保存先の場所を選ぶウィンドウが開かれる。
左側にはツリー表示されて、右側には一覧表示されている。
とりあえず「デスクトップ」に保存しておく。

保存したら、今度は [ Windowsキー + E ] のショートカットを押す。すると、エクスプローラーソフトが起動する。エクスプローラーとは、ファイルを探したり、フォルダ移動したり、ファイルを移動したりするためのWindowsの機能の一つ。このエクスプローラーでファイルを探すのは基本操作なので慣れておくこと。

### Windowsのファイル・フォルダ構成
Windowsパソコンは、基本的にはどこにどのようなファイルやフォルダがあるか決まっている。Windowsに限らず、Mac/LinuxなどのOSも、最初からある程度のファイル・フォルダが設定されている。
Windowsの場合は、HDD/SSDを表すCドライブ（シードライブ、C:と表示される）という表示があり、これがフォルダをたどっていくと最上位のフォルダとなる。
Cドライブ直下には、Program Files / Windows / ユーザー　などのフォルダがある。これらはWindowsの構成として最初から設定されており、ずっと使うフォルダとなる。
ユーザーフォルダを選択すると、Windowsで設定しているユーザー毎にユーザー名のフォルダが用意されており、そこを選択すると デスクトップ / マイ　ドキュメント / ダウンロード　などのフォルダが置いてある。
パソコンのデスクトップとは、[ C:\Users\username\デスクトップ ] という特定フォルダのことで、最初から画面に表示されているが、ファイルは HDD/SSD 上の上記のようなフォルダに配置・保存されている。他のフォルダ・ファイルと同様、ファイルの移動や作成ができる。

### Windows のファイルとソフトの割当
デスクトップにメモ帳ファイルを保存する時、名前に「ファイル名.txt」とドット文字の後ろにtxtとつけると、Windowsにテキストファイルと判定される。このドットの後につける文字を拡張子と呼び、各ソフト用のデータ形式として定義されている。拡張子が表示されない場合は、エクスプローラーのメニューで「ファイル名拡張子」をチェックすると表示される。
例えば、デスクトップ上の「ファイル名.txt」をダブルクリックすると、自動でメモ帳ソフトまたはtxtを開くのに最適なソフトが起動して、そのソフト上でファイル内容が参照できる。これはWinodwsの仕組みで、どの拡張子のファイルをどのソフトで開くかが設定されているからそのように動いている。
「ファイル名.txt」のファイル上にカーソルを移動して右クリック⇒プロパティを選択すると、全般タブのプログラムの欄に、何のソフトでそのファイルを開くのをデフォルト設定としているかが参照・変更できる。


元リンク
[パソコン未経験者の中級者への道筋](https://qiita.com/strong_suzuki/items/e70ccd7253fa32428ca1)
ElixirのStreamでカウンタ付き無限ループ

[fukuoka.ex](https://fukuokaex.fun/)代表の[piacere](https://twitter.com/piacere_ex)です
今回もご覧いただいて、ありがとうございます:bow:

[Elixirでdefと末尾再帰を使った、スタンダードなカウンタ付き無限ループ](https://qiita.com/nishiuchikazuma/items/5ff85151db74f6d2e183)のコラムを見たら、Streamでカウンタ付き無限ループを書きたくなったので、書いてみました:yum:

そういえば、こないだの[Stream版ズンドコキヨシ](https://qiita.com/piacere_ex/items/4670f59d9f6d601fe2a8)と言い、ややStream芸人になりつつある…:sweat:
<br>
:stars::stars::stars:<b>　お知らせ：Elixirもくもく会（リモート参加OK、入門トラック有）を今月末に開催します　</b>:stars::stars::stars:

[<b>「fukuoka.ex#14：Elixir／Phoenixもくもく会～入門もあるよ」</b>](https://fukuokaex.connpass.com/event/100659/)を9/28（金）に開催します

今回から「Zoomによるリモート参加」を正式に受け付けるようになりましたので、福岡以外の都心や地方からでも参加できます（申し込みいただいたら、追ってZoom URLをconnpassメールでお送りします）

また、これまではElixir／Phoenix経験者を対象とした、もくもく会オンリーでしたが、今回から、入門者トラックも併設し、fukuoka.exアドバイザーズ／キャストに質問できるようにアップグレードしました

お申込みはコチラから
https://fukuokaex.connpass.com/event/100659/
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/3f0fbb56-e5e8-2c4d-7c62-1b0b311d6d02.png)](https://fukuokaex.connpass.com/event/100659/)

# Streamでカウンタ付き無限ループ

Streamでカウンタ付き無限ループを実装するには、Stream.iterateが便利

```elixir
start = 0
count_up = 1
sleep_msec = 1000

Stream.iterate( start, &( &1 + count_up ) ) |> 
Enum.map( fn count -> 
  IO.puts( "count => #{ count }, count_up => #{ count_up }" )
  :timer.sleep( sleep_msec )
end )
```

ね？けっこうカンタンに組めるでしょ？

iexで上記を実行しても良いし、defで関数化してもOK

実行すると、こんな感じで、カウンタ付きの無限ループとなる（Ctrl+cでストップすると、iex毎、抜けてしまうが、止め方がそれしか無い）

```
count => 0, count_up => 1
（1秒待つ）
count => 1, count_up => 1
（1秒待つ）
count => 2, count_up => 1
（1秒待つ）
count => 3, count_up => 1
（1秒待つ）
…
```

# カウンタ付き無限ループで、iexもどきを作る

IO.getsを併用すると、ユーザ入力待ちループも作れるので、iexのようなものを作ることもできる

```elixir
start = 1
count_up = 1

Stream.iterate( start, &( &1 + count_up ) ) |> 
Enum.map( fn count -> 
  input = IO.gets( "iex(#{ count })> " )
  IO.write( "none exec #{ input }" )
end )
```

実行すると、見た目はiexそっくりだけど、何もしない役立たずが動く:stuck_out_tongue_winking_eye:

```
iex(1)> IO.puts( "hello" )
none exec IO.puts( "hello" )
iex(2)> IO.inspect( %{ "key1" => "v1", "key2" => "v2" } )
none exec IO.inspect( %{ "key1" => "v1", "key2" => "v2" } )
iex(3)>
```

ここまで来ておいて折角なので、Elixirコードを解釈できるようにしてみた:laughing:

```elixir
start = 1
count_up = 1

Stream.iterate( start, &( &1 + count_up ) ) |> 
Enum.map( fn count -> 
  input = IO.gets( "iex(#{ count })> " )
  Code.eval_string( input )
end )
```

まるでiexのように、Elixirコード断片を実行できて、ちょっとだけ役立たずでは無くなる

```
iex(1)> IO.puts( "hello" )
hello
iex(2)> IO.inspect( %{ "key1" => "v1", "key2" => "v2" } )
%{"key1" => "v1", "key2" => "v2"}
iex(3)> [ 1, 2, 3 ] |> Enum.map( &( &1 + 1 ) ) |> IO.inspect
[2, 3, 4]
```

ちなみに、エラーになるようなコードを書くと、無限ループは終了し、元のiexに戻ってくる（全く同じ表示なので、戻ったか一瞬分からず、とても紛らわしい）

# p.s.「いいね」よろしくお願いします

よろしければ、ページ左上の ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/4d515047-cc48-382e-c2b1-3ad0cc50dbbf.png) や ![image.png](https://qiita-image-store.s3.amazonaws.com/0/155423/a4e3da58-70a3-4197-95a2-6a6906650d01.png) のクリックをお願いしますー:bow:
Max8 新機能覚書

# 新機能一覧
ここでは新たにMax8を立ち上げた時の"Welcome to Max"に表示されているものを主に解説していきます
- MC
- MIDI and Key mapping(Parameter Mapping)
- Node for Max
- Patching Improvements
- Vizzie 2

## MC
> Patchcords and objects now operate on up to 1024 channels of audio
パッチコードとオブジェクトは1024オーディオチャンネルで動作するようになりました。

というわけで見ていきましょうまずは1つ目。
これまでの基本的なシグナルオブジェクトの冒頭にmc.（たぶんMulti channelの略???)とつけることで一本のパッチコードで出力できるようになりました。
![mc.ezdac~ & ezdac](https://qiita-image-store.s3.amazonaws.com/0/221134/9876b6c9-ce79-4da1-f68f-9165ecf9c02e.png)
ちなみに、左が"mc.ezdac~"、右が既存の"ezdac~"です。うーん、見かけ上は微々たる差……。
さて早速パッチを作ってテストしてみましょう。先程のezdac達の上に作っていきます。
![スクリーンショット 2018-09-27 2.19.06.png](https://qiita-image-store.s3.amazonaws.com/0/221134/a50cb353-6474-31eb-7922-f1c3dabfe9e7.png)
比較用で2つ作りました。右がMCなし、左がMCありです。ステレオのときはあまり感じませんが、パッチコードを引く手間がだいぶ省けました。4chとか多くのチャンネルを扱うときに真価を発揮しそうですね。
当然、関連するオブジェクトもいくつか追加されています。

### mc.pack~ , mc.unpack~
普通のシグナルをMCにまとめる時、もしくはその逆を行うときに使用します。アーギュメントはそれぞれ入出力数です。

### mc.mixdown~
文字通りMCをミックスダウンします。上記のpack,unpackと合わせて使うとこんな感じ
![スクリーンショット 2018-09-27 2.36.48.png](https://qiita-image-store.s3.amazonaws.com/0/221134/6724ea29-df9b-fcb3-8b36-130c31a0f19e.png)
1ch+3ch,2ch+4chになってますね。ちなみに右側のインレットにこれまたMCを送ってやるとパンニングの設定ができたりします。細かいところはHelpを見てみてください。

### mc.live.gain~
live.gainもMCに対応しました。入出力が一本になる以外は特に変わりありません。 ~~また、MCパッチコードのチャンネル数に応じて自動でメーターが設定されるようになりました。便利。~~(9/30追記)場合によって自動設定されるようです。今の所条件は不明です……申し訳ありません。

## MIDI and key mapping
>Bind key presses and MIDI messages to objects
キーボードやMIDIメッセージをオブジェクトに割り当てられるようになりました

使い方はいたって簡単、下側のメニューバーにあるキーボードらしきイラスト (マウスオーバーで"Assign Key Map"と出ます) を一回押します。そうするとキーマッピングが可能なオブジェクトがオレンジで囲まれて表示されるので、クリックしてEnable for mappingを押すだけ。次に押下されたキーがバインドされます。
![スクリーンショット 2018-09-27 2.52.32.png](https://qiita-image-store.s3.amazonaws.com/0/221134/17f6e1ae-be0f-247b-de88-14832b41c6df.png)
(↑Assin Key Mapを押した直後)

これでわざわざ key -> selの流れを作らなくてもキーボードでスイッチ操作が可能になりましたが、どのキーをバインドしたのか忘れてしまいそうですね。

## Node for Max
>Node.js® is a JavaScript runtime build on Chrome's V8 JavaScript engine.
"Node.js"はクロームV8 JacaScriptエンジンのJSランタイムビルドです

前々からJavaScriptによる処理は可能でしたがNode.jsが追加されるようです。解説によればファイルをブラウズしたり、作成/消去したりできる、とのことです。

## Patching Improvements
>Hold shift while dragging to insert an object into a patch cord.
shiftを押しながらドラッグすれば、パッチコードの間にオブジェクトを追加できます。

単純ながら、待ち望んだ機能でもありました。 ~~これでミスった時の修正が楽になりますね！！~~
MCもそうですが、今回のアップデートはパッチング面を改善する機能が多いように思われます。

## Vizzie 2
>The jit.gl.node object works with jit.gl.multiple to build compound shapes.
jit.gl.nodeオブジェクトはjit.gl.multipleと一緒に複合シェイプを構築します。

>Now integrated with openGL
OpenGLと統合。

Jiiter、Vizzie周りにアップデートが入りました。解説文を見る限り、OpenGLや3Dオブジェクト周りのようです。

# まとめ
MC、キーマッピングなどは操作性の改善と言えそうです。またOpenGLやJitter周りでもそうそう派手なアップデートではなく、今回は地味な更新にとどまったのではないかという印象を受けます（もっともJiiter、JS周りに関しては素人なので全然わからないですけれども）
Max7でも、十分な方には十分なのではないかなと思っています。とりあえず、要検証です。
FlatListとrender prop APIを使う

　初投稿です。Vue Native で FlatList を使いたいのだけど、普通に書くと JSX が出てきて破滅しがちなので何とかしたい、何とかするのが `render prop` API です。

普通に書いたコードです。

```vue
<template>
  <flat-list
    :ListHeaderComponent="ListHeaderComponent"
    :data="items"
    :key-extractor="(item, index) => item"
    :render-item="renderItem"
  />
</template>

<script>
import React from 'react'
import { Text, View, StyleSheet } from 'react-native'

export default {
  data () {
    return {
      items: ['Debbie', 'Lou', 'Daphne', 'Amita', 'Tammy', 'Constance', 'Leslie', 'Rose'],

      ListHeaderComponent: (
        <View style={styles.listItem}>
          <Text>💎✨</Text>
        </View>
      ),
    }
  },
  methods: {
    renderItem ({ item, index }) {
      return (
        <View style={styles.listItem}>
          <Text>{item}</Text>
        </View>
      )
    },
  },
}

const styles = StyleSheet.create({
  listItem: {
    padding: 20,
  },
})
</script>
```

`render prop` API を使って書いたコードです。

```vue
<template>
  <flat-list
    :data="items"
    :key-extractor="(item, index) => item"
  >
    <!-- コンポーネントを指定するときは `render-prop` -->
    <view :style="styles.listItem" render-prop="ListHeaderComponent">
      <text>💎✨</text>
    </view>

    <!-- コールバックを指定するときは `render-prop-fn` -->
    <view :style="styles.listItem" render-prop-fn="renderItem">
      <!-- `args` に引数が入る -->
      <text>{{ args.item }}</text>
    </view>
  </flat-list>
</template>

<script>
export default {
  data () {
    return {
      items: ['Debbie', 'Lou', 'Daphne', 'Amita', 'Tammy', 'Constance', 'Leslie', 'Rose'],

      styles: {
        listItem: {
          padding: 20,
        },
      },
    }
  },
}
</script>
```

JSX が消えたことで治安が良くなってきました。スタイルの指定に CSS を使っていないのは、`render prop` に `class` を合わせるとなぜか死ぬからです。

楽しい！₍₍ (ง╹◡╹)ว ⁾⁾

- [FlatList - React Native](https://facebook.github.io/react-native/docs/flatlist)
- [Basic Components - Vue Native](https://vue-native.io/docs/basic-components.html#FlatList)
- [Component As Prop - Vue Native](https://vue-native.io/docs/render-prop.html)
node.jsとgit-http-backendを使ってGitリポジトリをHTTPで公開する

1分レシピ。

# やりたいこと

Windows上でgitリポジトリを公開したい。SSHサーバを立てるのが面倒ならHTTPだね！

# 必要なもの

- Node.js
- yarn とか npm
- Git for Windows

# リポジトリの準備

適当なディレクトリにbare repositoryを用意し、

```sh:pushするための設定
git config http.receivepack true
```

とすることでpush可能になる。push不要で良いなら設定は不要。この設定をしない場合HTTP経由では書き込み禁止と見做され、

```:エラーメッセージ
Service not enabled: 'receive-pack'
```

と `git-http-backend` がstderrに吐いて失敗してしまう。

# スクリプト

`cgi` モジュールに依存しているので、 `yarn` か何かで入れておくこと。

```sh:前準備
yarn init # 質問に適当に応える
yarn add cgi
```

スクリプト(`index.js`)は数行:

```js:index.js
const cgi = require("cgi");
const http = require("http");

process.env.GIT_PROJECT_ROOT = "c:/testrepo";
process.env.GIT_HTTP_EXPORT_ALL = "";

http.createServer(cgi("c:/Program Files/Git/mingw64/libexec/git-core/git-http-backend.exe",
 {stderr: process.stderr})).listen(8888, "127.0.0.1");
```

`git-http-backend` の場所は他のディストリビューションでは当然別になる。このスクリプトでは `127.0.0.1` をlistenしているので当然他所のホストからは接続できない。

# clone してみる

まずサーバを起動しておく。

```:サーバの起動
node index.js
```

先のスクリプトではリポジトリは `c:/testrepo/` 以下に配置することになる。

```:前準備
cd testrepo
mkdir hoge.git
cd hoge.git
git init --bare
git config http.receivepack true
<なんかコミットする>
```

あとは普通にcloneする。認証の類は入れてないので、特にパスワードとか入れることなくそのままcloneできてしまう。

```:実際のclone
git clone http://localhost:8888/hoge.git
```

# 感想

- じつにかんたんだった
- Qiitaに記事を書く方が時間が掛かる

認証の実装が本番だ。。
動画本「Augmented Reality」

#プロジェクトの概要
このアプリケーションの主な目的は、カメラ付き携帯電話によって、本のストーリーを動画で再生することです。例えば画像をキャプチャした後、携帯カメラを桃太郎のストーリーブックの画像に指し示すと、アプリケーションは画像を検出し、画像を動画に変換します。

#課題
インドネシア人は本を読む興味持っている人が少なくなる。
結構61国から60番になった、下の写真をご覧ください。
![Picture2.png](https://qiita-image-store.s3.amazonaws.com/0/286745/92ad2351-fe21-40a8-8f79-033ad2bfdc2b.png)
```src : http://www.thejakartapost.com/life/2016/08/29/indonesia-ranks-second-last-in-reading-interest-study.html```

インドネシア人は９１，５％テレビを見ることが好きで、のこるパーセンテージは雑誌とか本とか読むすることが好きです。つまりインドネシア人は動画を見ることがすきと思うています。
![Picture1.png](https://qiita-image-store.s3.amazonaws.com/0/286745/7a0612b1-55ea-2fbd-156f-dacb3a8f424c.png)
```src : https://www.aiya.org.au/2017/09/are-indonesians-really-not-interested-in-reading/
```

#目的・ゴール
AR 動画本の主な目的は、画像をキャプチャしてビデオに変換することで、ストーリーブックの全文を提供することです。 ユーザーはストーリーについての画像と短い説明を表示するだけでなく、AR 動画本のアプリはユーザーが本の完全なビデオストーリーを見ることができます。
このアプリは、物語を読むのが好きな人や本を読む時、AR を使って新しい経験をしたいという人のためのアプリケーションです。


#ワイヤーフレーム
![w1.png](https://qiita-image-store.s3.amazonaws.com/0/286745/be28b0d7-e3ed-7f07-2d00-56be5769b146.png)

#プロトタイプ
![w2.png](https://qiita-image-store.s3.amazonaws.com/0/286745/8fc6709b-5dca-e663-dcfb-9f1f62311c1d.png)

-----
![Capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/286745/a198e06d-39d2-9ae7-a40e-fd1370a7330f.png)
-----
![Capture1.PNG](https://qiita-image-store.s3.amazonaws.com/0/286745/10bb27f5-1519-339c-e05d-833dd6970b28.png)
```Video : https://youtu.be/7BJcbPiD4k0```

#フローチャート
![w3.png](https://qiita-image-store.s3.amazonaws.com/0/286745/7f5aade6-b202-3264-0e0f-90ec6cbd03c7.png)

#機能要件
アプリケーションの主な目的は、画像をキャプチャし、関連情報を画面に表示することです.
**Start Camera** : カメラからアプリにアクセスする。 作業中のカメラは、ユーザの利便性に応じてバックカメラとフロントカメラにすることができます。
**Detect Object** : カメラはオブジェクトに向かってポイントし、それを検出し、ユーザーは画像を撮る必要はなく、画像は自動的に撮影されます。
**Gather Information** : オブジェクトを検出した後、すべての関連情報をロードする必要があります。
**Create AR object** : 検出されたオブジェクトに基づいて、ARオブジェクトが作成され、画面に表示されます。
 
 
#一般的な要件
**ハードウェア**
- カメラ付きスマートフォン
**ソフトウェア**
- Unity 3D 5.5.1 & Vuforia
- 最小のAndroid OSプラットフォーム API Level Android 5.0 Lollipop


#将来構想
将来的に追加できる機能:
1. サーバーからのデータ・アセットの接続
2. もっとストーリーブックをキャプチャすることができます
3. ストーリーブックを選択する
4. 再生機能..

#もらったフィードバック
1．AR技術はGoogle Glassと統合して、町のディスプレイアイコンがmovieになって見える。
2．観光スポット説明書いてところ読めないけどう、AR技術を使って観光の情報を動画に変換して見られる。
3。言葉を勉強したい人が例えば文字を読んでよく理解できないならAR技術を使って文字からキャプチャして動画を変換してもっと理解し安いと思うています。
4.子供たちが海外から全然日本語分からない、AR技術を使って日本語書いた文字を自分国の言葉で変換することができたら良いと思うていました。
5.高齢者は物を買う時その物の使え方とかどうやって設定するとか分からないで、文字を読みたいけどうでもマニュアルブックが小さい文字を書いたらあまり見えないで、画像をみってもあまり分からないですが、画像や文字をキャプチャしてビデオに変換することが手伝うそうと思いました。

ありがとうございます！
LINUX testコマンドについて

# 概要

一言で言うと条件を判定するコマンドです。
記法としては以下のように書くことができます。

```
test 条件
```

条件の部分には判定したい条件を書き

真の場合: 0
偽の場合: 1

を返します。
(※ 一般的なプログラミング言語の判定と逆になっていますが、これはUNIXプログラムが正常終了なら０、異常終了なら1を返す慣例を持っているため)

例として特定のファイル名のファイルが存在するかどうかは以下のようになります。

```shell
test -e exist.text; echo $status #=> 0
test -e not_exist.text; echo $status #=> 1
```

# []を用いた書式
上記の書き方とは別にtest文は以下のように書くことが出来ます。

```
[条件]
```

この記法を用いると先程の例は以下のようになります

```shell
[ -e exist.text ]; echo $status #=> 0
[ -e not_exist.text ]; echo $status #=> 1
```
このとき注意点として[]の中は必ず1スペース空ける必要があります。


# ifとともに利用する
これまでの例ではecho $statusとして結果を出力していましたが、実際にはifと一緒に使われる事が多いです。
試しにこれでFizzBuzzを書いてみるとこのようになります。

```shell
for i in `seq 1 15`
do
if [ $(($i%3)) -eq 0 ] && [ $(($i%5)) -eq 0 ]; then
  echo 'FizzBuzz'
elif [ $(($i%3)) -eq 0 ]; then
  echo 'Fizz'
elif [ $(($i%5)) -eq 0 ]; then
  echo 'Buzz'
else
  echo $i
fi
done
```

# 様々な条件判定
testコマンドで使えるオプションは以下です。

## ファイル処理

| 条件 | 判定 |
|:-----------|------------:|
| -d file       | fileがディレクトリであれば真　| 
| -e file     | fileが存在すれば真      |
| -f file      | fileが通常ファイル(ディレクトリなどでない)なら真        | 
| -L file         | fileがシンボリックリンクであれば真          |
| -r file       | fileが読み取り可能であれば真       |
| -s file    | fileのサイズが0でなければ真     |
| -w file | fileが書き込み可能であれば真|
| -x file | fileが実行可能であれば真|

## 文字列処理

| 条件 | 判定 |
|:-----------|------------:|
| -z str       | strの長さが0なら真        | 
| -n str     | strの長さが0より大きければ真      |
| str1 == str2 | 文字列が等しければ真        | 
| str1 != str2 | 文字列が等しくなければ真          |

## 数値処理

| 条件 | 判定 |
|:-----------|------------:|
| int1 -eq int2 | int1とint２が等しければ真|
| int1 -ne int2 | int1とint２が等しくなければ真|
| int1 -lt int2 | int1がint２より小さければb真|
| int1 -le int2 | int1がint２が等しいか小さければ真|
| int1 -gt int2 | int1がint２より大きければ真|
| int1 -ge int2 | int1がint２より等しいか大きければ真|

## 論理条件

| 条件 | 判定 |
|:-----------|------------:|
|! 条件|条件が偽であれば真|
|条件1 -a 条件2| 条件1と条件2がともに真であれば真|
|条件1 -o 条件2| 条件1か条件2のどちらかが真であれば真|

# && と ||を用いた条件判定

```shell
command1 && command2 # command1が正しく実行されたとき、command2を実行
command1 || command2 # command1でエラーが起きたとき、command2を実行
```

の記法を用いてif文をより簡潔に書ける場合があります

例えば

```shell
if cat $1; then
  echo OK
fi
```

↓

```sh
cat $1 && echo OK
```


```sh
if ! [ $((1%3)) -eq 0 ]; then
  echo NG
fi
```

↓

```sh
[ $((1%3)) -eq 0 ] || echo NG
```

のように書くことが出来ます。

今まで何気なく
if [hogehoge]
と書いてきましたが知らないうちにtestコマンドを使っていたんですね。
複雑なshellを書くときに無くてはならない便利なコマンドです。

[参考 新Linux/UNIX入門](https://www.amazon.co.jp/%E6%96%B0Linux-UNIX%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E6%9E%97%E6%99%B4%E6%AF%94%E5%8F%A4%E5%AE%9F%E7%94%A8%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797369841/ref=sr_1_1?ie=UTF8&qid=1537983015&sr=8-1&keywords=LINUX%2FUNIX)
Juliaの数学定数【小ネタ】

Julia-1.0.0での数学定数。

[tab]キーを打って入力するのは、REPLかjupyter-notebookで。

円周率
`\pi+[tab]`でπ

自然対数の底
`\euler+[tab]`でℯ

オイラー・マスケローニ数
`MathConstants.eulergamma`
または`MathContants.\gamma+[tab]`
`\gamma+[tab]`では出ません。変数としてのγになってしまう。

黄金比
`MathConstants.golden`
または`MathConstants.\varphi+[tab]`

カタラン数
`MathConstants.catalan`

以上、、、のようでした。
.mov を gif に変換【Mac】

# 概要
`ffmpeg`を使います

```zsh:なければhomebrewでインストール
brew install ffmpeg
```
>
[Homebrew - macOS用パッケージマネージャー](https://brew.sh/index_ja)
[FFmpeg - 動画の変換](https://ffmpeg.org)

# .mov → .gif
```zsh:コマンドライン実行例
# ffmpeg -i Input.mov -r FrameRate OutputFilename.gif

ffmpeg -i 画面収録_299U-08-09_1.93.N.mov -r 24 gamen_test1.gif
```
```zsh:確認
open -a /Applications/Google\ Chrome.app gamen_test1.gif                
```

# 変換がうまくいかないときのコマンドオプション例

以下の情報を参考にコマンド実施したら変換できた。

>HDR動画1080p、通常フレームレート場合
[YouTubeオススメのffmpegのエンコードオプション設定例](https://qiita.com/hotstaff/items/c64e27bb0c0317084515)

```zsh:1080p変換サンプル
ffmpeg -i input1.mp4 -movflags +faststart -c:v libx264 -profile:v high -level:v 4.0 -b_strategy 2 -bf 2 -flags cgop -coder ac -pix_fmt yuv420p -crf 23 -maxrate 10M -bufsize 20M -c:a aac -ac 2 -ar 48000 -b:a 384k output2.mp4
```

# 参考
https://qiita.com/janus_wel/items/5841502df901d8e51280

https://qiita.com/hotstaff/items/c64e27bb0c0317084515
オブジェクト指向が5％くらい理解できればいいなという記事

## 前置き
オブジェクト指向、難しいですよね。
どれだけ書いても理解できる気がしません。なのでこの記事はあくまでも私の理解です。
読んで理解の足しになればうれしいですが、混迷の度合いを深める結果になったら申し訳ありません。

## オブジェクト指向とはなにか、ざっくり
良く言われるのは、**オブジェクト指向とは、現実世界をそのままプログラミングするものである**と言う理論ですが、これは間違っています。
ものすごく単純化して言えば、**オブジェクト指向とはフレームワーク**です。
つまり、本来複雑な作業であるプログラミングを、**一定の約束事に従うことで抽象化し、より簡単に行うための存在**がオブジェクト指向ですね。
歴史的には、1972年にアラン・ケイがSmalltalkと言う言語を作るときに提唱して以来40年以上使われている事になるこのフレームワーク、当然当初から比べてもかなり拡張されていて、もはや機能を一目で俯瞰すると言うことは不可能に近いです。このあたりも難しいと言われるゆえんではないでしょうか。

## オブジェクト指向という「フレームワーク」が実現したいこと
提唱者であるアラン・ケイの言葉によれば、「本質はメッセージングであり、オブジェクト指向という名付けは失敗」なのだそうです。
つまり、オブジェクト指向の実現したいことにとってオブジェクトは本質ではないと言うことになります。
現時点で私は

* 内部状態の隠蔽
* 内部実装の隠蔽
* インターフェースの厳密な定義

を機能としてもつ拡張された型を対象とするメッセージ送受信によるプログラミング
こそが、オブジェクト指向が実現したいことと捕らえています。
つまり、いわゆるオブジェクト指向三大要素、「カプセル化、継承、ポリモーフィズム」のうち、機能として存在すべきものはカプセル化だけで、ポリモーフィズム（のうち、アドホック多相）は自明なものとして導き出され、継承に至っては存在しなくても良いものとなるわけです。

## アドホック多相はなぜオブジェクト指向で自明なのか
まずアドホック多相とは、同じ名前の関数を異なる引数に適用可能であり、引数によって振る舞いが変わると言う動作を指しますが、`foo.bar(baz)`と記述された場合、bar(baz)というメッセージを処理する主体は必ずfooであり、動作としては（おそらく）引数一つを取るbarメソッドが呼び出されます。そして例えば、hogeクラスが引数1つを受け取るbarメソッドをもっていたとしても、fooクラスのbarメソッドが何らの影響を受けることはなく、完全に独立した動作をします。これはオブジェクト指向に沿って実装されているのであれば確実にこのように動作となります。
ちなみにですが、**実装されていないメソッドに対応するメッセージが送りつけられた場合の動作は不定**です。
Rubyであればmethod_missingが呼び出されるでしょうし、Javaであればビルドが通らないでしょう。

## オブジェクト指向はなぜ現実世界の実装ではないか
これは単純です。
**現実世界のオブジェクトはプログラムには不必要なほど複雑だから**です。
例えば「可愛いわんちゃん」をプログラムしたいとき、現実世界の「犬」がもっている能力のうち、「気に入らないことがあるとうなる、噛みつく」などというものは必要ないはずですが、もし現実をそのままプログラムするとしたらこれも実装の必要がでてきます。
しかし、それに時間を割くよりは「投げたフリスビーを一生懸命取ってくる」姿や、「自分のしっぽを追いかけてぐるぐる回る」ちょっとマヌケな所をプログラムにしたいでしょう。作りたいのは可愛いわんちゃんですから。
プログラムの世界は現実よりもかなりプログラマに都合よく出来ています。具体的なものから必要な機能だけを取り出して、さらにその「もの」の外側からは内部の複雑な部分を隠し、きれいに見せるという方法がとれます。

例えば、対戦アクションゲームを作りたいとします。
1体1で、キャラクタが2人います。
勝敗を決定するためにはどちらかが死んだことが判定できないといけません。
現実世界の人に「あなた生きてますか？」と聞いた場合、どういう返事が返ってくるかはわかりません。
「見ればわかるだろ」と言われたり、生きている人に「死んでるよ」と返されるかもしれません。
逆に、返事がないからと言って死んでいるとは限らないわけです。寝ているかもしれませんし、息はあるけど死にそうでしゃべれない状況かも知れません。
が、プログラムの中の人はいついかなるときも「あなた生きてますか？」と聞かれれば正しく「はい」か「いいえ」を返してくれます。
また、現実で1対1では審判がいないので、負けを認めない人が出てくるかもしれません。
プログラムの世界では、誤審しない見えない審判を置いておいてもいいわけです。

現実は複雑であり、プログラムにすることは非常に困難です。
オブジェクト指向とはあくまでも、**複雑なプログラミングを簡単にするためのフレームワーク**です。
現実のことはいったん忘れて、プログラミングの世界を楽しみましょう。

## オブジェクト指向の理解のために
GoFと言われている凄腕のプログラマたちが、オブジェクト指向あるある集に名前をつけて、「デザインパターン」として発表しています。
詳細についてはここでは触れませんが、これに触れることはオブジェクト指向理解の一助となるかと思います。
特に、なぜ継承が不要なのか、についてはデザインパターンにふれる方が説明をされるよりもわかりやすいかと思います。

以上となります。
緩く始める ESLint による静的解析と prettier によるコードフォーマット in React


目的はとりあえず最低限の静的解析とそれに準じたフォーマットを施す環境を作ること。
対象ユースケースは React を用いたフロントエンド開発。
こだわる場合は時間の無駄になるので読まない方が良いです。

各々の概要は公式ドキュメントを参照されたし

- [ESLint](https://eslint.org/) 
- [Prettier](https://prettier.io/)

```
$ cd ${your_project}
$ touch .eslintrc.json
$ npm install eslint eslint-plugin-react prettier-eslint-cli　--dev
```

.eslintrc.json を次のように編集

```.eslintrc.json
{
  "env": {
    "browser": true,
    "commonjs": true,
    "es6": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "ecmaFeatures": {
      "experimentalObjectRestSpread": true,
      "jsx": true
    },
    "sourceType": "module"
  },
  "plugins": ["react"],
  "rules": {
    "indent": ["error", 2],
    "linebreak-style": ["error", "unix"],
    "quotes": ["error", "single"],
    "semi": ["error", "always"],
    "react/jsx-uses-react": "error",
    "react/jsx-uses-vars": "error"
  }
}
```

例えば `/src` に js ファイルを格納している場合

```
$ ./node_modules/.bin/prettier-eslint --write ./src/**/*.js
```

# おまけ VSCode 設定

まずは VSCode 拡張である二つをインストールする

- [vscode-eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
- [pretter-vscode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)

あとは以下を設定するだけで作業中のディレクトリに `eslint` の設定ファイル(例 `.eslintrc.json`)があればその設定を読み込んで静的解析とフォーマットをしてくれる。

```settings.json
  "editor.formatOnSave": true,
  "prettier.eslintIntegration": true,
```

個人的には VSCode のJS標準フォーマッタがたまに壊れるのにフラストレーションが溜まっていたのが設定の動機。
ESLint の設定は今後チューニングしていくかもしれないが、とりあえずこれでほとんどの場合快適にいけるのではと思う。
快適。

# 参考記事
https://blog.nabeliwo.me/2017/07/prettier-eslint-vscode/
仮想化技術メモ

# Linux

- systemd-nspawn
  - コンテナ仮想化
- jailhouse
  - https://qiita.com/KiichiKameda/items/a9bb0891a24c3700ece3

# FreeBSD

- jail


# 参考

- https://paiza.hatenablog.com/entry/2014/10/21/%E7%9F%A5%E3%82%89%E3%81%AC%E3%81%AF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E6%81%A5%E3%80%82%E4%BB%8A%E3%81%95%E3%82%89%E8%81%9E%E3%81%91%E3%81%AA%E3%81%84%E3%80%90%E3%82%B3%E3%83%B3
一定時間利用されていないEC2インスタンスを自動でstopする

プライベートのOSS開発向けに、一定時間利用されていないAWSのEC2インスタンスを自動でstopする仕組みを作った。プライベート用なのでちょっと雑かも。

最初は[【AWS】CloudWatch入門／使っていないEC2を自動シャットダウンしよう](https://dev.classmethod.jp/etc/use-cloudwatch-to-detect-and-shutdown-unused-amazon-ec2-instances/) のように CloudWatch で CPU 使用率を監視すれば良いかと思ったが、やってみると vim を開いて編集しているだけの時間が案外長く、利用中なのにstopされてしまうことが多かったのでもう少し工夫した。


## 要件

* 一定時間利用されていないAWSのGPUインスタンスを自動でstopしたい
* ただし、vim を開いて編集しているだけのような CPU を喰わない時間帯も利用中なので stop したくない
* ただし、GPUを使って deep learning の学習を走らせているような時間帯も利用中なので stop したくない
* tmux や screen を使うので、余計なプロセスは生き続けている可能性があることも注意

## 設計

1. ssh セッションが生きて入れば ssh して作業中なので「active」と定義する 
2. CPU 使用率が 2% より大きければなにか処理中なので「active」と定義する
3. cron に仕込んで AWS CloudWatch に CustomMetrics として active か否かの情報を投げる
4. AWS CloudWatch で一定時間 Non Active なら EC2 インスタンスを stop するようにアラームを作る

ポイント

* CloudWatch を使わずに cron で毎分 1 or 2 の判定をして Non Active だったら即座に shutdown -h now するような仕組みでも、大体は機能すると思うが、EC2インスタンス起動直後に shutdown される可能性があるため避けた。後はちょっとコーヒーブレークで離席して ssh セッション切れたらすぐ stop されそうなので避けた。
* EC2上でログを吐いて、自前でログを舐めて一定時間(20分とか) Non Active なら shutdown するような仕組みにしても良いが、ログの rotate などを考えると面倒なので、AWS CloudWatch にデータを蓄積するようにした。
* AWS CloudWatch は 2018/09 現在、複合メトリクス(AND, OR)を条件にしたアラームを作れないので、スクリプト側で 1 or 2 の判定を複合して「active か否か」の情報を投げるようにした。
* GPU だけ使って CPU 全く使わないアプリケーションは存在しないので、CPU使用率だけ見れば良いことにした。GPU使用率も見た方が良いのは確かで、これはただの手抜き。

## 実装

```bash:is-active.sh
#!/bin/bash

# The first report of vmstat gives averages since the last reboot, drop it.
cpu_usage_usr=$(vmstat 1 2 | tail -1 | awk '{print $13}')
ssh_session_count=$(ss | grep '[s]sh' | wc -l)
if [ $cpu_usage_usr -gt 1 -o $ssh_session_count -gt 0 ]; then
  echo 1
  exit 0
fi
echo 0
exit 1
```

```bash:aws-put-mon-is-active.sh
#!/bin/bash
REGION=${1:-us-west-2}

SCRIPT_DIR=$(dirname "$0")
instance_id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id/)

value=$("$SCRIPT_DIR"/is-active.sh)
aws cloudwatch put-metric-data --namespace 'EC2/Custom' --metric-name 'IsActive' \
  --value "$value" --dimensions InstanceId="$instance_id" --region "$REGION"
```

```bash:/etc/cron.d/aws-put-mon-is-active
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
MAILTO=root
HOME=/home/sonots

* * * * * root /home/sonots/scripts/aws-put-mon-is-active.sh
```

あとは [【AWS】CloudWatch入門／使っていないEC2を自動シャットダウンしよう](https://dev.classmethod.jp/etc/use-cloudwatch-to-detect-and-shutdown-unused-amazon-ec2-instances/) を参考に CPU 使用率の代わりに、今回作った EC2/Custom IsActive メトリクスを見るようなアラームを作って、一定時間(20分とか) Non Active なら stop するように設定。

<img src="https://qiita-image-store.s3.amazonaws.com/0/9641/d5502784-68a2-f967-5280-068c547d4334.png" width="400px" />


なお、AWS CloudWatch アラームの EC2 アクションを選べるようにするには、カスタムメトリクスに InstanceId ディメンジョンを設定しなければならない(ので、してある）。
node.jsでgoogle画像検索APIを使って、テスト用の画像を取得してみる

ちょっとディープラーニングしたいな〜と。
……そう思ったんですが、教師データを集めるのがめんどくさいという事実が。
なので、Node.jsとgoogle画像検索を使用して必要な画像データを集めてみました。

# 制作物
https://github.com/fumihiko-hidaka/get_images

個人的にはダウンロード処理が上手く作れたんじゃないかと思います:relaxed:
Promise.allを使うと一つ遅い処理があると後続が詰まってしまうので、そこに気をつけてみたり。

# カスタム検索の作成

https://cse.google.com/cse/all

まずはGoogleアカウントにログインして、[ここ](https://cse.google.com/cse/all)にアクセスしましょう。
Addから新しく検索エンジンを追加しましょう！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/b5302ae0-43c3-ab5b-37fb-30b23b07b33b.png)

言語は日本語にして、以下のように入力して作成します。
サイトは後で削除するので実はなんでもいいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/669b8e80-2522-47cd-36ec-e8f9101bcedf.png)

# カスタム検索の設定

作成まで出来たので、次は設定を。
検索エンジンIDは後ほど使用するので、メモしておきましょう。
設定から画像検索をONにします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/2f5170ba-80d2-ae7c-8a48-6825558a5c28.png)

検索するサイトを削除し、ウェブ全体を検索するようにします。
プログラム的なアクセスをできるように「使ってみる」を押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/4310821f-5cb8-88b6-815c-b3e373312531.png)

「GET A KEY」を押下。
Google Cloud Platformのプロジェクトを選択してあげればAPI用のKeyが出てくるので、どこかにメモしておきましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/68a7bee4-e318-25ed-9e90-bcc894af6bc9.png)

# プログラムの実装！

ページのTOPにリポジトリは記載したので、検索する部分だけ抜粋を！

```index.js
const { google } = require('googleapis');
const customSearch = google.customsearch('v1');

const result = await customSearch.cse.list({
  cx: CSE_ID,
  q: SEARCH_KEYWORD,
  auth: API_KEY,
  searchType: 'image',
  safe: 'high',
  num: searchNum, // max:10
  start: startIndex + 1,
});
```

CSE_IDには検索エンジンIDを、API KEYにはAPI用のKEYが来るようにしてあげて下さい。
これでGoogle画像検索の結果が帰ってきます:kissing_heart:

# :cat:実行結果:cat2:

```terminal
node index.js 猫 20
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/10ab4dcb-3b2e-2baf-6f81-9d43f8f4202b.png)

これでDL用の画像を集めてみよう:heart_eyes_cat:
libGDXでTiled Map Editorのtmxファイルを読み込み、描画する方法

# 調べようと思った理由
学校の授業で少しだけ触ったので、詳しく調べて現在進めているチーム制作のゲームで、使おうと思ったためです。
学校の授業では、tmxファイルを読み込み、画面に描画するところまでやりました。
チーム制作では、キャラクターがいる位置のタイルの情報が必要でした。

# 読み込み方法
まずはTiledで作ったtmxファイルとtsxファイルと使用したマップチップの画像をAssetsフォルダーに入れます。
入れないと何もできませんからね。

次はソースコードを書いていきます。

```ruby:Main.java
TiledMap tiledMap;
OrthoCachedTiledMapRenderer tiledRenderer;
OrthographicCamera camera;

public void create() {
		camera = new OrthographicCamera();
        camera.setToOrtho(false, WIDTH, HEIGHT);
        
        /* TiledMapの読込みとRendererの初期化 */
        tiledMap = new TmxMapLoader().load("map.tmx");
        tiledRenderer = new OrthoCachedTiledMapRenderer(tiledMap);
}
```

tiledMap = new TmxMapLoader().load("map.tmx");
この文でレイヤーやセルなどのすべての情報が入ったtmxファイルを読み込みます。
tiledRenderer = new OrthoCachedTiledMapRenderer(tiledMap);
**読み込んだだけでは使えず、tiledRendererにセットしてあげないと使えません。**

読み込みはこれで終了です。
カメラは描画のときに必要になってくるので必ず作ってください。

# 描画

```ruby:Main.java
public void render() {
 		/* TiledMapの描画 */
        camera.update();
        tiledRenderer.setView(camera);
        tiledRenderer.render();
 }
```

tiledRenderer.setView(camera);
これはどのカメラに描画するかを設定しています。
キャラクターなどを描画するメインカメラとUIを描画するUIカメラの２つは、どのプロジェクトでもだいたいあると思います。
この2つのカメラのうち、**メインカメラにセットします**。

**tiledRenderer.render();
カメラに設定して終わりに感じますが、この一文を書かないと描画されないので注意してください。**

これでTiledのtmxファイルの読み込みと描画の完成です。

#おまけ
描画したマップの上にキャラクターとかを表示させたい場合はそれ専用の方法があります。
次回書くと思います。

初めて記事を書きました。初回からめんどくせーなって思ってしまったのでもしかしたら次回はないかもしれませんw
それでも自分が調べていて大変だったのを思うと周りの人に知らせていきたいなと思うので、次も書くと思います。

#参考サイトURL
[日本語ドキュメント]
(http://westplain.sakuraweb.com/translate/libGDX/Graphics/2D%2520Graphics/Tile%2520maps.cgi)（日本語ドキュメントのはずなのに英語で書かれていますw）


[俺とプログラミング　【libGDX入門】TiledMapを描画しよう]
(https://www.iandprogram.net/entry/2016/01/17/113216)
2018/9/27 【保存版】ストック記事を分類

## 技術系
・[swift初心者:「Class 'ViewController' has no initializers」の対処方法](https://qiita.com/Atsushi_/items/0d2eb4124e2ef5ed7d05)
・[【Swift4】コードからUIButtonを追加してイベントを取得する](https://qiita.com/shirape/items/559f9844b4e2973301e3)
・[ソフトウェア開発に役立つ　心理学的現象、行動経済学の概念など　15題](https://qiita.com/arai-wa/items/4c7629276ced7e933235)
・[UIViewControllerのライフサイクル](https://qiita.com/motokiee/items/0ca628b4cc74c8c5599d)
・[iOS 10以降のNotificationの基本](https://qiita.com/aokiplayer/items/3f02453af743a54de718本)
・[【Swift】アラートを表示する（Alert／ActionSheet）](https://qiita.com/funafuna/items/b76e62eb82fc8d788da5)
・[【Swift】休日2日を生け贄に青眼の白龍を召喚！](https://qiita.com/shunp/items/4289660b912d90536ece)
・[Swift カスタムセルを再利用したtableViewの作り方 [初級向け]](https://qiita.com/TD3P/items/116a2199b1f872ac6471)
・[【Swift4】次の画面にデータを引き継ぐ５つの方法【Xcode】](https://qiita.com/fromage-blanc/items/3ea2dfe97d4c2d6f0646)
・[Swift4で音楽プレーヤーを作ってみた！(MPMusicPlayerController)](https://qiita.com/umagoro/items/97b12b16174030f4d3cb)
・[あなたを死なせないためのプログラミング](https://qiita.com/yossymura/items/b19d08235bdb44f06ae8)
・[【エディタ】なぜ我々はいまだに文字列でコメントを書いているのか](https://qiita.com/tkrkt/items/2fc9a9a59ce679aab728)
[]()
[]()
[]()
[]()

## キャリア,学習系
・[新人エンジニアがSwiftを9日間学んで思ったこと。](https://qiita.com/jumpyoshim/items/50b70ae1c576a9e83c72)
・[【35歳プログラミング未経験者】が暗号通貨エンジニアに転職するためにしたこと](https://qiita.com/adrenaline0206/items/24157ed2a4587cec3c40)
・[プログラミングが大好きなWeb系エンジニアの50代以降のキャリアに関する考察](https://qiita.com/poly_soft/items/dbca28f166d07070e8eb)
・[【最新まとめ】未経験からエンジニアになった人エントリまとめ](https://qiita.com/shogotagami/items/4bd4864dab7727559304)
・[ペアプログラミングして気がついた新人プログラマの成長を阻害する悪習](https://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7)
・[プログラミング勉強を加速させる7つの習慣](https://qiita.com/YudaiTsukamoto/items/42a8df22ca4c6b327dfd)
[]()
[]()
[]()
[]()
DXFの「線分」をエディタで自作しました。行数をどこまで削除できるか調べました

(参考)

https://qiita.com/kazhida/items/8a5fa68e8fa135614d5d

線分だけです。
3ファイルを比較するため、3列に表示しました。(おまけ:winmergeで3ファイル比較するとわかりやすいです。)

```
  0                    0                 0
SECTION              SECTION           SECTION
  2                    2                 2
ENTITIES             ENTITIES          ENTITIES
  0                    0                 0
LINE                 LINE              LINE
  5  　　←            8        ←       10
73       ←            0   　　 ←       10.0
  8                   10                20
0                    10.0              10.0
 10                   20                30
10.0                 10.0              0.0
 20                   30                11
10.0                 0.0               20.0
 30                   11                21
0.0                  20.0              20.0
 11                   21                31
20.0                 20.0              0.0
 21                   31                 0
20.0                 0.0               ENDSEC
 31                    0                 0
0.0                  ENDSEC            EOF
  0                    0
ENDSEC               EOF
  0
EOF
```


# AutoCADLTで
「グループ コード5:図形ハンドル？」がなくても開く事ができました。
「グループ コード8:画層名(固定)」が必要でした。
3列目のように画層を削除すると、以下のメッセージがでます。

「
続けるには［Enter］キーを押してください:
」

~~(参考)DXF グループ コード(番号順)リファレンス~~
~~https://knowledge.autodesk.com/ja/search-result/caas/CloudHelp/cloudhelp/2018/JPN/AutoCAD-DXF/files/GUID-3F0380A5-1C15-464D-BC66-2C5F094BCFB9-htm.html~~
~~グループ コード5:図形ハンドル、最高 16 桁の 16 進数のテキスト文字列(固定)
グループ コード8:画層名(固定)~~

# jwwで
製作中
Chromeでペースト出来ない問題を解消

## ペースト出来ない。。。
いつもどおりchromeでコピペしようとするとなぜかペースト出来ない症状（ショートカットキー時）に遭遇した。
おそらくバグではあると思われるが動作しないととても不便なので解決法をメモ。

## 再現
- macOS
- Chrome (69.0.3497.100)
- `システム環境設定` > `キーボード` > `ショートカット` > `アプリケーション` > `すべてのアプリケーション` > `ペーストしてスタイルを合わせる`: `⌘V` を追加している

おそらくこの条件で再現するはず。

## 解決（暫定的）
`システム設定設定` > `キーボード` > `ショートカット` > `アプリケーション` > `Google Chrome` > `貼り付け`: `⌘V` を追加
<img width="645" alt="スクリーンショット 2018-09-27 0.32.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/87163/baf97fc8-971c-3e54-c6af-4f1668258e4d.png">

おそらくバージョンアップで解決されると思うので修正されたら追加した項目は削除するほうがいいかと思います。

## 参考
https://twitter.com/chriscoyier/status/1044253019439689728
ezdxfをインストールしてみた

(参考)Quick-Info ? ezdxf 0.8.8 documentation

https://ezdxf.readthedocs.io/en/latest/

(参考)Tutorials

https://ezdxf.readthedocs.io/en/latest/tutorials.html

(参考)第36回#オープンCAE勉強会@関西

https://senooken.jp/public/20150314/report/

https://www.youtube.com/watch?v=yoz9GHTqwUg

# まずは,NotFoundErrorから
C:\Users\xxx\PycharmProjects\untitled4\venv\Scripts\python.exe C:/Users/xxx/.PyCharmCE2018.2/config/scratches/getdxf.py
Traceback (most recent call last):
  File "C:/Users/xxx/.PyCharmCE2018.2/config/scratches/getdxf.py", line 1, in <module>
    import ezdxf
ModuleNotFoundError: No module named 'ezdxf'

Process finished with exit code 1

# ezdxfをインストールした後、次のエラー
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
    if not is_dxf_file(filename):
    with io.open(filename, errors='ignore') as fp:
OSError: [Errno 22] Invalid argument: 'C:\temp\\901-layerari.dxf'

Process finished with exit code 1

# python - pythonで簡単なランチャーを作ろうと思うのですがopen関数を使うとエラーが出てしまいます。 - スタック・オーバーフロー

https://ja.stackoverflow.com/questions/11582/python%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AA%E3%83%A9%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86%E3%81%A8%E6%80%9D%E3%81%86%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8Copen%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%A6%E3%81%97%E3%81%BE%E3%81%84%E3%81%BE%E3%81%99?rq=1

# print_entity not defined
C:\Users\xxx\PycharmProjects\untitled4\venv\Scripts\python.exe C:/Users/xxx/.PyCharmCE2018.2/config/scratches/getdxf.py
Traceback (most recent call last):
  File "C:/Users/xxx/.PyCharmCE2018.2/config/scratches/getdxf.py", line 10, in module
    print_entity(e)
NameError: name 'print_entity' is not defined

Process finished with exit code 1

# not all arguments converted during string formatting
C:\Users\xxx\PycharmProjects\untitled4\venv\Scripts\python.exe C:/Users/xxx/.PyCharmCE2018.2/config/scratches/getdxf.py
Traceback (most recent call last):
LINE on layer: 0
  File "C:/Users/xxx/.PyCharmCE2018.2/config/scratches/getdxf.py", line 12, in module
    print_entity(e)
  File "C:/Users/xxx/.PyCharmCE2018.2/config/scratches/getdxf.py", line 3, in print_entity
    print("start point: %s\n" % e.dxf.start)
TypeError: not all arguments converted during string formatting

Process finished with exit code 1

# 以下で何となく動いている。
```python
# (例)input file=C:/temp/tadasiidxf901.dxf
def print_entity(e):
    print("Line: ", e.dxf.start,e.dxf.end)
import ezdxf
dwg =ezdxf.readfile("C:/temp/tadasiidxf901.dxf")
msp = dwg.modelspace()
for e in msp:
    if e.dxftype() == 'LINE':
        print_entity(e)

# entity query for all LINE entities in model space
# for e in msp.query('LINE'):
#     print_entity(e)
```


# 20220821

https://ezdxf.readthedocs.io/en/stable/setup.html

WARNING: You are using pip version 21.1.1; however, version 22.2.2 is available.
You should consider upgrading via the 'c:\users\xxx\appdata\local\programs\python\python38\python.exe -m pip install --upgrade pip' command.

https://aizine.ai/python-uninstall0227/#toc3
依存関係プロパティと添付プロパティ

<h3>依存関係プロパティとはなんぞや。<br>
また添付プロパティとの違いとは？</h3>

よく理解していなかったが理解できたので忘備録でメモさせていただきます。


<h3>依存関係プロパティとは</h3>
>https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/advanced/dependency-properties-overview
依存関係プロパティの目的は、他の入力の値に基づいてプロパティの値を計算する方法を提供することです。 他の入力には、テーマやユーザー設定などのシステム プロパティ、データ バインディングやアニメーション/ストーリーボードなどのジャスト イン タイム プロパティ判定機構、リソースやスタイルなどの多目的のテンプレート、要素ツリー内の他の要素との親子のリレーションシップから判断される値などがあります。
なるほど。

依存関係の依存は、
アルコール依存症、糖質依存の依存。
他のものに寄って自身が変化するから、
依存関係プロパティ。

用途などは
https://blog.okazuki.jp/entry/2014/08/17/220810
を参照。




<h3>添付プロパティとは</h3>

>https://blog.okazuki.jp/entry/2014/08/20/081810
例えば、GridクラスのRow添付プロパティやColumn添付プロパティがあります。これは、Grid内の別コントロールに対して、何行目、何列目に表示するのかを設定するのに使用します。注目すべきなのは、Row添付プロパティとColumn添付プロパティはButtonなどには定義されていませんが、Buttonなどの様々なコントロールに設定可能な点です。

なるほど。
他のコントロールに、そのコントロールが持っていないプロパティを持たせることができる、
つまり添付することができるから、
添付プロパティ。

以上
puttyでssh鍵を作って認証したい時の注意とknown_hostを簡単に消したい時

ハマったのでメモ

## Putty

PuttyGenで鍵を作る
サーバーに入る。

```
chmod 700 .ssh
```

WinSCPなどでサーバーに送った後以下のコマンドを実行

```
$ ssh-keygen -i -f hoge_pub.pub >> authorized_keys
$ chmod 600 authorized_keys
```

これで入れるはず。


## known_hostの消し方
viとかで消すの面倒なので、

```
ssh-keygen -R host(ipとか)
```

これで消える
初心者なりにウェブ魚拓もどきのツイート版を作った

#はじめに
右も左もライブラリもリファレンスもろくに読めない初心者が備忘録も兼ねて作ったものです。

##何か作りたかった
何かしたいと思いながらも何も行動できなかったけれど、今回のはそんな僕でも簡単に書けて、案外実用性があるんじゃないかと思い重い腰を上げて書いた。

やりたかったことが下４つだった。
- 指定したIDの最新のツイート内容を適宜テキストファイルに書き込む
- ついでにちゃんと動いてることがわかるように画面にも表示させる
- 取得した内容が一つ前のツイートと同じだった場合書き込まない
- プログラムを実行している間は半永久的に動き続ける

以上のように非常に実装の難易度は低い簡単なもの。

#前置きはここまでにして書くために環境を整える
自分のPCには元々授業の関係で使ってないAnacondaがあったのでここにぶち込まれているPythonをSublime textにも使えるようにしたかった。

[ここ](http://www.ketsuago.com/entry/2016/07/03/225343)の内容を意味も分からずコピペした。

でも何故か試しに文字列をprintで出力させようとすると、文字化けして上手く動かねぇなぁってなって数日溶かして気づいたのがsublime textでは日本語は文字化けすることだった。
半角英語にしたら普通に表示された。

APIに関してはPythonにはいくつものTwitterAPIが存在するみたいだが、
今回は[わかりやすいサイト](https://imabari.hateblo.jp/entry/2016/04/20/222805)が存在していたので、そちらを参考にするためにPython-Twitterを使わせてもらった。

また、コンシューマキーやトークンは事前に取得していたアプリのキーがあったので、今回は割愛をする。

##でも上手く動かない
変数にキーを挿入するまでは通ったので、とりあえずツイートを取得する前に試しにツイートをさせようとした。

`[ { code: 89, message: 'Invalid or expired token.' } ]`
これが表示され上手くツイートされなかった。
調べるとトークンが間違っている可能性があると出たので再発行したが駄目だった。

##書き方を変えたら上手くいった
実は書く前に別のサイトで参考にしているサイトがあり、その時はtwitterAPIを入れていたのだが、その際に

```
CONSUMER_KEY        = '**********'
CONSUMER_SECRET_KEY = '***********'
ACCESS_TOKEN        = '***********'
ACCESS_TOKEN_SECRET = '***********'

api = twitter.Api(CONSUMER_KEY,CONSUMER_SECRET_KEY,ACCESS_TOKEN,ACCESS_TOKEN_SECRET)
```

以上のように書いてあったのでそれを参考に書いたのだが、[リファレンス](https://github.com/bear/python-twitter)を見てみると

```
api = twitter.Api(consumer_key='consumer_key',
                      consumer_secret='consumer_secret',
                      access_token_key='access_token',
                      access_token_secret='access_token_secret')
```

とのように書いてある。
なのでこちらに書き方を変えてみると上手くいった。何故なのか･･･

#ツイートを記録してみる
参考サイトを見つつやると上手くいった。そして書き上げたコードが以下

```python:tweet.py

# -*- coding: utf-8 -*-
from time import sleep #timeモジュールの中からsleep関数のみをimportする。
file = open('tweet_list.txt','a') #ファイルを書き込みモードでオープンする。

import twitter

api = twitter.Api(consumer_key='***************',
                      consumer_secret='**************',
                      access_token_key='***************',
                      access_token_secret='************')

tweet1 = 0
tweet2 = 0

infinity = -1
while(infinity < 0):
    user = api.GetUser(screen_name = 'furatukibito')
    tweet1 = user.status.created_at
    sleep(10)
    if tweet1 != tweet2:
        file.write(user.status.created_at +"\n\t"+ user.status.text + "\n\n")
        print (user.status.created_at +"\n\t"+ user.status.text + "\n\n")
    tweet2 = tweet1

```
メモ帳に書き込まれたのが↓の内容
<img width="495" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/203506/ff4ad7f3-2837-63e0-56e0-3b6aaca314bc.png">

#まとめ
本当に簡単なコードだけど、やりたいことが実現できてよかった。
ただ、少し気がかりなのが永久的に実行をするのを前提に書いたのでファイルクローズとか書かなくてもCMDを閉じたらいいかと思って書いてないこと。メモリ開放はされるのだろうか･･･