OmniAICreator/Qiita-1.07M huggingface dataset:
MTタグを用いたアノテーションについて

MTタグを用いたアノテーションについて質問させてください。

対象サイトはSPとPCとでURLが別れています。
SPサイトはPCページのURLのディレクトリ部分の前に/sp/が挿入される構造になっています。

そこで、下記のようなコードでalternateを指定しようとしたところ、エラーが出てしまいました。

&lt;link rel="alternate" media="only screen and (max-width: 640px)" href="＄&lt;mt:CanonicalURL replace=“.jp/”,”.jp/sp/”＄&gt;" /&gt;

（＄は半角）

自力で解決できず、エラーが出ない記述方法か、そもそももっとスマートなやり方があればご教示頂けますと幸いです。
debianチートシート

debian固有の話で忘れがちなやつをメモしておく

# ちょっとしたことを試すのに使い捨てのdebian環境がほしい

こういうときにDockerが便利

```sh
docker run --rm -it debian bash
```

# デフォルトのエディタをvimにする

```sh
sudo update-alternatives --config editor
```

# ロケールの変更

```sh
sudo dpkg-reconfigure locales
```

# sudoでパスワードを要求しないようにする

- ラズパイのデフォルトと同じ設定
- 下記の例では、ユーザ名が`debian`

```sh
echo "debian ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/010_debian-nopasswd
```

# キーボードレイアウトを変更する

```sh
sudo dpkg-reconfigure keyboard-configuration
```

https://blog.amedama.jp/entry/2017/03/10/210552


# journalログを肥大化させないようにする

デフォルトだと800MBくらい食うようなので、systemd-nspanwとかで使うときに困る。

`/etc/systemd/journald.conf` に

```
SystemMaxUse=50M
```

を設定する。
（もちろん`50M`の部分はお好みで）


# ユーザをグループに追加する

```shell-session
$ usermod -aG group user
```

例えば、`debian`ユーザを`sudo`グループに追加するには、


```shell-session
$ usermod -aG sudo debian
```

# あるコマンドが含まれているパッケージを探す

`apt-file` コマンドを使う。

例: `ping` が含まれているパッケージを探す

`command` は大抵 `/bin/command` や `/usr/bin/command` など `bin` が含まれるパスに置かれるので、以下のようなパターンで検索する。

```sh
apt-file search bin/ping
```
【Rails 5】utf8 -> utf8mb4 対応【mysql】

<blockquote>ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: '...' for column 'body' at row</blockquote>
<blockquote>Mysql2::Error: Index column size too large. The maximum column size is 767 bytes.</blockquote>

「使えない文字が含まれてるよ」
「カラムのサイズがデカすぎる。767バイト以内にして」(合ってる・・？)

rails5で開発中にこのエラーに出くわしたので、ここに対策を記載しておきます。
簡単に言うと上のエラー(1つめ)は絵文字が原因です。
絵文字を含んだ文字列をレコードに格納するには
utf8から**utf8mb4**にテーブルの構造を変えなきゃならんのですが、
変えたら今度はバイト数の関係で下のエラー(2つめ)が発生します。

環境: ruby 2.5.1, rails 5.2.1, mysql 5.6

データベースの設定を変更する。
`$ vim config/database.yml`

```ruby:config/database.ymlを編集
default: &default
  adapter: mysql2
  encoding: utf8mb4 # <= utf8 から utf8mb4 に変更
  charset: utf8mb4 # <= 追加
  collation: utf8mb4_general_ci # <= 追加
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: xxxx
  password: xxxx
  socket: /tmp/mysql.sock
```

デフォルトではテーブル作成時に
ROW_FORMATがCOMPACTになるので、DYNAMICを指定するようにする。
`$ touch config/initializers/ar_innodb_row_format.rb`

```ruby:config/initializers/ar_innodb_row_format.rbを作成
module InnodbRowFormat
  def create_table(table_name, options = {})
    table_options = options.merge(options: 'ENGINE=InnoDB ROW_FORMAT=DYNAMIC')
    super(table_name, table_options) do |td|
      yield td if block_given?
    end
  end
end

ActiveSupport.on_load :active_record do
  module ActiveRecord::ConnectionAdapters
    class AbstractMysqlAdapter
      prepend InnodbRowFormat
    end
  end
end
```

mysqlの設定を変える。
767バイト以内にするんじゃなくて、設定を変えて767超えても大丈夫なようにする。
ファイルフォーマットをAntelopeからBarracudaに変更。

`$ vim ~/.my.cnf`

```shell:~/.my.cnfの編集
[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server = utf8mb4
skip-character-set-client-handshake
collation-server = utf8mb4_general_ci
init-connect = SET NAMES utf8mb4
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = 1
```

↓結果↓

```shell:
$ bundle exec rails db:migrate

== 20181028110407 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0377s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0161s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0156s
== 20181028110407 DeviseCreateUsers: migrated (0.0696s) =======================
```
解決！！


参考にさせて頂いた記事
[ActiveRecordをutf8mb4で動かす](https://qiita.com/kamipo/items/101aaf8159cf1470d823)
[書籍感想] ’Becoming a Better Programmer’を読んだ個人的な感想

書籍名 : Becoming a Better Programmer
作者 : Pete Goodliffe 
![images.jpg](https://qiita-image-store.s3.amazonaws.com/0/303744/c8449696-35b0-9a1b-95fb-b314a3230a9e.jpeg)
#はじめに
会社の先輩のお勧めで本を読むようになりましたが,ITで仕事を始めた私に必ず必要な本だと思いました。 
まだJAVA言語を習い,それをもとにWebとAndroidを1年ほど学んだ私に
‘どうやってITをうまくできるか。どうやってCodingをきれいに作れるか。’
についての悩みはいつも持っています。そんな私に道を教えてくれる本ではないかと思いました。

#書籍の概要
本は全部で5つに分けて各パートはプログラミング時の実質的な実行方法を自分のものにする方法、プログラマーとしてプログラミング業務や作業環境を受け入れる姿勢、チームや会社でプログラミング業務やプロジェクトを仕上げる過程、プログラマーまたはプログラマーではない同僚たちと一緒に働くために必要な価値観に対する筆者の経験を 知らせていました。その中で各チャプターごとに筆者の経験と感じたことを知らせ、これに対して読者たちも考えるように質問をしたのが印象的でした。ただ、筆者の経験を羅列するのではなく、読者の考えで決着をつけるのがよかったです。

#他の人のためにコーディングするのを忘れないようにしよう。
プログラミングを勉強しながら、1ヵ月間簡単なウェブサイトを作ったことがあります。その時、 私はチームメンバーのコードを読んで苦しんでいる自分の姿を見ました。チームメンバーのコードで結果値を受け取り, これをまた自分のコードの入力値に入れるため、チームメンバーのコードを理解して適切な結果値のために修正しなければなりませんでした。私は200行ぐらいのコードを読みながら解釈しなければならないので、それに多くの時間がかかりました。その時、他人が私のコードを見るときも同じではないかなと思いました。
　このような経験をもとに筆者の助言は当たり前だが、必須で自分が必ず身に付けなければならないことでした。
筆者は正しい資料型、明確な変数の名前と他人の目から見ると読みやすくて重複しない短いコードで作成することが重要で、一貫したレイアウトスタイルを使用しなければならないと話しました。
　チームのコラボを通じて作るコードはチームメンバーのコミュニケーションであり、コミュニケーションがうまくなるためには明確で、チームメンバーたちが見るのも理解しやすいプログラミングにならなければなりません。また、誤って書かれたコードを再度修正すること（Code Refactory）を通じて適切な構造と簡潔なコードになるよう努力しなければなりません。

#最後に
今の私のIT実力と経験において難しい本でした。本の内容を100%理解できなかったが、ITの仕事でどのような姿勢をもってどのような考えでプログラミングにするかについて考える時間を持ちました。この本は1年ごとに再び読めば感じる部分がもっと多いと思いました。
macでtfsサーバーのgitリポジトリからgit cloneする準備


#キーの生成
ssh-keygen -C "example@example.com"

#tfsにキーの登録
~/.ssh/id_rsa.pubの内容をtfsに登録する
リポジトリで複製 -> SSH -> SSHキーの管理 -> 追加で登録する。

#configを書く
~/.ssh/config
Host hostname
    User username
    IdentityFile ~/.ssh/id_rsa

#git cloneする
git clone ssh://hostname:port/tfs/xxxx
中間テーブル　group




ビュー

```
.chat-group-user.clearfix.js-chat-member
  = f.collection_check_boxes :user_ids, User.where.not(name: current_user.name), :id, :name
  %input{name: "group[user_ids][]", type: "hidden", value: "#{current_user.id}"}
  
  %p.chat-group-user__name= current_user.name
```

コントローラーが受け取る値

```
[1] pry(#<GroupsController>)> params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"CkF44rk8XT6pdu1VsTZcKod61jcLgB78jm2F8nAbwyokkwhvV8Nk2RbQsbczU95tP78xUuZGY+vB3sbMfNquSw==", "group"=>{"name"=>"テストテスト", "user_ids"=>["", "3", "1"]}, "commit"=>"save", "controller"=>"groups", "action"=>"create"} permitted: false>
[2] pry(#<GroupsController>)>
```


モデル関係

```
group
id

group_user
user_id
group_id

group"=>{"name"=>"テストテスト", "user_ids"=>["", "3", "1"]}
group1  →  ueser_id 3,1　

user_ids =  user_id{1 ,2,3}


user
id


```
[JavaServlet]日本語パラメータの文字化け時の対応まとめ

[キッズプログラミング教室ITWORKS](http://listenmaker.1strentalserver.info/itworks/#top"ITWORKS")のayakaです。
育児の合間を縫ってせっせと記述します。
今回は自身の開発中にHTMLフォームデータの日本語パラメータの文字化けに関しての確認箇所を忘れるのでまとめておきます☺️

#そもそもなぜ日本語だけ文字化けしやすいのか
デフォルトの設定ではHTMLフォームデータとして日本語パラメータを送信した場合、URLエンコードされactionで示したメールアドレス・Webサーバのサーブレット等に送信されるからです。
**つまり対策してないと日本語パラメータだけデコードが必要という事:sweat_smile:**

#日本語対策はフォームデータの送信方法により異なる

- POST送信の場合

HTMLファイル内で宣言している文字エンコードをHttpServlet.HttpServletRequestのsetCharacterEncodingに指定する。
POST送信の場合送信されるパラメータはＨＴＴＰリクエストボディに含まれるためHttpServletRequestの設定で対応可能。

- GET送信の場合

HTMLファイル内で宣言している文字エンコードでデコードする。

```java
:SampleHttpServlet.java
form_data_in_japanese = request.getParameter("form-name");
URLEncoder.encode(form_data_in_japanese , "文字エンコード");
```
なんとGET送信の場合はHTTPリクエストボディに何も記述されません:flushed:
URLに追加されて送信されるからですね。したがって取得したパラメータに日本語を含む場合はデコードが必要です。
PostgreSQLの並び順について

PostgreSQLではレコードが生成された順に表示させたい場合、明示的に指定するべきである。

> [SELECT - PostgreSQL] (https://www.postgresql.jp/document/9.6/html/sql-select.html)
> ORDER BYが指定されない場合は、システムが計算過程で見つけた順番で行が返されます
>
> （略）
>
> ORDER BY句を使うと、結果行を指定した式（複数可）に従ってソートすることができます。 最も左側の式を使って比較した結果、2つの行が等しいと判断された場合は、1つ右側の式を使って比較します。その結果も等しければ、さらに次の式に進みます。 指定した全ての式で等しいと判断された場合は、実装に依存した順番で返されます。

レコードが生成された順で出ると思っていたが、並びに意味がある箇所では明示的に指定しないといけないよう。
AtomをNotepad++同様の環境にしたかった話

## はじめに
初投稿です 何かミスがあればコメントください。今回突然移行したくなったのは[Teletype](https://qiita.com/k-waragai/items/a372800c262f56fe688a)っていう共同編集機能が気になったってのと、Atomの方がいいよ～って友人によく勧められるので、それなら移行しようと思ったからです。Notepad++は主にPythonを書くのに使ってます。

##0. Notepad++の現環境
OS: Windows10
バージョン: 7.5.8
言語: 日本語

[内蔵機能]
　ワークスペース
　関数リスト
　文書マップ
　クリップボード履歴
[プラグイン]
　JSTool (JSONをMinify,Unminityする)
　NppExec (Pythonをエディタ上で実行する)
[キーバインド]
　Shift+F1 で開いているファイルをPythonで実行

**これと同様の環境をAtomでも作ります**
※プラグインのレイアウトは固定されていてタブもないので
全く同じ配置にはできなさそうです。慣れましょう。

#1. インストール
[公式サイト](http://atom.io)からダウンロードしてインストールするだけです。
インストールした時点で色々ガイドが出るので軽く読んだらガイドを閉じます、
この時点でシンタックスハイライトとワークスペース機能は利用できますが
他の機能はまだありません。プラグインには同様の機能があるのでそれを導入しましょう。
Notepad++ でいうPluginManagerはAtomの設定にあります。
Settings -> Install タブを開くとそこがPluginManager代わりです。

#2. 言語を日本語に
japanese-menuを導入すると日本語になります
設定タブは一度閉じるとなぜかたまに英語に戻るようです

#3. 関数リストを表示する
symbols-tree-view を導入すると使えます
上部の 表示 -> Toggle symbols-tree-view
で 表示有無を切り替えられます
デフォルトでは 変数名等も表示されますが、
関数リストビュー上で右クリックしてnamespaceとvariableのチェックを外すと
Notepad++と同じ表示になります
(関数名が日本語の場合、反映されません)

#4. 文書マップを表示する
minimap を導入すると表示できます
上部の パッケージ -> Minimap -> Toggle
で 表示有無を切り替えられます

#5. クリップボード履歴を利用する
clipboard-plus がそれと同じ機能を持っているようですが
使い方がよくわかりませんでした...

#6. JSToolの代わり
pretty-json を導入すると同じ機能が使えます
使う時は パッケージ -> Pretty JSON -> Prettify / Minify です

#7. NppExecの代わり
調べてみるといくつか選択肢があるように思えますが完全にNotepad++同様に動くものはありませんでした。 どうやら 裏で動かしたものをAtomのペインに表示するというものがほとんどらしく、リアルタイムにinputやprintを反映することはできないようです。どなたかNppExecと同様に動作してくれるようなプラグインをご存知でしたらコメントお願いします。検証したものは一応こちらに書いておきますのでよければ参考にしてください
## process-palette
|動作|O|
|-----------------|------------------|
|input|△(実行前に設定)|
|表示リアルタイム|X|
設定方法はNppExecにかなり近いです。
実行したプログラムを終了できないバグが起こることがあるみたいです。
## script-runner
|動作|O|
|-----------------|------------------|
|input|X|
|表示リアルタイム|X|
動作に問題はありません。
## script
|動作|X|
|-----------------|------------------|
|input|X|
|表示リアルタイム|X|
キーバインドもコマンドパレットからの実行も共に動作しません
当環境では全く動作しませんでした
## atom-python-run
|動作|O|
|-----------------|------------------|
|input|O|
|表示リアルタイム|O|
別ウィンドウでIDEを開きます
毎度ウィンドウを切り替えるのが少し手間ですが
これであれば入力もリアルタイムprintもできます

#やってみた感想
インストールして思ったのがレイアウトの自由が効かないなぁ～ってことです。
他の物を試したことがないのですが、どれもこういうものなんですかね?

後、Atomは結構メモリを食いつぶすらしく、
ここに記載されたプラグインに追加でオートコンプリートを入れただけで
僕の環境ではRAMを430MBも食っていました。
RAMを3.2MBしか使わないNotepad++と比べると結構ハードだと思います。
AtomはTeletypeの時だけ使うようにして
もうしばらくはNotepad++を使おうと思います。
新しいprojectに参画した時の現状把握tips

#新しくチームに入った時

新しい職場やプロジェクトに入った時、まずは現状コードを把握することから始めると思いますが、その時のコツをちょろっと学んだのでメモ。

##ルーティングの動きを見る
どのURLが叩かれると、どのメソッドが動き出すのかを見ることで、サービスの全体像を把握することができる。

##E-R図などをみて、DB把握
DB設計を見渡せるのと、ハブになっているテーブルを把握することで、どこのテーブルが重要度が高いのか優先度をつけることができる

##メソッドの中に出力メソッドを書いて、実行順番を把握
UI側では一回ボタンを押しただけですが、裏ではメソッドがめちゃくちゃ走っていることがよくあります。
その時にローカルサーバーを見てもよくわからないです。特にそのメソッドを改修しなければならない時とか、パラメーターとして送られてきたデータがどのように処理されるのかを追わなければならない時がよくあります。その時によく使います。

```Ruby.rb
def methodA
  p "methodA"
〜
end

def methodB
  p "methodB"
〜
end

def methodC
  p "methodC"
〜
end 

```
chart.jsのtooltipに表示させる文字列を変える

## やりたいこと
- chart.jsのtooltip（カーソルをグラフに合わせると出てくる吹き出しみたいないやつ）に表示させる文字列を変更する
- デフォルトではtitleにx軸、labelにy軸の値とグラフの色が入る


今回はcoffeescriptで記述した
## やりかた
```coffeescript
myChart = new Chart(ctx, {
  type: 'line',
  data: { ... }, # 表示するデータ
  options: {
    tooltips: {
      callbacks: {
        title: (tooltipItem, data) ->
          # title内ではtooltipItemの値（カーソルが重なった箇所のデータ）を表示する場合は`tooltip[0]`のよう要素を指定することに注意!!
          return tooltipItem[0].xLabel + "hoge"
        label: (tooltipItem, data) ->
          return [tooltipItem.yLabel + "huga"] # リストで記述すると改行される
       }
    }
  })
```

今回はRailsに組み込みたかったので、このへんを参考にしました
参考：https://qiita.com/Y_uuu/items/ef107a02c27836696545

chart.jsのドキュメントは日本語版があるので助かる
参考：https://misc.0o0o.org/chartjs-doc-ja/configuration/tooltip.html
Rails-tutorial初心者（5章）（自分メモ）

基本的に、２周目のときにブラッシュアップできたらなぁっておもっています。

### 開発環境
下記vagrantにて構築して利用しています。

```
$ cat /etc/system-release
CentOS release 6.10 (Final)
$ uname -a
Linux localhost.localdomain 2.6.32-754.3.5.el6.x86_64 #1 SMP Tue Aug 14 20:46:41 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
$ rails -v
Rails 5.1.6
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
```


###５章スタート

curlコマンドとは何かしら？
なにかダウンロードとかをCLIできる。

>Railsはassetsディレクトリ直下の画像をapp/assets/imagesディレクトリにある画像と紐付けています。これにより、ブラウザから見るとすべてのファイルが同じディレクトリにあるように見えるようになります。そして、このようなフラットなディレクトリ構成を採っていると、ファイルをより高速にブラウザに渡すことができるようになります。

・・・・なんでなんだろうか。

### 5.1.2
>Bootstrapフレームワークでは、動的なスタイルシートを生成するためにLESS CSS言語を使っていますが、RailsのAsset Pipelineはデフォルトでは (LESSと非常によく似た) Sass言語をサポートします (5.2)。そのため、bootstrap-sassは、LESSをSassへ変換し、必要なBootstrapファイルを現在のアプリケーションですべて利用できるようにします10。

・LESS CSS?
  →CSSの拡張版のイメージです。
   ネストできたり、変数を使えてたりするCSSのことです。
    変数は@hogehoge がLESSですが、railsだと$hogehogeを使います。

ここ参考 <https://qiita.com/masarufuruya/items/d6125332cc3394b5177c>

■課題/ 問題
・HTMLとCSSはドットインストールで勉強していたので、スラスラすすめた。
・パーシャルとかレンダーとかあたりのファイルの関係とかの全体観が抑えられていない。



SassとAsset Pipelineは、(開発効率のために切り分けられた) CSSの冗長な部分を圧縮し、本番環境に最適化した結果を出力する


### 5.2 Sassとアセットパイプライン
アセットディレクトリ、マニフェストファイル、プリプロセッサエンジンという、


#### ** Sassについて **
素晴らしいCSS生成ツールのことです。

`$ sass test.sccs test.css`
でsccsからcssファイルを作成できる。
このときにtest.css.mapというマッピングの情報のファイルも一緒に生成される。

[Sass(Syntactically Awesome Stylesheets) - wiki](https://ja.wikipedia.org/wiki/Sass)

ここ参考 <https://qiita.com/masarufuruya/items/d6125332cc3394b5177c>



#### ** パーシャル **
ファイルを分割して管理しやすくしたり、DRYをなくす。
直訳は”一部分”
そのファイル分割したファイルをうまく組み合わてHTMLファイルやCSSファイルを作成する機能のこと
・・・・Railsのパーシャルは効率化のために使われ、別ファイルにマークアップを切り出すことができます。

下記のバラバラなファイルをがっちゃんこするやつ
app/views/layouts/_header.html.erb
app/views/layouts/_footer.html.erb
....等
↓ 
app/views/layouts/application.html.erb


>パーシャルをビューの一部に含めて出力するには、ビューでrenderメソッドを使用します。
<%= render "menu" %>

#### ** Asset Pipeline?(アセットパイプライン) **

ここ参考 <http://rails.hatenadiary.jp/entry/2013/03/03/125801>

>アセットパイプラインとは
Rails のアセットパイプライン（Assets Pipeline）は JavaScript や CSS、画像ファイルといった HTML に付随する細々としたファイル達（アセットファイル）を連結したり圧縮することで効率的にアクセスできるようにする仕組み（フレームワーク）です。


つまり？？
・cssやjavascriptやimageファイルについて、うまく圧縮とかしてくれる。
・URLでアクセスするときに、いい感じに変換してくれる（assets配下にあるようにみえる）
・プリコンパイルをすることで、app/publicディレクトリ配下に実際のcssやjsが生成される）



#### ** render（ヘルパーの機能） **
レンダリング（表示）の機能です。
ここ参考 <http://rails.hatenadiary.jp/entry/2013/03/03/125801>

ViewのHTML内で使う場合は、

`<%= render "htmlファイル名" %>`
このHMTLで表示（レンダリング）するって意味。

パーシャルと関係性がつよそうです。




### 5.3.3 名前付きルート
ここは理解不足です。
iPhoneと機械学習でフライドチキンの部位を分類する

iPhoneと機械学習で何か面白いものを作ろうと思い、今回はフライドチキンの分類を作りました。〇ンタッキーフライドチキンの部位は、キール（胸）、リブ（あばら）、ウイング（手羽）、サイ（腰）、ドラム（脚）の５つのカテゴリーに分けられます。この５つのうちどれかを分類します。

## 内容
**機械学習の簡単な説明**
機械学習には学習済みモデルが必要です。モデルに画像を与えると「強いて言えば何か」が結果として出力されます。モデルはいくつか公開されていて、InceptionV3（Google）、VGG16（Oxford大学）、ResNet50（Microsoft Research）などがあります。モデルというと想像できにくいですが、拡張子 .mlmodel の100MB程度のファイルです。

この公開モデルには1000個のカテゴリーが入っています。例えばマウスであったり、コンピューターキーボードであったり、PCモニターの前に座った人をバーバーと分類したりします。画像を与えると全てのカテゴリーを足して100になるように結果が出ます。Aが80点と出る時もあれば、A30点、B25点、C20点と微妙な時もあります。

**今回やること**
今回のフライドチキンは５つのカテゴリーです。なのでカメラで人をとらえても「リブ」などと表示されてしまいます。１回の分類ではどうしても誤差が出てしまうので、１秒間に２回分類して、結果をリアルタイムに更新するような仕様にしました。

## 開発環境
- XCode iOS Swift
- CoreML Framework  
iOSの機械学習ライブラリ
- Turi Create  
学習モデルを作成します。Pythonで動かします。作ったモデルをiPhoneに送ります（TuriはAppleがを2016年に買収しました）

## モデルの作成
**手順**
1. Python と Turi Create をインストールします。
2. トレーニング画像（チキンの画像）をいっぱい集めます。
3. 画像をフォルダに分けます。
4. ターミナルで python model.py を実行します。
5. 結果、Chicken.mlmodel が作成されます。

<img src='https://qiita-image-store.s3.amazonaws.com/0/253995/5046492b-584b-6301-87f0-4abb630640f0.png' width=80%>
<img src='https://qiita-image-store.s3.amazonaws.com/0/253995/e4209152-2838-799c-e198-257236eff9c3.png' width=80%>

```python:model.py
import turicreate as tc
import os

data = tc.image_analysis.load_images('train', with_path=True, recursive=True)
data['label'] = data['path'].apply(lambda path: os.path.basename(os.path.dirname(path)))
data.save('Chicken.sframe')

train_data, test_data = data.random_split(0.9)
model = tc.image_classifier.create(train_data, target='label', max_iterations=100)

predictions = model.predict(test_data)
metrics = model.evaluate(test_data)
print('metrics=' + str(metrics['accuracy']))

model.save('Chicken.model')
model.export_coreml('Chicken.mlmodel')
```
**解説**
trainフォルダの下にフォルダを作り、トレーニング画像であるチキンの画像を200枚くらい入れます（頑張りました）。モデルを作成すると「フォルダ名」がそのまま「分類名」になります。今回の例では、drum、keel、rib、thigh、wing の５つのフォルダを作り、それぞれに画像を入れます。実行してできた Chicken.mlmodel を XCode プロジェクトにコピーします。

## アプリ
ソースはGithubに置きました。Inceptionv3モデルが入っています。自作したモデルを入れ替えて使ってください。
<https://github.com/koji4104/ImageDetector>
<img src='https://qiita-image-store.s3.amazonaws.com/0/253995/52eb6586-58e7-2604-06b9-7eb578eb88ba.gif'>

**解説**
上の例は、wing（手羽）とdrum（脚）です。このアプリでは毎回結果をプラスして、20をマイナスします。１秒間に２回処理をするので、何もなければ2.5秒でゼロになります。

## まとめ
画像分類は可能性があると思います。素人では見分けがつかないものでも、分類できるようになります。今回のアプリではiPhone(iPad)を使うので、人が持ち運んで使うことができます。顔認証などは大手企業がやるでしょうから、私のような小さな会社は、特定の業界や施設に特化した画像分類をやれば、何かビジネスなるかもしれません。

画像分類の実験を何度かやって思うのですが、とにかく学習モデルを作るのが面倒です。前回は写真を必要なとこだけ手作業で切り取っていましたが、今回は写真を正方形で中心で撮って、加工なしで使っています。かなり作業は減りましたが、それでもフォルダに振り分けるのが面倒でした。撮ると同時にファイル名を付けるなど、まだまだ成長の要素があると思います。
ずんだのMARQUEE問題

## ルール
* h1 - h6 の開き・閉じタグを marquee タグに変換する
* scrollamount に h1 - h6 の数値を設定する。 h1 なら `scrollamount = 1` , h6 なら `scrollamount = 6`

## プログラム（Ruby）
```ruby
puts DATA.read.gsub(/<h(\d)/, '<marquee scrollamount="\1"').gsub(/<\/h\d/, '</marquee')

__END__
<h1>test</h1>
<h2>test</h2>
<h3>test</h3>
<div>div test1</div>
<div>div test2</div>
<div>div test3</div>
```

## 出力
```
<marquee scrollamount="1">test</marquee>
<marquee scrollamount="2">test</marquee>
<marquee scrollamount="3">test</marquee>
<div>div test1</div>
<div>div test2</div>
<div>div test3</div>
```

## 出力結果をブラウザで表示
![zunda_marquee.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/adcc52ac-8aae-c30a-dca9-88c349c2c404.gif)

* [ずんだ問題まとめ - Qiita](https://qiita.com/tbpgr/items/3a4169b370f1a317ece0)
pythonのファイルの読み書き

#はじめに
pythonの基礎として、ファイルの読み書きについて記載したいと思います。

#環境
python3.6
macOS

#基本

ファイルを読み書きするにはopen(filename, mode)を使います。

```python
>>> f = open('file名', 'w')
```

第一引数にファイル名を、第二引数にはファイルの扱い方について記載します。

第二引数に関しては

```
読み取り専用：r  (引数が省略されている場合はrになります)
書き込み専用：w
追記用:a (書き込まれた内容が自動的にファイルの終端に追加されます)
読み書き両用:r+
バイナリモード:b
```


#with文

withを使うと、同じことをtry-finallyを使って書くより簡単に書くことができます。

```python
>>> f = open('/Users/hoge/Desktop/test.txt') 
>>> f.closed
False
>>> f.close()
>>> f.closed
True
```

```python
>>> with open('/Users/hoge/Desktop/test.txt') as f:
...     dt = f.read()
... 
>>> f.closed
True
```

withを使わない場合は、f.close() を呼び出してファイルを閉じる必要があります。 
ファイルを閉じなかった場合は、ファイルが開かれたままになる可能性があります。 

#内容の読み込み

ファイルの内容を読み込むにはread(size)を使います。
sizeはオプションの数値引数で、sizeが省略されたり場合は、ファイルの内容全てを読み込みます。size指定された場合は、指定したバイト数の読みこみを行います。

```python
>>> f = open('/Users/hoge/Desktop/test.txt') 
>>> f.read()
'test\n'
```

f.readline() は1行だけを読み取ります。
\nは読み出された文字列の終端に残ります。空の文字列を返ってきたら、ファイルの終端に達したことが分かります。

```python
>>> f = open('/Users/hoge/Desktop/test.txt') 
>>> f.readline()
'test\n'
>>> f.readline()
''
```

#内容の書き込み

f.write(string) は、stringの内容を書き込み、書き込まれた文字数を返します。

```python
>>> f = open('/Users/hoge/Desktop/test.txt',"w") 
>>> f.write('This is a test\n')
15
```

#位置について

f.tell()は現在の位置を示す整数を返します。バイナリモードの時にファイルの先頭からのバイト数で返します。
位置を変更するには、f.seek(offset, from_what)を使います。
ファイル位置は基準点にオフセット値を足して計算されます。参照点はfrom_what引数で選びます。

```python
>>> f = open('/Users/hoge/Desktop/test.txt',"rb+") 
>>> f.write(b'0123456789abcdef')
16
>>> f.read(1)
b''
>>> f.seek(5)  
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)
13
>>> f.read(1)
b'd'
```

from_whatの値が
0なら先頭から
1なら現在のファイル位置
2なら終端
を参照点として使います。
※from_whatは省略可能で、デフォルトは0を使います。


#json

先ほどのread()は文字列しか返さないため、数値を扱うのは大変です。
int関数とかを使えば、できなくはない？

これを簡単にするために、JSONが使えます。

標準モジュールのjsonは
- 文字列表現に変換(シリアライズ)
- 文字列表現からデータの再構築(デシリアライズ)
ができます。

```python
>>> json_test="""
... {"age":33,
...  "weight":78,
...  "height":175,
...  "area":"chiba"
... }
... """
>>> import json
>>> data = json.loads(json_test)
>>> data
{'age': 33, 'weight': 78, 'height': 175, 'area': 'chiba'}
>>> type(data) #jsonをpythonで辞書型として読み込むことができた
<class 'dict'>
```
```python
>>> json.dumps(data) #json形式に戻す
'{"age": 33, "weight": 78, "height": 175, "area": "chiba"}'
>>> json.dump(data, open("data.json","w")) #ファイルの書き込み
>>> json.load(open("data.json"))#読み込み確認
{'age': 33, 'weight': 78, 'height': 175, 'area': 'chiba'}
```

#おわり
Develop App for Vuzix Blade using Unity

## Vuzix Blade App development using Unity(2017.3.0f3) 

#### This sample App for Vuzix Blade can:  
- obtain Gyro sensor values and show these on the screen
- obtain Accelerometer values and show these on the screen
- obtain key action and show keycode name chosen on the screen
- obtain camera image and show it on the screen
- apply Gyro sensors value to a GameObject transform

#### This sample App for Vuzix Blade cannot:  
- vibrate Vuzix Blade (Actually I failed to do this)
- use microphone (Never try so far)
- use voice recognition (Never try so far)
- obtain one-finger tap event

<img width="201" alt="sampleApp.png" src="https://qiita-image-store.s3.amazonaws.com/0/179902/9553fd9e-85bb-1a60-9c0d-e723f64ec223.png">

## sample Unity project is available here:
https://github.com/hygradme/VuzixBladeAppWithUnity


## How to install this App to your Vuzix Blade
#### 1. activate USB debugging
- Settings -> Device -> USB Mode -> PTP or MTP

#### 2. Activate developer mode
- https://www.vuzix.com/Developer/KnowledgeBase/Detail/1077

#### 3. Activate usb debugging
- Settings->System->Dev Options -> USB Debugging->On

#### 4. Install adb to your PC

#### 5. Build sample app in Unity
- Platform ->android
- Player Settings -> Other Settings -> Minimum API level -> Android 5.0 'Lollipop' (API level 21)

#### 6. Connect your Vuzix Blade to your PC

#### 7. install app to your Vuzix Blade using adb
```
$ adb install <filename>.apk
```

#### Reference
- Obtain key chosen
  - https://qiita.com/pilkul/items/6351a967372541d92718

-  Use Camera
  - https://www.urablog.xyz/entry/2017/07/06/225444
Rails5でlayoutの切り替えで苦労したこと

# やろうとしたこと
- Railsの公開ページで共通して適用するヘッダと、管理者ページで適用するヘッダを`layout`で切り替えようとした

## 環境
- ruby 2.3.3
- Rails 5.2.0

# layout周りの実装
- 公開ページは`application_controller.rb`を継承し管理者ページは`admin/apllication_controller.rb`を継承したコントローラで制御
- それぞれの`application_controller.rb`コントローラで適用する`layout`ファイルを切り替え

### 公開画面
`layout/application.html.slim`を読み込む

```ruby
layout 'application'
```

###　管理画面
`layout/admin/application.html.slim`を読み込む

```ruby
layout 'admin/application'
```

# つまづいたこと
- ログイン後とログイン前の画面でレイアウトが切り替わらないことがある
- 不定期に発生する
- キャッシュ周りの問題なのかも
- 今回は問題なかったけどログイン後のユーザでヘッダを切り替えようとする実装があると、エラーを吐く

# 対処方法

- `admin/apllication_controller.rb`を`admin/base_controller.rb`に名前を変更
- クラス名も`Admin::ApplicationController`から`Admin::BaseController`に変更
- `admin`以下のコントローラの継承を`Admin::BaseController`に変更
- `base_controller.rb`から呼び出すlayoutを`admin/base.html.slim`に変更

思うと今回はゴリ押しにしか見えないけど、こんな感じにコントローラの名前を変えたらレイアウトが反映されないことがなくなった

明らかにベストプラクティスじゃないのでもっとかっこよく記述したい
3分でラクラク簡単。PowerLineをいれるまで

## powerline
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253308/2c4261b9-a93f-c332-fdb8-804a0ed8dff2.png)
こいつをいれると見栄えがよくなるぞ！

```shell

sudo apt install -y python-pip
pip3 install powerline-status
```
### フォント

powerline用にフォントを入れないと、悲しいことにズレまくります。
Cicaフォントを入れると、powerline用の設定だったりをしてくれているので、
面倒な手間がないで凄く良い感じ。入れない場合は、こっちを参考にするといい感じです。
[powerline のフォントのズレを修正する方法](http://oooooooo.hatenablog.com/entry/2013/05/01/151455)

[Cicaをダウンロード](https://tmnm.tech/2017/10/11/vim-setting-with-cica/)

```shell

sudo cp -r Cicaファイル /usr/share/fonts/truetype/Cicaファイル
fc-cache -fv
```



### tmux
みんな大好きtmuxは.tmux.confに書き込み  

```
run-shell "powerline-daemon -q"
source ".local/lib/python<自分のバージョン>/site-packages/powerline/bindings/tmux/powerline.conf"
```

## vim
純正Powerlineの設定ならこれ 

```vim
set laststatus=2
set showtabline=2
set t_Co=256
python3 from powerline.vim import setup as powerline_setup
python3 powerline_setup()
python3 del powerline_setup
```
### lightline
または、lightlineを入れる。軽いのでこっちのほうがオススメ。

vim plugでインストール

```Vim
Plug 'itchyny/lightline.vim'
```
色々設定。　　[Cica作者さんの丸コピです。](https://tmnm.tech/2017/10/11/vim-setting-with-cica/)

```Vim
let g:lightline = {
            \ 'colorscheme': 'molokai',
            \ 'active': {
            \   'left': [ [ 'mode', 'paste' ],
            \             [ 'fugitive', 'filename' ] ]
            \ },
            \ 'component_function': {
            \   'fugitive': 'LightLineFugitive',
            \   'readonly': 'LightLineReadonly',
            \   'modified': 'LightLineModified',
            \   'filename': 'LightLineFilename',
            \   'filetype': 'LightLineFiletype',
            \   'fileformat': 'LightLineFileformat',
            \ },
            \ 'separator': { 'left': '', 'right': '' },
            \ 'subseparator': { 'left': '', 'right': '' }
            \ }

function! LightLineModified()
    if &filetype == "help"
        return ""
    elseif &modified
        return "+"
    elseif &modifiable
        return ""
    else
        return ""
    endif
endfunction

function! LightLineReadonly()
    if &filetype == "help"
        return ""
    elseif &readonly
        return ""
    else
        return ""
    endif
endfunction

function! LightLineFugitive()
    if exists("*fugitive#head")
        let _ = fugitive#head()
        return strlen(_) ? ''._ : ''
    endif
    return ''
endfunction

function! LightLineFilename()
    return ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') .
                \ ('' != expand('%:t') ? expand('%:t') : '[No Name]') .
                \ ('' != LightLineModified() ? ' ' . LightLineModified() : '')
endfunction

function! LightLineFiletype()
  return winwidth(0) > 70 ? (strlen(&filetype) ? &filetype . ' ' . WebDevIconsGetFileTypeSymbol() : 'no ft') : ''
endfunction

function! LightLineFileformat()
  return winwidth(0) > 70 ? (&fileformat . ' ' . WebDevIconsGetFileFormatSymbol()) : ''
endfunction
```
Railsチュートリアル で地味にめんどくさいことの対策

まだ4章途中までしか読んでいないので、そこまでの地味にめんどくさいことへの対応まとめです。増えたら追記します。

# 環境
Railsチュートリアルの推奨環境を想定しています

- Cloud9のIDE（30分アクセスがないとサーバーが落ちるようにしている）
- Heroku

# 毎回ssh-addさせられる
さぁ今日もRailsチュートリアルがんばるぞ！
さぁpushだ！
：

```
$ git push
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

またおまえか！

ターミナル毎に設定されているようなので、サーバを立ち上げなおしたり、別のターミナルを開いたりすると秘密鍵が登録されていない状態に戻ってしまいます。

### 対処法

再設定のためにssh-agent立ち上げて、ssh-addして…を毎回やるのは面倒なので
設定コマンドを「ターミナルが起動したら自動的に実行」されるようにします。

```
$ vi ~/.bashrc

# 以下をファイルの最後に追記
eval `ssh-agent`
ssh-add ~/.ssh/id_rsa
```

ちなみに、MacOSの場合ssh-addに「-K（大文字）」オプションが使えて、何度も設定しなくてよいそうです。（Macを持っていないので未確認）

```
ssh-add -K ~/.ssh/id_rsa
```

また、ほかにも方法がありそうだったり、そもそもサーバに秘密鍵置きっぱなしにするのはどうなの？みたいな問題があるようですが、チュートリアルを実施するだけなら問題ないと考えます。


# 気づいたらheroku コマンドが使えない

よし、pushもできたし、次はherokuに新しいアプリをデプロイするぞ！
：

```
$ heroku create
bash: heroku: command not found
```

今度はお前か！
herokuも同様に、ターミナルが変われば設定は残っていません。

### 対処法
先に対処法を記載します。
ターミナル起動時にPATHが自動設定されるようにします。


```
$ vi ~/.bashrc

# 以下をファイルの最後に追記
PATH=/usr/local/heroku/bin:$PATH
# こちらの記載でも可
source $HOME/.profile > /dev/null
```

### なぜなの？
最初にやったこのコマンドじゃダメなの？

```
source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

と、思うかもしれません。
このコマンドでもherokuコマンドは使えるようにはなりますが、毎回無駄な処理を実行することになります。

https://cdn.learnenough.com/heroku_install
の中身を見てみると、こんな風になっています。

```
curl -OL https://cli-assets.heroku.com/heroku-linux-x64.tar.gz
tar zxf heroku-linux-x64.tar.gz && rm -f heroku-linux-x64.tar.gz
sudo mv heroku /usr/local
echo 'PATH=/usr/local/heroku/bin:$PATH' >> $HOME/.profile
source $HOME/.profile > /dev/null
```

1～3行目でherokuに必要なファイルを取得して、/usr/localフォルダに移動しています。
4行目では\$HOME/.profileファイルにPATHを通すような記載を追記して
5行目で\$HOME/.profileを実行することで、herokuコマンドを使えるようにしています。

つまり、herokuコマンドが見つからない状態でも

```
ec2-user:~/environment $ ls -d /usr/local/heroku
/usr/local/heroku
```

/usr/local/herokuディレクトリは存在していて、heroku自体は使える状態にあります。
ただherokuがどこにいったかわからなくなっているだけです。

安易に最初のコマンドを実行すると

```
ec2-user:~/environment (master) $ cat $HOME/.profile
PATH=/usr/local/heroku/bin:$PATH
PATH=/usr/local/heroku/bin:$PATH
PATH=/usr/local/heroku/bin:$PATH
```

こんな風に何度もPATH設定が書かれることに...

https://wa3.i-3-i.info/word13652.html
によると
PATHを記載している\$HOME/.profileファイルは
「ログインシェルがbashで、かつ「.bash_profile」という設定ファイルと「.bash_login」という設定ファイルが無い状態でログインしたときに読み込まれる設定ファイル」
なので「.bash_profile」ファイルがあるcloud9環境では実行されないんですね。

```
ec2-user:~/environment $ ll ~/.bash*
-rw-rw-r-- 1 ec2-user ec2-user     0 Oct 26 13:30 /home/ec2-user/.bashfile
-rw------- 1 ec2-user ec2-user  7711 Oct 28 14:58 /home/ec2-user/.bash_history
-rw-r--r-- 1 ec2-user ec2-user    18 Aug 30  2017 /home/ec2-user/.bash_logout
-rw-r--r-- 1 ec2-user ec2-user   218 Sep 27 13:18 /home/ec2-user/.bash_profile
-rw-r--r-- 1 ec2-user ec2-user  1484 Oct 27 06:07 /home/ec2-user/.bashrc
-rw-r--r-- 1 ec2-user ec2-user 12288 Oct 26 13:32 /home/ec2-user/.bashrc.swo
```



それでは、よきRailsチュートリアルライフを！

# 参考
https://qiita.com/naoki_mochizuki/items/93ee2643a4c6ab0a20f5
https://wa3.i-3-i.info/word13652.html
[Lightning Network] ifpaytt のインストール

Ubuntu 16.04 を使用する。

ライトニングネットワークでは、支払いを希望するものが先に請求書（invoice）を発行しなくてはならない。そのため、受け取り側は支払いをフックする仕組みが必要になり、それが [ifpaytt(if pay then that)](https://github.com/ElementsProject/ifpaytt)である。

前提として Lightning Charge をインストールしていないといけない。これのインストール方法は[こちら](https://qiita.com/jiyu/items/8a5d5ed420b83e47db93)を参照。

### ifpaytt をインストール

例によって npm だと `git clone`でエラーが出るので、yarn で入れる。

```
sudo yarn global add ifpaytt
```

### IFTTT をセットアップ

[公式サイト](https://github.com/ElementsProject/ifpaytt#user-content-setup)の通りに行えばOK。

### 使い方

そのうち追記します。
【編集中 記事】Excelに記載した進捗報告書を、そのExcelファイルがある場所にテキストファイルとして出力する

# 作成の目的
Excelファイルでなく、テキストファイルで進捗ファイルを提出するように依頼されたため、
マクロを作成した。

```
Sub ファイル出力を行う()

  ' 出力ファイルのフルパス
  Dim OutputSaki As String

  ' ファイル番号
  Dim FileNum As Integer
  Dim i As Long
  Dim TodayDate As String
  TodayDate = Format(Date, "mmdd")
  OutputSaki = ActiveWorkbook.Path & "\" & TodayDate & "_" & "進捗報告.txt"
  FileNum = FreeFile

  Dim FileAriHantei As Long
  Dim BookPathAndName As String

  BookPathAndName = ThisWorkbook.Path

    If Dir(OutputSaki) <> "" Then
        FileAriHantei = MsgBox("ファイルがすでに存在します" & vbCrLf & _
                    "上書きしますか？", vbYesNo)
        If FileAriHantei = vbNo Then
            Exit Sub
        End If
    End If

  Open OutputSaki For Output As FileNum
  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
  Print #FileNum, Cells(i, "A").Value & Cells(i, "B").Value
  Next i
  Close FileNum
End Sub
```
【編集中 記事】Excelシート該当範囲をコピーし、別シートへ書式＆値のみコピー

# 作成の目的
毎日移り変わる日毎のテスト進捗を関数で取得し管理していたが
日毎のテスト進捗をログとして残す必要が出たため、別シートへ値として残すマクロを書きました。

```
Sub 各日報告シート出力くん()

  'ワークシートオブジェクト取得
  Dim ws As Worksheet

  'あとで条件判定に使うflag
  Dim flag As Boolean

  'マクロ実行時の日付(mmdd)で取得
  Dim TodayDate As String
  TodayDate = Format(Date, "mmdd")

  'コピー元シート名
  Dim CopyMotoSheet As String
  CopyMotoSheet = "FORMAT"

  'コピー元セル範囲
  Dim CopyMotoRange As String
  CopyMotoRange = "A1:K100"

  'コピー先シート名
  Dim OutputSheet As String
  OutputSheet = TodayDate & "_" & "進捗報告"

  'コピー先セル番地
  Dim OutputCell As String
  OutputCell = "A1"

  '本日分の作業報告シート有無調査
  'あれば、エラー表示
  'なければ、本日分作業報告出力
  For Each ws In Worksheets
    If ws.Name = OutputSheet Then flag = True
    Next ws
    
    If flag = True Then
      MsgBox ("本日分の【" & OutputSheet & "】シートがあるため出力できません。" & _
      Chr(10) & "再出力する場合､" & "【" & OutputSheet & "】シートを削除してください。")

    Else
      'シートを追加し、名前を「mmdd_進捗報告」にする
      Worksheets.Add After:=Worksheets(CopyMotoSheet)
      ActiveSheet.Name = OutputSheet

      '変数CopyMotoSheetシートの指定範囲を「mmdd_進捗報告」シートへコピペ
      Sheets(CopyMotoSheet).Range(CopyMotoRange).Copy
      Sheets(OutputSheet).Range(OutputCell).Select

      '書式 貼り付け
      Selection.PasteSpecial Paste:=xlFormats

      '値 貼り付け
      Selection.PasteSpecial Paste:=xlPasteValues


      'コピーモードが継続しているためESCさせる
      Application.CutCopyMode = False

      '処理実行後は、処理したシートのA1セルを選択しておく
      Range(OutputCell).Select
      Worksheets(CopyMotoSheet).Select
      Range(OutputCell).Select


      '列幅自動調節 どの列幅を調節しよう？
      Range("B:B").Columns.AutoFit
    End If
End Sub
```
モジュールのbuild.gradleをざっくりと読み解く

備忘録も兼ねてモジュールのbuild.gradleの見方をざっくりと解説

今回使うサンプルのgradle

```gradle
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.sho.gof"
        minSdkVersion 27
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            packageNameSuffix "release"
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
        dev {
            dimension "stage"
            versionName "1.0-development"
        }
        testing {
            dimension "stage"
            versionName "1.0-testing"
        }
        staging {
            dimension "stage"
            versionName "1.0-staging"
        }
        production {
            dimension "stage"
            versionName "1.0-production"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

```

## apply
ビルドスクリプトで使うプラグインの宣言

## androidブロック
Androidアプリケーション固有の設定

* defaultConfigブロック
    * アプリのバージョン管理
    * File -> Project Structure -> Flavors タブに対応

* buildTypesブロック
    * ビルドタイプの管理と個別の設定を記述（標準ではdebugとrelease、明示的にreleaseが書いてあるがdebugも有効になっている)
        * 例えば上記例ではreleaseだけpackageNameの末尾にreleaseと命名することで使い分けが容易
    * File -> Project Structure -> Build Types タブに対応

* productFlavors
    * アプリケーションごと管理するのに使う
        * 上記例では、開発用(dev), テスト環境用(testing), ステージング環境用(staging), 本番用(production)とすることで、開発での動作確認ではdevelopmentを、本番リリース用にはproductionと使い分けができる

そして、これらのbuildTypesとproductFlavorsの組み合わせにより、様々な環境のAPKファイルをビルドすることができる　この概念がBuild Variantである。

`Build Variants = productFlavors × buildTypes
`<img width="266" alt="スクリーンショット 2018-10-28 23.35.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/260353/618d84d6-6cf3-3028-8bdd-bc0a28117ab8.png">
Android Studioではこの部分から操作してビルドしたい環境を指定する

## dependenciesブロック
依存関係(導入しているライブラリ、SDKのバージョン)を記述する
ライブラリやSDKではAndroidの対応バージョンや他ライブラリと依存している場合があり、それらを管理するのに用いる

依存関係を見たい場合は、
* IDEの一番右にあるGradleをクリック
* Tasks　-> android -> androidDependenciesをクリック
* 右下にあるGradle Consoleを確認

![スクリーンショット 2018-10-28 23.47.17.png](https://qiita-image-store.s3.amazonaws.com/0/260353/3fddf114-0223-16c7-a771-af14e75b1931.png)
こんな感じで出てればオーケー

## 最後に
モジュールのbuild.gradleをざっくりと解説してみました
gradleの設定はかなり奥が深いのですが、使いこなせればAndroidの開発をかなりハックすることができると思います
私自身実力がまだまだなので精進していく所存
macOS上でffmpegを開発する環境を整える話

本記事は東京大学工学部電子情報・電気電子工学科の「[大規模ソフトウェアを手探る](https://doss.eidos.ic.i.u-tokyo.ac.jp/)」という実習の報告書を兼ねています。

# はじめに

[ffmpeg](https://www.ffmpeg.org)はコマンドライン上で動画や音声を処理するツールです。変換はもちろん、ダウンロードやストリーミング配信を行うこともできます。

今回、大学の実習で[ffmpegにHSL形式の動画をダウンロードする際のオプションを追加することになりました](https://qiita.com/grayarea/items/f7bc7b98ca2f4ba286ca)。本稿ではその準備段階である、ビルドとデバッグの方法を説明します。

# オフィシャルなドキュメント

macOSでビルドする際の手順が記載されているのでここを参考にビルドすると良いでしょう。

https://trac.ffmpeg.org/wiki/CompilationGuide/macOS

# 環境

本稿では以下の環境を前提とします。

* macOS 10.14 Mojave
* lldb-1000.11.37.1

# ビルド

まずはじめに必要なパッケージを揃えましょう。公式のドキュメントに一覧が載っています。

## オプションの決定

公式のサンプルを見てもわかりますが、ffmpegをビルドする際はconfigureにたくさんのオプションを指定します。初めてのビルドだと何をつけたら良いのかわからないのではないでしょうか。
そんな時は、Homebrewで通常インストールされるffmpegをビルドした時のオプションを見てみましょう。`ffmpeg`とだけシェルに打ち込んでオプションなしで起動すると、次のような出力がなされます。

```
$ ffmpeg
ffmpeg version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with Apple LLVM version 10.0.0 (clang-1000.11.45.2)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.0.2_1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-opencl --enable-videotoolbox
  libavutil      56. 14.100 / 56. 14.100
...
```

3行目の"configuration: "以降の部分が指定されたオプションです。これをコピペすればとりあえずいつも通りのffmpegが出来上がります。

基本コピペでOKですが、開発用にビルドすることになるので以下のオプションには注意しましょう。

* インストール先を変更する`--prefix`
    * 開発用に使うので、適当なディレクトリを指定しましょう
* 最適化を無効にする`--disable-optimizations`
    * これをつけないとデバッガで追う際に変数が全て見えなかったり実行順がソースコード通りでなくなったりします

## ビルド

オプションを決めたらビルドしていきます。私の場合はffmpeg-installというディレクトリを1つ上に作ってそこに実行ファイルなどを配置するようprefixを設定してみました。

```bash
$ git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
$ cd ffmpeg
$ ./configure --prefix=../ffmpeg-install --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-opencl --enable-videotoolbox --disable-optimizations
$ make -j8
$ make install
```

以上でビルドは終了です。

# デバッグ

実習では、[デバッガを使うまでもなく改造を達成してしまった](https://qiita.com/grayarea/items/f7bc7b98ca2f4ba286ca)ので、デバッガを使ってffmpegの動作を追うことはありませんでした。ただ、一応触ってみたところ、実はハマりポイントがあったのでデバッグの方法をご紹介しておきます。

[Bug Reportsのページ](https://ffmpeg.org/bugreports.html)などにも書いてあるのですが、**実は`--prefix`で指定したインストール先にある実行ファイルを使って、ソースコードに対応づけながら動作を追跡することはできません。**デバッガを用いる場合は、ビルドを行なったディレクトリにある**ffmpeg_g**という実行ファイルを用います。

これさえ知っていれば簡単で、

```
lldb ffmpeg_g
```

のようにすればデバッグを開始することができます。
脱初心者のためのgccコマンド覚書

[さっきの記事](https://qiita.com/gitcho/items/2533808bdc76cef3d676)を投稿したのはいいが、肝心の「いろは」の部分を記述していなかった。

かれこれ5年以上前の知識で大半は忘れてしまったが、それでも覚えている部分は多分重要な部分だからだろう、ということで備忘録として残すことにした。

# コンパイルとは
某有名落ちものパズルゲーを作った会社のことではないw。

ソースコードから実行できるファイルを生成することを指す、こっちのことだ。
`gcc sample.c -o sample`でソースコード`sample.c`から実行ファイル`sample`を生成する、この行為のことだが、その過程は大きく以下の3つに分けられている。

1. 前処理（プリプロセス）
1. オブジェクトファイル生成（コンパイル）
1. リンク

`gcc`だと `-E` `-c` のオプションで段階的に処理結果を確認できる。

## 前処理だけ行う

    gcc -E sample.c

マクロ関数(`#include`や`#ifdef`なども)はこれで展開されて中身を確認できる。
自分はしないように気をつけていても、何かの事情でマクロ関数だけで画面2スクロールさせるくらい処理を書いてる変人がいることもある。
そんな過去の人が書いたコードを数十年保守するのが新人Cプログラマーの役目だと悟った時の絶望は今でも忘れない。

### その時だけのマクロ定義
`-D`オプションを指定すると、そのコンパイル時にだけ有効になるマクロを定義することができる。
例えば、隠し機能をコードに埋めておいて、デバッグ用のコンパイル時にだけ有効にする、みたいな使い方ができる。

## オブジェクトファイルの生成

    gcc -c sample.c

コンパイルのメイン処理。オブジェクトファイルを生成する。最適化やデバッグオプションを指定するならここで指定する。

### デバッガオプション
`gdb`を利用するときに`-g`指定する。実はレベルを指定できて`-g3`はマクロ関数の呼び出しが可能なデバッガオプション。
デバッガを利用するときは最適化なし(`-O0`)を合わせて指定するのがいい。

    gcc -O0 -g3 sample.c 

### 最適化オプション
何を優先で最適化するかによりコマンドが違うので、詳細はmanコマンドで要確認。
デバッガを使うときは、最適化しない`-O0`を指定。

## リンク

        gcc sample.o

コンパイルしたオブジェクトファイルをリンクして実行ファイルにする。
`math.h`など別のライブラリにある関数を利用する場合は`-lm`などのオプションを指定する。

### ライブラリの生成
ライブラリの生成には`-shared` `-fPIC`のオプションを指定する。
`/lib`, `/usr/lib` とかにある共有ライブラリ `lib*.so` ファイルを作成することができる。
`-fPIC`は動的リンクするライブラリにしたいときに指定する。
出力する共有ライブラリは必ず **lib〜.so** ファイル名にする。（先頭のlibがないと利用できないので注意）

    gcc -shared infile1.c infile2.c ... -o liboutfile.so

### ライブラリのリンク
ライブラリをリンクするときは、`-L`でライブラリファイルのある **ディレクトリを** 指定する。（環境変数`LIBRARY_PATH`に追加してもいい）
同様に、ライブラリのヘッダファイルは`-I`でヘッダファイルのある **ディレクトリを** 指定する。
また、ライブラリ名が`liboutfile.so`の場合は、`-l`オプションで`-loutfile`と指定する。
`lib〜.so`の`〜`部分を指定するのがポイント。

    gcc sample.o -I./headerdirname -L./libdirname -loutfile

### 実行するときは`LD_LIBRARY_PATH`
リンク時は`LIBRARY_PATH`にライブラリのディレクトリを指定するが、実行時にライブラリが見つからずエラーになることがある。
そんなときは配置したディレクトリを環境変数 `LD_LIBRARY_PATH` に追加する。
経験上「コンパイルできるのに動かない」ときは、だいたいこれか、リンク時のオプション忘れが原因。

# 知っておいたほうが便利なコマンド
## どのライブラリがリンクできていないかを知りたい
`ldd`コマンドで確認できる。

    ldd liboutfile.so

`not found`になっていたら`LD_LIBRARY_PATH`に追加できていない。
共有ライブラリの中から別の共有ライブラリを参照することもあるので、再帰的に確認したほうがいい。

## このライブラリがあるディレクトリを知りたい
`locate`コマンドが便利。

    locate libm.so

たまに`updatedb`が実行されていなくて期待を裏切られることもある。
（おまえのことだぞ、cygwin）

## そんなライブラリないんだけど
そもそも必要なライブラリがインストールされていない可能性も考慮するならググったほうがいい。
Ubuntuの場合は `apt-file` というパッケージが存在するので、ライブラリファイル名から必要なパッケージが検索できる。

## このライブラリが提供する関数を知りたい
共有ライブラリの中に存在する関数を確認するときは`nm`コマンドが便利。

    nm liboutfile.so

この命名規則に従っていない関数作ったやつ誰だ。このライブラリはあそこの部署か、またか、みたいな犯人探しができるｗ
Javascriptでオブジェクトの配列から特定の値を持つ要素を抜き出す


よく使うのでメモ。
次のようなオブジェクトの配列（連想配列の配列）があった場合、

```javascript
//オブジェクトの配列
var objArray = [
    {'name':'apple','price':300, 'weight':100},
    {'name':'orange','price':200 , 'weight': 50},
    {'name':'banana','price':100, 'weight': 120}
];
```


###関数
```javascript
/**
* @function Array.prototype.pickObj　オブジェクトの配列から要素を抜き出す
*/
if(!Array.prototype.pickObj){
    Object.defineProperty(Array.prototype, "pickObj", {
        configurable: false,
        enumerable: false,
        writable: false,
        /**
        * @string keys　オブジェクトのキー
        * @param patterns 探索する値
        */
        value: function(key,...patterns) {
           return this.filter(e => patterns.includes(e[key]));
        }
    });
}
```

※2018/10/31修正 
上記方法２及び３については、当初、inArray処理を無骨にも以下のように定義していたのですが、ttatsfさんコメントよりArray.prototype.includes (ES2016) を採用しました。

```javascript
const inArray =  (value,array) => [].indexOf.call(array,value) > -1;  //inArrayの定義
```

###処理→出力
```javascript
var objArray = [
    {'name':'apple','price':300, 'weight':100},
    {'name':'orange','price':200 , 'weight': 50},
    {'name':'banana','price':100, 'weight': 120}
];

console.log(objArray.pickObj('price',300)); //価格が300に等しい
console.log(objArray.pickObj('price',100, 200)); //価格が100または200に等しい 
```

###結果
```javascript
{'name':'apple','price':300}
[
    {'name':'orange','price':200, 'weight':50},
    {'name':'banana','price':100, 'weight': 120}
]
```
HerokuとGitHub連携でWebサイトを公開する方法（Node.js可能）

Heroku（へロック）はPaaS（Platform as a Service）と呼ばれるサービスで、
アプリケーションを実行するプラットフォームです。

レンタルサーバーとは少し違いますが、進化系だと考えてみて下さい。

特徴
- （ある一定のトラフィックまで）無料で利用可能　　※突然有料版に切り替わることはないらしいです
　　→個人利用で試したい場合でしたら無料で問題ないかと思います。
- Node.jsが動く
　　→Node.jsが動く手頃な価格のレンタルサーバーって実はあまりありません
- git文化
　　→gitでコミットすることで簡単にサービスを作成できたり、公開まですることができます。
- GitHub連携可能


今回はGitHub連携して、Herokuを使い方法を説明します。

ところで、なぜ連携する？
Herokuのgitを使って、サイト公開することは可能ですが、
ソース管理などの観点から考えると、GitHubでソースを管理し、
Herokuで公開の方が利便性が高いと考えるからです。


次からは、先ず、GitHubアカウント、設定に始まり、
Herokuのアカウント作成、最後に連携までの流れを説明いたします。


## GitHub

1） アカウントの作成（既に作成済みの場合はスキップ）
https://github.com/
にアクセスし、アカウントを作成してください。
詳細はググればすぐにわかるかと思います。

2）リポジトリを作成し、アップするファイルをコミット
ブランチはmasterを想定。


## Heroku

1) アカウントの作成（既に作成済みの場合はスキップ）
https://jp.heroku.com/

2) Heroku CLIのインストール（既に済の場合はスキップ）
https://devcenter.heroku.com/articles/heroku-cli
これをインストールすることでコマンド入力が可能になります。

3) Herokuにログインし、作成。
ターミナルで以下を実行。


```sh:ターミナル
heroku login
```

アカウントIDとパスワードを聞かれるので入力する。
成功するとログインできる。


```sh:ターミナル
heroku create
```

herokuアプリを作成する。自動に生成されたドメインが返って来るので、
そのURLでサイトを公開できます。
herokuはここまででOK。後はGitHubと連携します。


## HerokuとGitHub連携

1) Herokuサイトにアクセスし、作成したherokuアプリをクリック。
Deployタブをクリックし、
Deployment method欄：GitHub
を選択する。

2) これでGitHub連携は完了。
GitHub側でコミットするだけでHeroku側にデータが渡り、サイト更新されます。

2-2) もし、Heroku側でエラーになった場合は、
Settingsタブをクリックし、
Buildpacks欄を選択してください。
こちらの設定は自動で反映される場合もありますが、されない場合もあります。

されてない場合は設定する必要があります。
Node.jsの場合は"Node.js"を選択。
※ここが忘れがちになるので注意が必要です。
Windows10のPython2.7でCythonを動かしてみる 

#はじめに
今[O'ReillyのハイパフォーマンスPython](https://www.oreilly.co.jp/books/9784873117409/)を読んでいるところなのですが、
7章のCythonを動かす際にインストールに手間取ったので、その時のメモをアップします。
（因みに初投稿です。）

#Cythonとは？
Pythonを高速化するためのパッケージ。Pythonコードの一部をC言語に書き換えてコンパイルし、Pythonから読み込めるモジュールを作成してくれる。

#動作環境
Windows10 Home Edition
Anaconda 4.3.30

#手順
###前準備
1. 仮想環境を作成する
上掲書ではPython2系を使用していましたので、それに合わせてPython2.7の仮想環境をcondaで用意します。
自分はAnaconda NavigatorのEnvironmentsから作成しました。ここでは、`cython_py27`という名前を付けました。

2. Cythonをインストールする
続いてEnvironmentsからTerminalを開き、condaでCythonを入れます。
```conda install cython```

3. GitHubからサンプルコードをダウンロードしてくる
上掲書のコードは[こちら](https://github.com/mynameisfiber/high_performance_python)から入手できます。
今回は、7.6節の[Julia集合を高速化するコード](https://github.com/mynameisfiber/high_performance_python/tree/master/07_compiling/cython/lists/1)を使います。

仮想環境をactivateさせたコンソール上でcythonfn.pyx, julia1.py, setup.pyを置いたディレクトリから
`python setup.py build_ext --inplace`
とすれば.pyxファイルがCに書き換えられて.pyファイルから読み込めるようになる…はずなのですが、
デフォルトの状態ではCのコンパイラが入っていなかったため、`error: Unable to find vcvarsall.bat`と表示されコンパイルできませんでした。

###Visual C++をインストールし、PythonにPATHを認識させる

1. Visual C++ for Python2.7をインストールする
Python2.7にはそれ用のCのコンパイラがあったので、まずはそれを[Microsoftのサイト](https://www.microsoft.com/en-us/download/details.aspx?id=44266)からダウンロードしてきます。
ダウンロードが終了したらそのまま実行し、インストールしましょう。
<参考サイト> http://chachay.hatenablog.com/entry/2016/06/06/233734

2. vcvarsall.batファイルの場所を確認する
インストール自体は、どこにファイルを置くか等を一切聞かれずに終了します。
これが実は曲者で、初見ではわかりにくい場所に置かれるうえ、そのままではPythonからも読み取ることができません。
まず、問題となっているvcvarsall.batは
`C:\Users\（user名）\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\`
の中に入っています。
<参考サイト> http://hhsprings.pinoko.jp/site-hhs/2015/02/microsoft-visual-c-compiler-for-python-2-7%E3%81%AF%E3%81%B2%E3%81%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AA%E3%82%89%E3%81%9A/

3. ライブラリdistutilsをいじって上記ファイルを読み込ませる。
setup.pyからimportしているdistutilsのうちの中にあるmsvc9compiler.pyで、使用するコンパイラのPATHが指定できます。
`C:\Users\（user名）\AppData\Local\Continuum\Anaconda3\envs\cython_py27\Lib\distutils/msvc9compiler.py`
これを適当なエディタで開き、下記のサイトに従って書き換えます。
http://chachay.hatenablog.com/entry/2016/06/06/233734
「1. Python 2.7へVisual C++の設定」に従い、関数`find_vcvarsall()`内に以下のコードを挿入してください。
>
```python
vcpath = os.environ['ProgramFiles']
vcpath = os.path.join(vcpath, 'Common Files', 'Microsoft',　'Visual C++ for Python', '9.0', 'vcvarsall.bat')
if os.path.isfile(vcpath): return vcpath
vcpath = os.path.join(os.environ['LOCALAPPDATA'], 'Programs', 'Common', 'Microsoft', 'Visual C++ for Python', '9.0', 'vcvarsall.bat')
if os.path.isfile(vcpath): return vcpatc
```
http://chachay.hatenablog.com/entry/2016/06/06/233734 より

###実行する
ここまで来てようやく実行できるようになりました。
中間ファイルcythonfn.cとともに、.pyから読み込むためのcalculate.pydが生成されます。

```
> python setup.py build_ext --inplace
> python julia1.py 
```

因みに、実行時間(Wall time)は素のPythonから7.07s -> 4.9sまで短くなりました。

#おわりに
いろんなところから情報を拾ってこなくてはならず疲れました。

内容の間違い、用語の使い方の誤り、レイアウトや記法等これ良くないよ・こうした方がいいよとかあったら是非コメントいただけると嬉しいです。

~~それにしても、わざわざWindowsでやる意味あるのかな、、、~~

**※追記・2018年12月16日**
新しい仮想環境作成するたびに上記の作業をしなきゃいけないのが面倒なので、
最近はDockerで作業用Linuxコンテナを作成して動かしてます。
基本`apt-get`と`pip`だけで全部入るのでめっちゃ楽。
そのうちDocker導入～環境構築の方法も記事にします。
（先日注文したMacbook Proが届くまでには書かないと...）
apacheの子プロセスとServerTokensについて

apacheのhttpd.confの子プロセスとServerTokensの設定内容ついて、
(簡単なWEBサーバであれば)あまりデフォルトから変更することはないが
備忘で残します。

## まずは基本的に
- CPUのコアは2以上にするべき。
  - Hyper-Vでサーバ起動するとデフォルトのCPUコアが1なので注意。 
  - アパッチがマルチスレッディングだからマルチコアが必要。

## 子プロセスの設定
- apacheのforkとworkerとは子プロセスの定義である。
  - apacheのforkは子プロセスで１接続処理できる。

```
StartServers       8　#親が起動した時点で起動される子プロセス数
MinSpareServers    5　#httpdがアイドル状態で待機させる数。
MaxSpareServers   20　#親プロセスがアイドルになった時、子プロセスを削除する下限値。
ServerLimit      256　#MaxClientsの設定できる上限。
MaxClients       256　#子プロセスの最大数。これ超える処理はできない。
MaxRequestsPerChild  4000　#１つ子プロセスが処理できるリクエストの数。
```
  - アパッチのworkerとは、子プロセスでn接続処理できる。

## ServerTokensの設定
- クライアントに送り返す Server 応答ヘッダ内に、サーバの一般的な OS 種別や、 コンパイルされて組み込まれているモジュールの情報を 含めるかどうかを指定。
- ざっくり言うと、httpヘッダーやエラー画面に出る情報。
  - ブラウザのinternalError時の画面下に出る「Server:ApacheServer/2.0.41(CentOS)」みたいなやつ。
  - セキュリティ的には「Prod」にした方が良いかと考えられる。

#### ServerTokens Prod
- 表示: Server:Apache

#### ServerTokens Major
- 表示: Server: Apache/2

#### ServerTokens Minor
- 表示: Server: Apache/2.0

#### ServerTokens Min[imal
- 表示: Server: Apache/2.0.41

#### ServerTokens OS
- 表示: Server: Apache/2.0.41 (Unix)

#### ServerTokens Full (もしくは未指定)
  - 表示: Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2


以上。