OmniAICreator/Qiita-1.07M huggingface dataset:
ffmpegによるmp4→mp3変換めも

## webm -> mp4 劣化無変換
```bash
ffmpeg -i input.webm -c:v copy -c:a copy output.mp4
```

## webp -> jpg 一括変換
```bash
find . -type f -name '*.webp' | xargs -P 5 -I{} bash -c 'ffmpeg -i $0 ${0%.*}.jpg' {}
```

## mp3ファイルにカバーアート付ける
```bash
ffmpeg -i audio.mp3 -i thumb.jpg -map 0:a -map 1:v -c copy -disposition:1 attached_pic -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" audio-with-cover.mp3
```

## 動画ファイル(MP4)と字幕ファイル(SRT)の結合
```bash
ffmpeg -i 動画ファイル名.mp4 -vf subtitles=字幕ファイル名.srt 出力ファイル名.mp4
```

## 再生速度変更
```bash:0.5倍速
ffmpeg -i input.mp4 -vf setpts=PTS/0.5 -af atempo=0.5 output.mp4
```

## mp4 -> gifへ変換
```bash:mp4->gif
# カラーパレット使用,10fps,再生速度:0.5倍,無限ループ,切り出し:5秒目から3秒間
ffmpeg -i input.mp4 -vf "fps=10, scale=640:-1, setpts=PTS/0.5, split[a][b]; [a]palettegen[c]; [b][c]paletteuse" -loop 0 -t 3 -ss 5 output.gif
```

## ts -> mp4へ変換
```bash:ts->mp4
ffmpeg -i "concat:index0.ts|index1.ts|index2.ts|index3.ts|index4.ts|index5.ts|index6.ts" -c copy hoge.mp4

# 連番結合 1〜30 ゼロサプレス
ffmpeg -i "concat:`seq -f index-%g.ts -s \| 30`" -c copy hoge.mp4
```

## Webmでopusが読めないって言われた人が読むめも
よくわかってないです。めも
・webmがYoutubeなどで流行っている？
・VLCは、opusを標準非対応？vorbisは対応
・opusが音声圧縮界隈で流行っている？
・webm vl8/9は、opus/vorbisである必要がある。

```bash
# opus抜く
ffmpeg -i "test.webm" -vn -acodec copy "test.opus"

# opus -> vorbis 変換
ffmpeg -i "test.opus" -vn -ac 2 -ar 44100 -ab 256k -acodec libvorbis -f ogg "test.ogg"

# 音声消す
ffmpeg -i test.webm -vcodec copy -an test2.webm

# 映像/音声の結合
ffmpeg -i test2.webm -i test.ogg -map 0:0 -map 1:0 -vcodec copy -acodec copy result.webm

# しょっぱいワンライナー (いい感じにできる人教えてくだせい)
ffmpeg -i "test.webm" -vn -acodec copy "test.opus" && ffmpeg -i "test.opus" -vn -ac 2 -ar 44100 -ab 256k -acodec libvorbis -f ogg "test.ogg" && ffmpeg -i test.webm -vcodec copy -an test2.webm && ffmpeg -i test2.webm -i test.ogg -map 0:0 -map 1:0 -vcodec copy -acodec copy result.webm && rm test.opus test.ogg test2.webm
```

## インストール
```bash
yum -y install ffmpeg ffmpeg-devel
```

## mp3化
```bash:ディレクトリ内一括
find . -type f -name "*.mp4" -print0 | perl -pe 's/\.mp4\0/\0/g' | xargs -0 -I% ffmpeg -i %.mp4 -acodec libmp3lame -ab 256k %.mp3
```

```bash:個別変換
ffmpeg -i hoge.mp4 -acodec libmp3lame -ab 256k foo.mp3
```

## 音量上げる
```bash
ffmpeg -i hoge.mp4 -af "volume=20dB" foo.mp4
```

## 動画切り出し
```bash
ffmpeg -ss [開始地点(秒)] -i [入力する動画パス] -t [切り出す秒数] [出力する動画パス]
```
Nuxt.js + Typescript + Vuexする現時点のベストと思う方法

## はじめに

Vuex + Typescriptは相性が悪いと言われており、色々な解決方法が展開されてきました。
そこにNuxt.jsが入ってくると更に混沌としていて、[以前公式に書かれていたExample](https://nuxtjs.org/examples/typescript-vuex/)のコードも（多分放置されて）いつの間にか消えている始末です。

個人的には [vuex-module-decorators](https://github.com/championswimmer/vuex-module-decorators) を使うのが今の時点では楽だし一番良さそうと思いました。
更に先日[Nuxt.js + モジュールモードでの実装例が公式にREADMEに追加されていた](https://github.com/championswimmer/vuex-module-decorators#accessing-modules-with-nuxtjs)ので、今回はその実装方法を紹介しようと思います。

**移り変わりが早い分野なので、近い将来また違うやり方が良い感じになってるかもしれません。未来に読む人は上記のリンク先も参照お願いします。**

## 追記

Nuxt Typescriptの公式に、Storeの実装方法が追記されていました。
ここに記載のvuex-module-decrotaorsを使う方法も記載されていますが、
SSRモードで使用する場合は2019/11月時点で脆弱性があるそうなのでご注意ください！

https://typescript.nuxtjs.org/ja/cookbook/store.html

### 更に追記

SSRの脆弱性問題について、修正されたようです。
[v0.11.0](https://github.com/championswimmer/vuex-module-decorators/blob/master/CHANGELOG.md#0110) で治ってるようなので、バージョンに気をつけてご利用ください ！！

## 実装方法

### 前提
- [Nuxt.js + Typescriptの設定ができている](https://ja.nuxtjs.org/guide/typescript/)
- [vuex-module-decorators](https://github.com/championswimmer/vuex-module-decorators) がinstallされている

### Store

まず、`store/index.ts`を定義します。これは最初に１回作ったら触りません。
※`~/utils/store-accessor`はあとで作成します

```typescript:~/store/index.ts
import { Store } from 'vuex'
import { initialiseStores } from '~/utils/store-accessor'
const initializer = (store: Store<any>) => initialiseStores(store)
export const plugins = [initializer]
export * from '~/utils/store-accessor'
```

そして、肝心のMy Storeを作ります。
`stateFactory: true` としてexportすることで、NuxtがモジュールモードでStoreを作ってくれます。

```typescript:~/store/feed.ts
import { VuexModule, Module, Mutation, Action } from 'vuex-module-decorators'
import Post from '~/models/Post'

export interface IFeedState {
  posts: Post[]
}

@Module({ stateFactory: true, namespaced: true, name: 'feed' })
export default class Feed extends VuexModule implements IFeedState {
  posts: Post[] = []

  @Mutation
  addPost(post: Post) {
    this.posts = [...this.posts, post]
  }

  @Action
  async loadPosts() {
    const posts = await fetchPosts()
    posts.forEach(post => {
      this.addPost(post)
    })
  }
}
```

### store-accessor

作成したstoreをimportするためのユーティリティを実装します。
storeを新しく追加したときはここに追加していきます。

```typescript:~/utils/store-accessor.ts
import { Store } from 'vuex'
import { getModule } from 'vuex-module-decorators'
import Feed from '~/store/feed'

let feedStore: Feed

function initialiseStores(store: Store<any>): void {
  feedStore = getModule(Feed, store)
}

export { initialiseStores, feedStore }
```

### Component

Component等からstoreにアクセスする時は以下のように書きます。

```typescript
import { Component, Vue } from 'vue-property-decorator'
import { feedStore } from '~/store'

@Component
export default class FeedPage extends Vue {
  get posts() {
    return feedStore.posts
  }

  async created() {
    await feedStore.loadPosts()
  }
}
```

これでType SafeにStoreを利用できます。

これだけです！

### 実装例リポジトリ

最後に上記を実装した完全版のコードを貼っておきます。
https://github.com/suzukenz/nuxt-typescript-demo


以上です！
サードパーティライブラリに依存していたり、accessorのコードがぱっと見気持ち悪かったりが少し気になりますが、Nuxt + Typescript + Vuexの決定版が出てくるまでは自分はこれで突き進んでみようと思います。
初めてのMAYA(1)[備忘録]

##Q.これなに？
A.忘れたときに見返す用です



↓ここまで出来ました
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/8b0b897e-15ec-ffce-ffe2-821478266638.png)
[4分圧縮版(youtube)](https://www.youtube.com/watch?v=vcLKFNfThFM&feature=youtu.be)

#ショートカットキー
####[スペース + 左クリック + カーソル移動]

色々出来すぎて一番困るショートカットキー
とりあえず [MAYA] の部分で [左クリック + カーソル移動] することで画面が切り替えられることだけ覚えておけば大丈夫
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/27de43a8-28a4-38ae-b89c-2555bea0a1c2.png)

####[右クリック + カーソル移動]

オブジェクトをどのように動かすかを変更するやつ
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/774ae021-e024-09b9-7317-4a7b5432c532.png)

####[Shift + 右クリック]
選択しているオブジェクトに対するショートカットで色々なショートカットキーになっている
実際に触って覚えたほうが早い

頂点を選択時に[Shift + 右クリック]
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/289f3a6f-4738-15dc-9503-54f6cbb342f4.png)

エッジを選択時に[Shift + 右クリック]
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/b739d60a-03b7-b4c9-c4fe-e334abbe488a.png)

フェースを選択時に[Shift + 右クリック]
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/af53f406-ae32-a8c6-27f3-2d0229efd4e4.png)

オブジェクトを何も選択していないときに[Shift + 右クリック]
オブジェクトを配置できます
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/07cb1986-b019-d1ce-e6cf-e964b1fb15aa.png)


#参照元
[MAYA超初心者向け 絶対に覚えておきたい作業画面の便利な使い方9選]
(https://modelinghappy.com/archives/11997)
[MAYA超初心者向け 絶対に覚えておきたいモデリングの基本的な操作方法]
(https://modelinghappy.com/archives/11846)
[MAYA超初心者向け 絶対に覚えておきたいモデリングで使う基本操作２]
(https://modelinghappy.com/archives/12061)
[Chara@Maya～Maya 2016で気軽にはじめるキャラクター制作～ 第1回：まずはデザインと素体作り]
(https://www.youtube.com/watch?v=smHFw6XWD7Q)
[第1回：まずはデザインと素体作り]
(https://area.autodesk.jp/column/tutorial/chara_maya/01/)
Hyper-Vの「Default Switch」によるNATとDHCPを活かしつつ固定IPも得る

## 困っていたこと

Hyper-Vの仮想スイッチ設定で `Default Switch`（既定のスイッチ）を利用すると、内部ネットワークだけど外部インターネットにも接続できる状態を簡単に作れるのですが、自動でDHCP接続になってしまい、おまけに何故かサブネットもコロコロ変わってしまうので、SSHやRDPでの接続先が固定できず面倒というデメリットがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112393/471a3b31-68b7-158b-3a96-01956ad19a88.png)

んで、よくよく考えたら仮想マシンなのでNICなんて無限に増やせるわけで、Default Switchとは別に内部ネットワークを一つ生やして、そちらを固定IPにしてあげれば良いと気づきました。というわけでその手順メモです。


分かる人なら秒殺できそうなネタですが、詰まったので一応……

## 環境

Windows 10 Pro 1903

## 手順

### 仮想内部ネットワークスイッチを作る

Hyper-Vコンソールから `仮想スイッチマネージャー→新しい仮想ネットワークスイッチ`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112393/beefac1f-30a2-defd-2023-75223796ff0e.png)

### 仮想マシンにアタッチ

`ハードウェアの追加→ネットワークアダプタ` で、先程追加したスイッチをアタッチ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112393/69a69cc6-3172-eab1-20bf-0d0d154a64ce.png)

↑のようにスイッチが2つある状態になればOK

### ホストOS側で設定を確認

Powershellまたはコマンドプロンプトで `ipconfig` を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112393/317cf28b-4a70-0112-00bb-a36546915464.png)

IPアドレスとサブネットマスクを控えておく

### ゲストOS側で設定

- IP: ホストOSとかぶらないように適宜設定
    - サブネットマスクの設定によるが、後半16ビット (169.254.xxx.xxxのxxxのところ）ならどこでも変えてOK
    - サブネットマスクはホストOSと同じ設定になるようにする

### 動作確認

- ゲストOSからインターネットにつながるか
    - `curl google.com`
- ホストOSに疎通できるか
    - なんか適当なWebサーバ的なのを立てて `curl` する
SNSのタイムラインを埋め込みつつ、Lighthouseのスコアを上げる

# Lighthouseとは

GoogleがOSSとして開発している、ウェブサイト (ウェブアプリ) の品質チェックツールです。

Chromeの拡張機能としてインストールすることができ、ウェブサイトの表示速度やHTMLの構造チェック、JSのライブラリのバージョンによる脆弱性の有無などを教えてくれます。

# SNSを埋め込んだ時の問題点

ウェブサイトを作ると、TwitterやInstagramのタイムラインを埋め込みたくなる時があります。

こういうやつです。(左がTwitter、右がInstagram)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73788/02c46b28-f49b-44d4-fc6b-f56494113872.png)

Twitterの場合はこういうコードを記述するように、という指示です。

```html
<a class="twitter-timeline" href="https://twitter.com/hinatan_net?ref_src=twsrc%5Etfw">Tweets by hinatan_net</a>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
```

中の処理としては、JavaScriptのロードが完了するとiframeが埋め込まれるようになります。

ところが、こういう処理を入れるとロードが重くなり、Lighthouseのスコアが下がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73788/b1c34b7d-38a1-38b4-a168-128376756823.png)

読み込んでいる画像ファイルが大きいだの色々文句を言われます。

# 対策

実際には他の場所の表示が十分早ければ体感速度には問題はないと思っています。
先ほどのLighthouseの結果のスクリーンショットでも、1コマ目からすでに正しくウェブサイトが表示されているので、訪問者がサイトのロードが遅いと感じることは無いでしょう。

ただ、他の遅い場所を調査したかったり、継続的なチェックをしたい場合にはこの原因を放置してスコアが低い状態になってしまうのは目障りです。

そこで、以下のようにJavaScritを埋め込み、タイムライン部分は別ファイルとして遅延読み込みするとOKです。

```html
<script>
$(function(){
  setTimeout(function(){
    $("#timeline").load("/includes/timeline.html");
  }, 5000);
});
</script>
```

一緒に読み込ませるとスコアに影響するから遅延して読み込ませる、というだけの雑な対処療法ですが、これによってスコアがは上がり、他の本質的なチューニングに目を向けることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73788/e28e36e6-5f2d-035f-0cfb-87510b6a8ee1.png)

私の場合、使ってないCSSの箇所が多いから減らせ、とか言われていますね。

実際の動作は[サイト](https://www.hinatan.net/)をみてもらえるとわかると思います。
Terminalから`git push`をするときにハマった話

Terminalから`git push`をした際に、エラーが出てきてしまい困っていたのを解決した話。
結構前に書いた覚書なので、当時なんのエラーが出ていたのかは、あんまり覚えていません・・・。

GitHubに初めてPushする際に、何故か詰まってしまったので、その解決方法を載せておきます。
最初に次のコマンドを動かして、ユーザー名が表示されなかった場合にSSHの設定を行う必要があります。

   ```bash
   $ ssh -T git@github.com
   ```

出力例(成功)
   > ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218112/c7b65bcb-31b9-2acc-f72b-c1aa64322a5e.png)

#### 対処法

1. GitにSSHのアクセス権限を与える

    ```bash
    $ ssh-keygen -t rsa
    $ pbcopy < ~/.ssh/id_rsa.pub # ファイルの内容をクリップボードに貼り付ける
    ```

2. GitのページからSSHキーを設定する。
  * https://github.com/settings/keys
  * Title: 名前を入力する。　自分がわかれば良いので好きに設定する
  * Key: ⑴でコピーしたSSHキー(`pbcopy`でクリップボードにコピーしたもの)を貼り付ける
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218112/66bf3a9b-f02f-ce7b-ae1e-ff30efd67476.png)


3. Gitのリポジトリを追加する

    ``` bash
    $ git remote add origin git@github.com:[ Git ID ]/[ Git Repository ]
    $ git add .
    $ git commit [-m “Commit message”]
    $ git push origin [ Remote branch name ]
    ```

---
#### おまけ
##### 基本的なGitのコマンド

   ```shell
   # マージ済みのブランチを削除する
   $ git branch --delete [ Branch name ]

   # ブランチの強制削除
   $ git branch -D [ Branch name ]

   # リモートの状態を表示する
   $ git remote -v

   # リモートを削除する
   $ git remote rm [ Remote name ]
   ```
WordPressで特定の固定ページが表示されない・・・！って時

表示されないページをドメイン/contactとする

## contactフォルダがある

静的HTMLからの以降だとたまにある時が・・・

## 固定ページに不具合がある

ショートコード埋め込んでたけど、その元のデータがなかった時とか・・・（一度やらかした
蟻本の区間スケジューリング問題をrubyで解いてみる(記録用)

# 問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280727/e5ca3b19-dd00-b0dc-a657-24c02d63421c.png)

# 入力例
5
1 2 4 6 8
3 5 7 9 10

# 回答例
```ruby
count=gets.to_i
starts=gets.chomp.split(" ").map(&:to_i)
ends=gets.chomp.split(" ").map(&:to_i)
se=[]
kijun=0
answer=0
starts.map.with_index{|item,index|
  se[index]=[item,ends[index]]
}
se.sort_by! { |_, b| b }
se.map {|item|
  if kijun<item[0] then
    kijun=item[1]
    answer=answer+1
  end    
}
puts answer


```
各桁を一桁になるまで掛け算する回数の大きい数をRubyで探す

[twitterで話題になってた算数のお題](https://twitter.com/KeikoUTorii/status/1161322092165337088)のやつですが、安直に探すとせいぜい9回程度の数(数千万～数億)しか見つけられません。(11回の数を見つけた小学生凄い!)

### 素因数に注目する
さてどうしたものかと考えると、"各桁の数字を掛ける"という事は1桁の数を掛けていくという事、つまり途中経過は全て1桁の素因数のみを持つ合成数になっているはず(表1)なので、これを探して行くのが速い気がします。

(表1) bruteforceで見つけた9回の数 26888999 を処理して行く様子

|回 |数値     | 素因数分解      |
|---|---------|-----------------|
| 0 |26888999 | 51413 * 523     |
| 1 |4478976  | 2^11 * 3^7      |
| 2 |338688   | 2^8 * 3^3 * 7^2 |
| 3 |27648    | 2^10 * 3^3      |
| 4 |2688     | 2^7 * 3 * 7     |
| 5 |768      | 2^8 * 3         |
| 6 |336      | 2^4 * 3 * 7     |
| 7 |54       | 2 * 3^3         |
| 8 |20       | 2^2 * 5         |
| 9 |0        | 0               |

1桁の素数は2,3,5,7の4つですが、5が混じると一瞬で積が0に収束してしまいがちなので、2,3,7の合成数を探してみる事にしましょう。
探せる範囲で最大回数となる合成数を見つけ出したら、その合成数の1桁の因数を並べてやる事で最大回数+1の数も見つけられる事になります。

### 実装
という訳で以下Rubyで書いた探索コード

```ruby
# 回数算出
def count(n)
  c = 0
  while n >= 10
    m = 1
    while n > 0 && m > 0
      m *= n % 10
      n /= 10
    end
    n = m
    c += 1
  end
  c
end

# 2,3,7の合成数を探索
def search(e2, e3, e7)
  max = 0
  nums = []
  e7.times{|k|
    e3.times{|j|
      e2.times{|i|
        n = (2**i)*(3**j)*(7**k)
        c = count(n)
        if c == max
          nums << [n, i, j, k]
        elsif c > max
          max = c
          nums = [[n, i, j, k]]
        end
      }
    }
  }
  
  # 一番回数が多かった2,3,7の合成数から回数+1となる数を生成
  nums.sort.each{|n, c2, c3, c7|
    puts "#{max}: #{n} = 2^#{c2} * 3^#{c3} * 7^#{c7}"
    m = '2'*c2 + '3'*c3 + '7'*c7
    m = m.gsub(/222/,'8').gsub(/33/,'9').chars.sort.join.sub(/23/,'6').sub(/22/,'4')
    puts "#{max+1}: #{m}"
  }
end

require 'benchmark'
puts Benchmark::CAPTION, Benchmark.measure {
  # 2^29 * 3^29 * 7^9 までの合成数を探索 (てきとう)
  search(30, 30, 10)
}

```

### 結果

```
10: 4996238671872 = 2^19 * 3^4 * 7^6
11: 277777788888899
10: 937638166841712 = 2^4 * 3^20 * 7^5
11: 27777789999999999
      user     system      total        real
  0.031000   0.000000   0.031000 (  0.037331)
```

10回となる2,3,7の合成数がサクっと2つ見つかり、11回となる数を2つ生成できました。
(なお探索範囲を2^199 * 3^199 * 7^199まで広げてみても11回以上になる合成数は見つからず、10回の合成数もこの2つ以外は見つかりませんでした。)

### 他の解法
[Pythonで幅優先探索](https://qiita.com/yutasth/items/b214b825db4361721bfe) by @yutasth
OTTO: mblock3 extension ottodiyブロック

# mblock3用OTTODIYブロック

mblock3 extensionのOTTODIYブロックについて調べたので記録
（セットアップ方法については<https://qiita.com/okamot_dmc/items/6cd6c9da2c44c2db362a>を参照）

![ottodiy_blocks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/725ffc70-af2e-5b2d-b215-3aa222ade073.png)

---

### 0. Otto Program
プログラムの先頭に置くブロック

### 1. Otto init
サーボやブザー等のピン配置を指定。
OTTOマニュアルのピン配置に従っている場合は利用不要

### 2. LEDMatrix
(LED搭載OTTOのみの機能)

### 3. Set Calibrate
サーボモータ初期位置を調整する。
使用方法は"Calibration_mBlock_Program.sb2"を参照。

### 4. move
パラメータは "moveID", "speed"と"moving-size"の３つ。
"movingID"で動きを指定し、"speed"で速さを指定する。
moveIDによっては"moving-size"を利用し、動作量（角度）限界を指定する。

![mblock3_move.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/0ca0d05d-3f24-62ee-5c5e-3cb86847c5ee.png)


#### moveIDリスト1 (moving-size無効)
 -  home: サーボを初期位置にリセット（speedも無効)
 -  forward: 前進（speedで歩く速さを指定)
 -  backward: 後進（speedで歩く速さを指定)
 -  turn left: 左前にターン（speedで歩く速さを指定)
 -  turn right: 右前にターン（speedで歩く速さを指定)
 -  jump: 両footサーボを同時に動かして上下運動
 -  bend left: 右足を浮かして左足のみで立つ
 -  bend right: 上と左右逆
 -  shakeLeg left: 右にボディを傾けて左footを上げ、footを振る
 -  shakeLeg right: 上と左右逆


#### moveIDリスト2 (moving-size有効)
-  updown: moving-sizeで上昇量を調整
-  moonwalker: ムーンウォークのように足を揺らしながら移動。moving-sizeでfootの上げる量を調整
-  swing: 左右にボディを揺らす。 moving-sizeで左右の揺動量を調整
-  crusaito 1: walk(forward)とmoonwalkのmix. forwardよりもfoot角度を上げて左に移動(moving-size範囲: 20-50)
-  crusaito 2: 上と同様（右に移動）
-  flapping 1: jumpのようにfootを上げながら前に進む（進む量はmoving-sizeで調整）
-  flapping 2: flapping 1の後進版
-  tiptoeSwing: 両footサーボを逆に同時に動かして左右と上下に揺動
-  jitter: Legサーボを動かして内股・外股に足を動かす
-  ascendingTurn: jitterのようにLegサーボを動かしてターンする


### 5. gesture
LED Mouthとブザー、サーボを使ってOTTOで感情表現するブロック。
選択肢は以下の通り。

![gesture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/104830e0-9abb-61b1-f6ee-47b1681db21e.png)


### 6. Play sound
ブザーからプログラムされた音を鳴らすブロック。
選択肢は図の通り。
![playsound.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/0e6f52af-8f20-e663-070e-f2c2c1ac05c3.png)

### 7. Play melody
ブザーから指定の音を鳴らすブロック
![playmelody.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/981b147d-b994-ecf5-392d-96a88fb9c0ad.png)


### 8. Show Mouth 
(LED Mouth搭載OTTO用の機能)

### 9. Show Animation Mouth
(LED Mouth搭載OTTO用の機能)

### 10. Clear Mouth
(LED Mouth搭載OTTO用の機能)

### 11. Get Distance
超音波センサで距離を測定する。単位はcm。

### 12. Get Noise
(sound sensor搭載のOTTO用の機能）

### 13. Get Light 
機能なし

### 14. button pressed
機能なし

### 15. serial write text
シリアルで文字列を送信するブロック
teraterm等のシリアル通信アプリに表示できる。

### 16. serial available bytes
シリアルで受信したデータのバイトを読み込むブロック。
下図のように使って受信の判定に利用できる。
![serial_block.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/405a68ac-070b-265e-5220-4d8c6a593169.png)

### 17. serial read byte
シリアル通信で読み込んだデータを持つブロック。
上図のようにsetブロックと併用してデータ用の変数に受け渡す

---
Railsのredirect_toとrenderの違い

##redirect_toとは

redirect_toメソッドはHTTPレスポンスを返し、自動的にページを切り替えるメソッドになります。これによりRailsのコントローラーでURLにリダイレクトさせる処理を書くことが出来ます。

そもそもリダイレクトとは、指定されたURLに自動でアクセスするように返され、リダイレクト先のURLに永続的を示すステータスコード301か一時的を示すステータスコード307かを示すステータス情報を送信します。

##renderとは

renderは文字列、HTML、XML、JSONなどを指定して出力し、主にRailsではコントローラーからviewを呼び出し、画面に表示します。このようにrederは表示するものを指定し画面に表示するメソッドになります。

##redirect_toとrenderの違い

では実際にredirect_toとrenderがどのように違う働きをするのかを見ていきましょう。まず２つのメソッドが実際に画面に表示するまでの動きとして、

・render　　　：　controller　→　view
・redirect_to　：　controller　→　URL　→　route　→　controller　→　view

上の図を見ると分かりますが、renderはコントローラーからそのまま画面を描画します。一方、redirect_toはブラウザでHTTPリクエストを受けたのと同じ処理がされます。

##まとめ

単純に画面の遷移を行う場合はrenderを行い、HTTPリクエストがPOSTでデータを作成、更新、削除を行ったあとに画面を遷移する場合はredirect_toを使うというように使い分けると良いでしょう。
OTTO組み立て

# OTTO組み立て
サマーイベント用にOTTOの組み立て方法を記す

## 1. 部品の確認

下図の部品がそろっていることを確認する。（工具として、＋ドライバ#1、ニッパ、ピンセットを使用する）
（サマーイベントの配布部品はスイッチとDupont connectorは接続済）
（ネジ：M2 5mm x6, M2 8mm x2,  ナイロンワッシャ(内径5mm) x2）

![otto_parts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/da8679c0-0d46-3e27-19f1-a1ae8cf995ce.png)


## 2. サーボのセンター出し

【使用部材】ノートPC, Arduino nano＋拡張ボード、サーボモータx4, ミニUSBケーブル

  - 拡張ボードにArduino nanoを挿す（nanoのピンが曲がらないように注意する）
 
![arduino_board.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/3596660e-222e-8544-caa3-a862b9589689.png)

 - Arduino nano＋拡張ボードにサーボモータをすべて接続する（接続ピンは下図参照(No.2～5を使用)

　　![motor_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/f5a2ba52-c4f7-4970-fdd3-bd486f2a2273.png)

  - arduino.exeを実行し、<\DIY-master\Otto_Footalign\Otto_Footalign.ino>を開く

  - arduino nanoをUSBケーブルでPCに接続する 

  - "ツール"メニューのボードやポート等を設定する（下図参照）
    (シリアルポートが薄いグレーになっている場合は、USBケーブル接続しなおし)
  
　![arduino_footalign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/82216a56-b423-0900-b7da-66b7e28eab11.png)

　- "スケッチ"メニューの"マイコンボードへ書き込み"を選択し、ビルド＆ダウンロード実行

  - 書き込みが成功したらサーボモータが駆動して90°の位置で停止する。センター出し完了。

　- LEGサーボの配線を外す（２つ）

## 3. ボディへのLEGサーボモータ取り付け

【使用部材】ボディ, サーボモータx2, M2 5mmねじx5,  (工具：+ドライバ#1）

![otto_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/b75cf82b-429e-c4f8-f94f-9d2218070211.png)


## 4. ボディへのLEG取り付け、LEGサーボの取り付け

【使用部材】LEGx2, サーボモータx2, サーボホーンx2, ワッシャx2, ねじ(サーボモータ付属品), ニッパーx1, ドライバ

LEG取り付け前にLEGサーボの配線をボディ内に通しておく

![otto_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/d4bca95d-6ecb-8da5-6a25-6040c771bfca.png)

　　ナイロンワッシャをLEGサーボとLEGの間に挟む（図に記載なし）
![otto_leg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/3ca35ae0-8ee1-6c90-d177-8ff6e4a1d446.png)

## 5. LEGサーボネジ止め, FOOTの取り付け

【使用部材】FOOT x2, サーボホーンx2, M2 8mm x2, M2ナット x2, +ドライバ, ピンセット

ネジを取り付けたあと、ピンセットでナットをネジの上に置き、ピンセットの先でまわしてやると簡単です。
（ピンセットで回して少しナットが食いついたら、あとは指でナットを横から軽く押さえながらドライバで絞める）

![otto_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/9871c8fc-411e-0c06-a6c8-a586120cded1.png)



## 6. Headへの超音波センサと拡張ボードの取り付け

【使用部材】Head, Arduino+拡張ボード, M2 5mmネジ x2, +ドライバ

![otto_US.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/7eecdd62-18c7-d097-c18e-8e80686d11c5.png)

![otto_head_board.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/398a9409-4504-2133-1422-3e897fb8eb62.png)


## 7. ボディへのスイッチとブザーの取り付け

【使用部材】ブザー、スイッチ, サーボホーン, ネジ(サーボモータに付属のもの)

スイッチをサーボホーンで取り付ける。ネジはサーボモータ付属のものを使用。
ブザー側はdupontケーブルを直接挿して取り付ければよい。

![otto_buzzer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/48eeb85e-a9b4-6bd8-e19e-d5b166092695.png)


## 8. Arduino拡張ボードとセンサー・アクチュエータの接続

下図のようにセンサ、サーボモータと電池を取り付ける。

![otto_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/f22ed640-3fb4-ea22-dbee-9796db51b554.png)


## 9. 電池のセット

電池をセットしてヘッドとボディを合体させれば完成
vuejsでsuggestフォームを作る1


suggestフォームパッケージを作ってみようと思います
vuejs,Elasticsearchを使っていく予定。npmパッケージ化を目指します

第１回目はDockerにVue.jsの環境をつくるところまで

やりたいこと
---
キーワードを入力していくとキーワード候補エリア、関連エリア（もしかして、、、これ？みたいな）が表示されるやつを作ります
＃既に、こんな素敵なパッケージがあるのでそれを使えばこの話はお終いなんですけど。作りたいのでいいのです
[vue-simple-suggest](https://www.npmjs.com/package/vue-simple-suggest)

ではまずにDockerで環境を作っていきます

Vue.js環境作成
---

#### 1.Dockerfileを作成

```dockerfile:Dockerfile

FROM node:12.8.0-alpine

WORKDIR /app

RUN apk update && \
    npm install -g npm vue-cli

EXPOSE 9000

CMD ["/bin/sh"]
```

#### 2.docker-compose.yamlを作成

```yaml:docker-compose.yaml

version: '3'
services:
  vue_app:
    build: .
    ports:
      - 9000:9000
    volumes:
      - .:/app
    command: /bin/sh
```

#### 3.Makefileを作成

```shell:Makefile
PROJECT = vueSearchSuggest

.PHONY: start
start:
  docker-compose -p $(PROJECT) up -d --build

.PHONY: logs
logs:
  docker-compose -p $(PROJECT) logs -f

.PHONY: restart
restart:
  docker-compose -p $(PROJECT) kill && \
  docker-compose -p $(PROJECT) rm -f && \
  docker-compose -p $(PROJECT) up -d --build

.PHONY: kill
kill:
  docker-compose -p $(PROJECT) kill

.PHONY: ps
ps:
  docker-compose -p $(PROJECT) ps 
```

#### 4.起動
```bash
$ make start
 ```

#### 5.Vue.jsのコンテナに入る

##### プロセス確認
```bash
$ make ps

docker-compose -p vueSearchSuggest ps -a
           Name                        Command              State           Ports
------------------------------------------------------------------------------------------
vuesearchsuggest_vue_app_1   docker-entrypoint.sh /bin/sh   Up      0.0.0.0:9000->9000/tcp
```

##### 起動中のコンテナに入る
```bash
$ docker exec -it vuesearchsuggest_vue_app_1 sh 
```

#### 6.Vue.jsのインストール
```bash
/app # vue init webpack
/app # npm install
```

##### 9000ポート起動に変更
```json:config/index.js
 16 //    host: 'localhost', // can be overwritten by process.env.HOST
 17 //    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
 18     host: '0.0.0.0', // can be overwritten by process.env.HOST
 19     port: 9000, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
```

#### 6.Vue.jsのインストール
```bash
/app # npm run dev
```

http://localhost:9000/
を開いて動作確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10683/49272ebd-7856-0228-456e-5eaaae709009.png)
いつもの起動画面がでてきたらOK


次回はElasticsearchの環境を作っていきます
Rails技術者認定資格試験対策  Rails命名規則まとめ

数日後にRails技術者認定資格試験を受けるにあたって、基本的な部分ではありますがそういった基本を問うような問題も多いと思われるので、改めてRailsの命名規則をまとめたいと思います。

今回はコントーラーやモデルを仮にUserをベースに考えてみたいと思います。

##Controller命名規則

Controllerは複数形になり、UsersControllerになります。この命名規則に従うとresourcesなどのデフォルトのルーティングジェネレータがそのまま利用出来て、名前のルールが決まっているとソースを確認しなくてもrouteファイルにどんどんルーティング情報を書いて行くことが出来ます。

##Model命名規則

Modelは単数形になり、Userになります。モデルには作成するインスタンスの情報を定義する設計書のような役割があり、インスタンスは複数でも設計書は１つなので単数形となる、と覚えます。

##Routingの命名規則

resources :users

複数のルーティングを一度に作成するため複数形と覚えると良いかもしれません。

##データベース関連の命名規則

Railsと関連づけて、データベースの命名規則についても確認しますが、データベースに関してテーブル名、マイグレーションファイル名は複数形になります。データベースは基本的に複数のカラムを持つためテーブル名が複数形になり、そのテーブルを操作するマイグレーションファイルも複数形になると考えます。

##最後に

命名規則は守らないと直ちにエラーが起こるという訳ではなく、実際にも意図があってコントローラー名が単数形になっていたりすることもありますが、せっかくRailsというシステムの恩恵を受けて効率良く開発が出来る部分が大きいと思いますので、よほどの意図がない限りは素直にRailsの命名規則には従った方が良いと思われます。
AlibabaCloudのECSでSSHのポートを変更する

# 問題
AlibabaCloudでECSのインスタンスを立ててsshの設定を行った．

↓sshdの設定

```
# vim /etc/ssh/sshd_config
- #Port 22
+ Port 12345
# systemctl restart sshd
```

↓firewalldの設定

```
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
# vim /etc/firewalld/services/ssh.xml
- <port protocol="tcp" port="22"/>
+ <port protocol="tcp" port="12345"/>
# firewall-cmd --reload
```

↓設定したポートでログイン

```
$ ssh -p 12345 -i ~/.ssh/keyname username@aaa.bbb.ccc.ddd 
ssh: connect to host aaa.bbb.ccc.ddd port 12345: Connection timed out
```

と出力され，ログインできなかった．

# 解決
クラウド未経験だったので気付くのに時間がかかったが，
**ECS管理コンソールのセキュリティグループ**の編集でフォワーディングする．

1. セキュリティグループの画面に移動する．
2. イントラネット入力のタブを選択する．
3. 22/22の項目をクローンする．
4. プロトコルタイプをCustom TCPに変更する．
5. ポート範囲を12345/12345に変更する．
6. 後はお好みの設定を行う．

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422520/7d960180-8d8f-7f78-5e6f-0ddc1a22a9ad.png)
Rails技術者認定資格試験対策 ActionPack

##ActionPackとは
ActionPackはRailsの中でもかなり広範囲にわたる機能を提供している部分の１つです。主な機能としてはジェネレータ、セッションなどで、フラッシュ、ActionViewやキャッシュ機能などもActionPackが提供しています。


##ジェネレータ
ActionPackが提供するジェネレータとしてcontrollerとscaffoldがあります。まずcontrollerのジェネレータコマンドとして、

```shell
rails g controller users
```

というコマンドを実行すると、

```shell
create app/controllers/user_controller.rb
invoke erb
create app/views/user
invoke test_unit
create test/controllers/user_controller_test.rb
invoke helper
create app/helpers/user_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/user.coffee
invoke scss
create app/assets/stylesheets/user.scss
```
 

というように大量のファイルが作成されます。もしこのコマンドを取り消したい時には、以下のコマンドを実行して下さい。

```shell
rails d(またはdestroy) controller users
```

続いてscaffoldの場合を見ていきましょう。scaffoldをジェネレータで作成するコマンドは以下になります。

```shell
rails g scaffold entries
```

こちらのコマンドを実行すると、

```shell
invoke active_record
create db/migrate/20190802064905_create_entries.rb
create app/models/entry.rb
invoke test_unit
create test/models/entry_test.rb
create test/fixtures/entries.yml
invoke resource_route
route resources :entries
invoke scaffold_controller
create app/controllers/entries_controller.rb
invoke erb
create app/views/entries
create app/views/entries/index.html.erb
create app/views/entries/edit.html.erb
create app/views/entries/show.html.erb
create app/views/entries/new.html.erb
create app/views/entries/_form.html.erb
invoke test_unit
create test/controllers/entries_controller_test.rb
create test/system/entries_test.rb
invoke helper
create app/helpers/entries_helper.rb
invoke test_unit
invoke jbuilder
create app/views/entries/index.json.jbuilder
create app/views/entries/show.json.jbuilder
create app/views/entries/_entry.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/entries.coffee
invoke scss
create app/assets/stylesheets/entries.scss
invoke scss
create app/assets/stylesheets/scaffolds.scss
```

controllerをジェネレートした場合より、さらに生成されるファイルが多いです。増えたファイルとしてはモデルファイルや ビューファイルがindex、edit、show、new、_formなど複数生成されていることです。今までなんとなく使っていたrailsのジェネレータコマンドですが元々はActionPackで定義された機能だったのです。

##セッション
セッションとはHTTPとは状態を保持できないステートレスですが、セッションを使うと状態を保持するステートフルに変更することが出来ます。主にログイン情報を保持したりすることにWebアプリケーションでは使われています。これにより、ログインしている状態であることを保持することが出来て、ログインを毎回全て行う手間から解放されます。

問題としてはセッションで情報を識別する際にセッションIDというものを使用するのですが、このセッションIDを第三者に盗まれてしまうと第三者が自分としてログインすることが可能になったり、セキュティ的には注意して実装する必要がある部分になります。
Active Recordまとめ１

##Active Recordとは
Active RecordとはMVCフレームワークにおけるM、モデルに当たる部分で、データとロジックを表します。データベースに保存されたデータは削除しない限りは永続的に保存されます。


##ORMフレームワークとしてのActive Record
ORM=オブジェクト・リレーショナル・マッピングとはアプリケーションがもつオブジェクトをMySQLなどのリレーショナルデータベースのテーブルに繋げることが出来ます。これによってMySQLなどでSQL文を直接記述する必要がなくなり、Rubyでアクセスコードを書くだけでアプリケーションのオブジェクトをデーターベースに保存したり、読み出すことが出来るようになります。またActive Recordの役割として以下のような点もあります。

・モデル同士の関連付け

・関連付けられているモデル間の継承階層を表現

・データをデータベースで保存する前にRailsモデルファイル内でバリデーションを実行

##Active Recordの命名規則
Railsのモデル名は単数形でUser、Newsのように表現するルールですが、テーブル名はusersやpostsなど複数形で名前を作るルールになっている。また語が複数の単語から成り立つ場合、user_advicesのようにアンダースコアで区切られます。

またデータベースのテーブルで使うカラム名の命名ルールとしては主キーの場合はidという名前のintegerカラムがテーブルを作成すると自動で作成され、外部キーを設定する場合は「テーブル名の単数形_id」という名前のidを設定する決まりになっています。よってuser_idやpost_id、user_advice_idといった名前のid名になります。

##Active Recordでのデータの読み書き
Active Recordでのデータの読み書きはCRUDと呼ばれるデータベースを操作する「Create」「Read」「Update」「Delete」メソッドの頭文字を繋げた言葉で表わされます。

・Create …. createメソッドを実行すると新しいオブジェクトが返され、データベースが保存されます。（newメソッドと似ていますがnewメソッドは単にオブジェクトを返すだけです。）

・Read …. データベース内の情報にアクセス出来る。以下は主なアクセスメソッドです。

```ruby
user = User.all                   # 全てのユーザーを返す

user = User.first                 # 最初のユーザーを返す

user = User.find_by(name: 'toda') # todaという名前の最初のユーザーを返す
```

・Update …. オブジェクトの情報を取得して更新することが出来ます。

・Delete …. オブジェクトの情報を取得して削除してデータベースから削除することが出来ます。
Rails技術者認定資格試験対策 ActionView

##始めに

Rails 技術者認定資格を受験するにあたって今回は試験内容であるActionViewの項目をRailsチュートリアルを中心に自分なりにまとめていきたいと思います。ActionViewという言葉は聞いたことがありますが、実際にどの部分がActionViewであるのかも含めて今回は調べていきます。

##ActionViewとは

RailsにおけるWebリクエストはActionControllerとActionViewで扱われます。ActionViewはActionControllerがデータベース処理やCRUD(Create/Read/Update/Delete)アクションを実行したレスポンスをwebページに反映する役割になります。ActionViewはテンプレートとしてデフォルトではERBを使用してビューコードを書くことが出来ます。またgemを組み合わせればERBだけでなく、Slimテンプレートを使用することが出来たりします。

あと自分が実際にActionViewという言葉をよく見かけていたのが、ビューファイルでの入力フォームをスッキリ書けるようにサポートしてくれるtext_field、datetime_selectメソッドなどのフォームヘルパーです。また文字列や日付にもヘルパーが提供されていて、ビューを現在のロケールによって、言語や日時などのローカライズを簡単に行うことが出来ます。またこれらのヘルパーは自分のアプリケーションに応じて機能拡大して独自のヘルパーを作成出来ます。

##テンプレート、パーシャル、テンプレート

ActionViewが提供してくれるビューファイルの要素として、テンプレート、パーシャル、レイアウトがあり、ビューファイルはこれら3つの要素から成り立ちます。

テンプレート....ERBやSlimなどのテンプレートエンジンを利用してビューファイルの中にRubyコードでロジックを埋め込むことが出来ます。テンプレートの種類は拡張子で判断され、.erbや.slimの拡張子でRailsでどのテンプレートを使用しているかを表しています。

パーシャル....ビューファイルが肥大化するのを防ぐためにビューを部分的に分割して、複数のビューファイルで使い回すことも出来ます。よくある例としてはヘッダーやフッター、フォームなどをパーシャルとして分割したりします。またパーシャルファイル名は_form.html.erbのように一文字目を_にすることでパーシャルとして認識され、他のビューファイル内で以下のように記述して呼び出すことが出来ます。

```erb
<%= render "form" %>
```

レイアウト....複数のページで共有のデフォルトデザインを表現するための仕組みで、同じようなデザインの大枠を使い回すことが出来ます。デフォルトではapplicationビューファイルがテンプレートになりますが、applicationをテンプレートとして使いたくない場合は、変更したいページのコントローラー内の上部で、以下のように指定します。

```ruby
layout 'admin_page'
```

##最後に

以上が大まかにはなりますが、ActionViewの全体的な役割になります。実際にはActionViewのフォームヘルパーを使う機会が多いはずですので、業務でよく使用している主要なフォームヘルパーの紹介などを、また別の記事で紹介したいと思います。
vim-surroundでvimmerへの道を極めよう

#はじめに

先日、エディタを VS Code に変更しました。Vim風にコーディングしようと[vscodevim](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)プラグインを導入し、`vim-surround`を有効化し、編集作業がより一層、楽になりました。操作方法を本記事にまとめておきたいと思います。

ちなみに、ターミナル上でVimを起動する場合も同様のプラグインを入れれば本記事のコマンドは使えるようになります、ただし、プラグインのインストール方法は本記事では紹介しておりません。

#vim-surround とは
丸括弧や角括弧などのさまざまな、囲い（surround）を編集する際に役立つプラグイン。
括弧の種類を変えたり、指定した範囲を括弧で囲ったり、括弧の中の文字列を編集したり、と大活躍します。

#vim-sorround 有効化
有効化するための設定ファイルは、下記の位置にあります。
`$HOME/Library/Application\ Support/Code/User/settings.json`
あらかじめ`false`に設定されている場合は、`true`に変更します。

```settings.json
{
    "vim.surround": true,
}
```

#vim-surround の使い方
[e]: existing char(既存の文字)
[d]: desired char（目的の文字）
[mo]: motion（動作）

とする。

| コマンド | 詳細 | 覚え方 |
|:--|:--|:--|
| d s [e] | [e]\(囲い\)を削除  | **d**elete **s**urround |
| c s [e] [d]  | [e]\(囲い\)を[d]\(囲い\) に変更 | **c**hange **s**urround |
| y s [mo] [d] | [mo]\(モーション\)を使って、[d]\(囲い\)で囲む  | **y**ou **s**urround |
| S [d]  | [d]\(囲い\)で囲む（**注： ヴィジュアルモードの時のみ**）  | Sorround(**注: Sは大文字**) |

**motionは`iw`（inner word）、`a'`(all ')など。**
**主に、i(inner)かa(all)の後に、w（word）、'(クォーテーション)などの文字を続ける。**

具体的に確認していきます。

##1. 削除

###1.1 囲いを削除
`ds'`コマンドで囲いの`'(クォーテーション)`を削除
[![Image from Gyazo](https://i.gyazo.com/7aaf8c02efbd7b9e2d34ba1b96bf993a.gif)](https://gyazo.com/7aaf8c02efbd7b9e2d34ba1b96bf993a)
その他、　同じような用例として`ds"`、`ds(`、`ds{`、`dst`なども可能。
`dst`の**t**は\<div\>や、\<p\>などの**HTMLタグ**。

###1.2 囲いの中を削除
`di'`コマンドで囲いの`'(クォーテーション)`の**中**を削除
[![Image from Gyazo](https://i.gyazo.com/2d5136a3330e6f54b0881e6b81123c40.gif)](https://gyazo.com/2d5136a3330e6f54b0881e6b81123c40)
その他、　同じような用例として`di"`、`di(`、`di{`、`dit`なども可能。
`dit`の**t**は\<div\>や、\<p\>などの**HTMLタグ**。

また、**`diw`(delete inner word)は単語を削除するのにかなり重宝します。**カーソルの位置は単語内であればどこでも良い。

##2. 囲いを変更
###2.1 囲いを変更
`cs'{`コマンドで囲いの`'(クォーテーション)`を`{`に変更
[![Image from Gyazo](https://i.gyazo.com/ef5b0f5045be3f3b1aa4874cac1f6a15.gif)](https://gyazo.com/ef5b0f5045be3f3b1aa4874cac1f6a15)
その他、さまざまな括弧の組み合わせで使用可能。
一つ例をあげると、`cs'<p>`でクォーテーションをタグに変更できる。

###2.2 囲いの中を変更
`ci'`コマンドで囲いの`'(クォーテーション)`の中の文字列を変更
[![Image from Gyazo](https://i.gyazo.com/1507be91907472c4ecb644a06f9b5861.gif)](https://gyazo.com/1507be91907472c4ecb644a06f9b5861)

その他、さまざまな組み合わせで使用可能。
また、**`ciw`(change inner word)は単語を変更するのにかなり重宝します。**カーソルの位置は単語内であればどこでも良い。

  

##3. 文字列を囲う⑴
`ysiw'`コマンドで単語を囲む。ここでmotionは`iw`。
`you sorround inner word '`の略だとか。
[![Image from Gyazo](https://i.gyazo.com/e815facb1d14978e349e3251bee90d3d.gif)](https://gyazo.com/e815facb1d14978e349e3251bee90d3d)
その他、
`ys$`で、行末までクォーテーションで囲む、
`ysiw)`で、単語を括弧で囲む、
`ysiw(`で、単語と括弧の間に空白を入れて囲む、
等がある。

##4. 文字列を囲う⑵ ~ヴィジュアルモード~
`viwS"`コマンドで、ヴィジュアルモードに入って(v)、単語を選択して(iw)、ダブルクォーテーションで囲む(S")。
[![Image from Gyazo](https://i.gyazo.com/a5ea589c3f70942849cebdce4da55ca4.gif)](https://gyazo.com/a5ea589c3f70942849cebdce4da55ca4)
要領は、削除、変更などと全く同じ。

#参考

- [Visual Studio | Marketplace](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)
- [Vim風VS Codeカスタマイズ詳細](https://www.kickbase.net/entry/vscode-settings#vim-surround)

#おわりに
一見、コマンドを覚えるのが大変そうですが、コマンドの組み立ては全て同じですので、`ds`、`cs`、`ys`、`S`の4つを使いこなせるようになれば、すぐに他のコマンドにも対応できます。
編集作業がかなり捗りますので、ぜひ試してみてください。

p.s. `di`、`ci`はvim-sorroundを有効にしなくても使えます。
点列から最小二乗法を用いて近似曲線を得る

図形処理やN次元データの解析などにいわゆる幾何的曲線当てはめが有用なので実装してみましょう。

・近似する対象は点列とする。
　　点群から点列への構成が必要な場合は独自に取得してください。

・近似曲線はNUBSとする。(without Rational)
　　もちろんBezier曲線だと曲線セグメントが複数必要になり扱いづらい、
　　また、NUBSのようにノットベクトルで曲率が変化した方が便利です。


・端点条件は近似曲線の出発点、到着点を、点列の開始点と最終点に重ねる条件と、
　端点条件無しの全点列を距離近似の対象にする条件の二つを用意したい。


近似対象の点列　　　　　：　$P_i(i=0,\cdots,np-1)$ npは点の数
階数　　　　　　　　　　：　m
コントールポイント数　　：　n
ノットベクトル　　　　　：　$T=\left[t_0,\cdots,t_{m+n-1}\right]$
近似の為のパラメータ　　：　$\bar{t_i}\quad i=0,\cdots,np-1$
　$\bar{t_i}$はコード長の比やコード長の平方根の比を利用します。
　　$\bar{t_i}=[0,\bar{t}_{i-1}+delta,\cdots,1]$

　　　$delta=\frac{|P_i-P_{i-1}|}{d},\quad d=\sum_{i=1}^{np-1}|P_i-P_{i-1}|$

　　平方根の比の場合は、 $delta=\frac{\sqrt{|P_i-P_{i-1}|}}{d},\quad d=\sum_{i=1}^{np-1}\sqrt{|P_i-P_{i-1}|}$

ノットベクトルは$\bar{t_i}$を反映して設定します。
　$t_0～t_{m-1}=0$
　$t_m～t_{n+m-1}=1$
　$t_{j+m-1}=(1-a)\bar{t}_{i-1}+a\bar{t}_i,\quad j=1,\cdots,n-m$
　それぞれ、
　　$i=int(jd)$
　　$a=jd-i$
　　$d=\frac{np}{n-m+1}$

近似対象の点列$P_i$とパラメータ$\bar{t_i}$における曲線上の点$P(\bar{t_i})$との距離$d_i$の二乗和$f$が最少になるようにコントロールポイント$q_i(i=1\cdots,n-2)$を求めます。

$f=\displaystyle\sum_{i=1}^{np-2}d_i^2=\displaystyle\sum_{i=1}^{np-2}\left|P_i-P(\bar{t_i})\right|^2=\displaystyle\sum_{i=1}^{np-2}\left|P_i-\sum_{j=0}^{n-1}N_{j,m}(\bar{t_i})q_j\right|^2$

$f$を最小化する
$\dfrac {\partial f}{\partial q_k}=\displaystyle\sum_{i=1}^{np-2}\\{-2N_{k,m}(\bar{t_i})R_i+2N_{k,m}(\bar{t_i})\sum_{j=1}^{n-2}N_{j,m}(\bar{t_i})q_j\\}=0$

それでは具体的にはどんな演算をしているのかを例として、
　近似対象の点列中の点毎にどのコントロールポイントセグメントが曲線描画の影響範囲にあるか抽出しておいて、
　コントロールポイント毎に微分係数を抽出していきます。画像では$q_1$のみについて
![approx_δq1過程.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68552/8f436cd7-735c-932a-8137-5dcaca60a3a1.png)

↑ 端点条件無しの場合は、全点列を距離近似の対象にして微分係数をピックアップしていけばいいです。


※参考書物　実践NURBS 著者：三浦曜、望月一正　発行所：工業調査会
Rails技術者認定資格試験対策 ActionMailer

## 始めに
Rails認定資格を受験するにあたって、今回はActionMailerの項目をRailsチュートリアルを中心に自分なりにまとめて行きたいと思います。

##ActionMailerとは
ActionMailerはRails上でメールの送信機能を実装するのに役立ちます。メール送信の機能を実装するためにメイラーとビューを作成していきます。

```schell
rails g mailer UserMailer
```

上記のコマンドでメイラー、ビューファイルを作成します。メイラーはUserMailerとApplicationMailerが作成されApplicationMailerはActionMailer::Baseを継承して作成されます。そしてUserMailerはそのApplicationMailerを継承しています。よって以下のような関係になります。

UserMailer(自分で作成したメイラー名) < ApplicationMailer < ActionMailer::Base

UserMailerファイルではActionMailerのメソッドであるdefaultやmailを使って、

```user_mailer.rb 
class UserMailer < ApllicationMailer

  default: from: 'sample@example.com'
  # 実装したいメールの機能をメソッドとして実装する
  # メール認証によるアカウントの有効化

  def account_activation(user)
    @user = user
    mail to: user.email
  end

  # パスワードの初期化

  def password_reset
    mail to: "user@example.com"
  end

end

```

メールの文章の設定はメイラービューで設定します。上記の「メール認証によるアカウントの有効化」「パスワードの初期化」の文章はそれぞれ、app/views/user_mailerの下にaccount_activation.text.erb、password_reset.text.erbといった名前で文章を設定することが出来ます。こちらのファイルの中に送信したい文章を入力すれば、それぞれのメールが送られるときに処理の内容に沿った文章のメールを送ることが出来ます。

このようにActionMailerの挙動はメイラーをコントローラーと考えると、メイラーはコントローラーによく似ていてメイラーに処理を書いて、メイラー内で定義されたインスタンス変数はメイラービュー内でも使用することが出来ます。
VoTTのActiveLearning機能の紹介

ActiveLearningとは[VoTT v2.1.0](https://github.com/microsoft/VoTT/releases)にて追加された、COCOのObjectDetectionタスクのデータセットで事前学習済みのモデルを用いて、その予測結果を手動アノテーションの代わりとして使うことができる機能のこと。
要するに**我々人類にとって地獄のアノテーション作業を効率化してくれる機能**なのだ！

今回の記事ではタイトル通り、ActiveLearning機能の紹介だけ行うためVoTTをどうやってインストールするとか一切説明しません。
VoTTのインストール方法等使い方の説明をされている記事がありましたので下記にURLを貼っておきます。
[Qiita - VoTT v2.1.0 を使用して画像のアノテーション（教師データの作成）を行う](https://qiita.com/clerk67/items/8e7207284037dcf1f9ec)


# ActiveLearning機能について

今回こちらのサンプル画像[Github - darknet](https://github.com/pjreddie/darknet)に ActiveLearning機能を適用してみます。
<img src="https://raw.githubusercontent.com/pjreddie/darknet/master/data/person.jpg" width=100%>

実際のスクリーンショットを交えて操作の説明と、どういう結果になるのかを紹介していきます。

VoTTの初期設定をした後に下記画面が開くと思います、赤丸で囲った部分にActiveLearningというボタンがありますのでそれを押してみます。
![vott_annotation_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40310/ad64d906-5613-82f2-799a-e5507b37e4f1.png)

モデルのロードに少し時間がかかった後にアノテーション結果が表示されると思います。
![vott_annotation.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40310/0aa0ad4c-6615-b4e0-4b32-8c376898327d.png)

以上になります、読んでいただきありがとうございました。

# 参考

- [Github - VoTT](https://github.com/microsoft/VoTT)
- [Qiita - VoTT v2.1.0 を使用して画像のアノテーション（教師データの作成）を行う](https://qiita.com/clerk67/items/8e7207284037dcf1f9ec)
rspec headless chrome でuser_agentとか指定したい(gem cuprite)

## 経緯
headless chromeの記事は多いけれど、user_agentや、headerを変えたりといった情報がなく、
調べてみるとできなさそうとう感じだった。
https://teratail.com/questions/116731#reply-177465
(間違っていたら教えてほしい)

## 代替手段
`cuprite`というgemを見つけた、日本語情報はほとんどない。
[machinio/cuprite: Headless Chrome driver for Capybara](https://github.com/machinio/cuprite)

macだとREADMEに書いてある通り、chromiumをinstallすれば動いた

circleciだと`-node-browsers`のimageを利用すれば動いた
Font Awesome入門

##Font Awesomeとは

すでに知っている人が多く今更にはなりますが、先日Font Awesomeを初めて触りました。これまでにHTMLのソースファイルを見ていて、何度か「imgタグが見当たらないが、この画像ファイルはどこで設定されているのだろう？」と思うことがありましたが、それらはFont Awesomeというアイコンを文字として扱うことを可能にしたツールを使っていたことが分かりました。

Font Awesomeはアイコンをフォントとして表示してCSSでデザインを設定することも出来るので、特に自分でアイコンを作成したりすることが出来ないプログラマーにとっては、かなり有益なツールになります。アイコンの種類も豊富にあって色を上手く設定したりすれば、かなりのケースのアイコンを表現出来ると考えられます。

##Font Awesomeのアイコン一覧

他にもGoogleが提供しているマテリアルアイコンなどもあり、こういったツールが充実してくれば個人や少人数で開発するプロダクトなどがデザイン的な妥協が少なくなり、質が高いプロダクトが増えそうで楽しみです。

Font Awesomeを表示する際のCSSの設定

Font Awesomeを使用するための設定として、まずはFont Awesomeを読み込まなければいけません。方法が2つあります。

1.CDNを使用する
2.サーバーにデータをアップロードする方法

上記の２種類の方法があります。個人のプロダクトで簡単に試す場合はCDNを使うのが良いでしょう。実際にFont Awesomeのフォントを表示するためのCSSの設定は以下のようになります。

```css
.material a::after {
  content: "\f019"
  font-family: "FontAwesome"
}
```

注意点としてはfont-familyを指定しないと、フォントが未指定とされ□が表示されてしまいますのでご注意して下さい。
Webサーバーが攻撃されていることを検知する目的でもSentryは使える

## Webサーバーが攻撃されていることを検知する目的でもSentryは使える
皆さんはSentryなどのエラー検知ツールを導入していますか？

僕はSentryをRailsアプリケーションに導入しています。
RoutingErrorもメールで通知してくれるので、悪意のあるリクエストがくるとすぐにメールが飛んできます。

Sentryはユーザーの予想外の行動によるエラー検知という役割の他にも、セキュリティ面の向上の役割も持っています。導入しておくと良いでしょう。

## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Rubyのハッシュとシンボルについて

##始めに

普段、仕事でRuby on Railsを使っていています。Railsの使い方は少しずつは慣れてきた部分もありますが、Rubyの言語としての基礎をまだまだしっかり学べていないため、「何となく書いてみて動かなかったら変更してみる」という状態になってしまっている部分もあると自覚しています。

特にシンボル変数などの理解が薄く、Railsの他のコードで:を付けているので何となくシンボル変数にしておこう。という発想でコードを書いてしまっていることもありました。そこで今回シンボルとハッシュについて自分の言葉でまとめていきたいと思います。

##ハッシュとは

ハッシュとはキーと値のセットからなるデータを、管理するオブジェクトのことになります。{ キー1 => 値1, キー2 => 値2, キー3 => 値3 }というように表現され、一対一に対応するデータ構造を扱いたいというような時に使われるオブジェクトになります。今回はキーとして文字列を使用して、コード例としては以下のようになります。

```ruby
test_scores = { 'yamada' => 59, 'takahashi' => 88, 'yoshida' => 95 }
```

##シンボルとは

続いてシンボルとは見た目は文字列に近いですが、文字列と比べて条件式に使う際に高速に処理が出来て内部的にはシンボルは整数として扱われます。またシンボルは同じシンボルであれば同じオブジェクトであるという特徴があり、大量の文字列と大量のシンボルで比較した場合シンボルを使った方がメモリ効率が良くなります。またシンボルはイミュータブルであり、データを途中で変更されたくない場合に適しています。

##ハッシュとシンボルを組み合わせる

先ほどハッシュを作成した際にキーには文字列を使って作成しましたが、キーにはシンボルを使う方が好ましくハッシュのキーをシンボルにして書き直すと以下のようになります。

```ruby
test_scores = { yamada: 59, takahashi: 88, yoshida: 95 }
```

キーをシンボルにした場合、=>を使わず、ハッシュのキー: 値というような形で書くことが出来ます。またコロンが左側から右側に移動します。そして見た目だけでなく、シンボルはイミュータブルなのでハッシュのキーに使う場合、キーが勝手に変更されると困るのでそういった意味でもハッシュのキーにシンボルを使う利点はあります。

こちらのハッシュの書き方はRailsを書いてる時にもモデルのバリデーションの部分などでよく使ってる文法ですね。いかにこれまで意識せずにシンボルを何となく使っていたかが良く分かりました。今後はキーがシンボルのハッシュを書いているという意識を持ってコードを書いていきます。
Node.jsでCloud FirestoreとRealtime Databaseの使い始めメモ


Firebaseをデータベースとして扱おうとした時に、Functionsなどのホスティング環境があってなかなかググラビリティが悪いのでちょっとまとめてみたメモです。機能がどうだってのは触れません。

## Firebaseのデータベースは現状2種類

**Realtime Database**と **Cloud Firestore**があります。

![スクリーンショット 2019-08-15 17.37.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/46b29b6e-4fb8-2637-c966-b52e3dfa7b0b.png "スクリーンショット 2019-08-15 17.37.29.png")

管理画面の項目をまとめるとイメージはたぶんこんな感じ。

![スクリーンショット 2019-08-15 21.03.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/7c7835e3-80ee-061b-26a7-2ef53599e9ca.png "スクリーンショット 2019-08-15 21.03.13.png")

## 接続の仕方がそれぞれ違う

Node.jsの場合、[firebase-admin](https://www.npmjs.com/package/firebase-admin)を使ってアクセスします。

### Realtime Database

`admin.database()`でインスタンス作成。

```app.js
const admin = require("firebase-admin");

const serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://<プロジェクト名>.firebaseio.com"
});

//↑ここまでは共通 ↓ここから記述が分かれる

const db = admin.database();
const ref = db.ref("mytopic");

ref.on("value", function(snapshot) {
    console.log(snapshot.val());
}, 
function(errorObject) {
    console.log("The read failed: " + errorObject.code);
} );
```

### Cloud Firestore

`admin.firestore()`でインスタンス作成。

```app.js
const admin = require("firebase-admin");

const serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://<プロジェクト名>.firebaseio.com"
});

//↑ここまでは共通 ↓ここから記述が分かれる

const db = admin.firestore();
db.collection('mytopic').get()
  .then((snapshot) => {
    snapshot.forEach((doc) => {
      console.log(doc.id, '=>', doc.data());
    });
  })
  .catch((err) => {
    console.log('Error getting documents', err);
  });
```
GPUが使えるXGBoostをWin10にインストールする


# 環境
以下の2つの環境で成功済み

- 1
    - Windows 10 Pro 1809
    - CUDA Toolkit 10.1 update 1
    - Visual Studio Community 2019
- 2
    - Windows 10 Home 1903
    - CUDA Toolkit 10.1 update 2
    - Visual Studio Community 2019


# 事前に入れるもの

- [Visual Studio](https://visualstudio.microsoft.com/ja/downloads/?utm_medium=microsoft&utm_source=docs.microsoft.com&utm_campaign=button+cta&utm_content=download+vs2019&rr=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fvisualstudio%2Finstall%2Finstall-visual-studio%3Fview%3Dvs-2019)
    - これが入っていない場合、CUDAのインストール時にVisual Studioを入れることを強く推奨される
- [CUDA Toolkit](https://developer.nvidia.com/cuda-downloads)
- [Git for Windows（Git Bash）](https://gitforwindows.org/)
- [CMake](https://cmake.org/download/)
    - インストールしてPATHを通しておく

# Visual Studioでコンパイルする場合

## XGBoostのインストール

git bashで以下のコマンドを実行する

```
git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
mkdir build
cd build
cmake .. -G"Visual Studio 16 2019" -DUSE_CUDA=ON
```
（"Visual Studio 16 2019"は手元のVisual Studioのバージョンに合わせる）

GPUを使わない場合は最後の行の`-DUSE_CUDA=ON`をつけないでおく：

```
cmake .. -G"Visual Studio 16 2019"
```



## Python libraryのインストール


以上のコマンドでbuildディレクトリにコンパイルされるので

今度はxgboostディレクトリでpowershellを開いて

```
cd python-package
python setup.py install
```

を実行すればよい。

### XGBoostLibraryNotFound

ここで

```
Traceback (most recent call last):
  File "setup.py", line 22, in <module>
    for libfile in libpath['find_lib_path']():
  File "xgboost/libpath.py", line 50, in find_lib_path
    'List of candidates:\n' + ('\n'.join(dll_path)))
XGBoostLibraryNotFound: Cannot find XGBoost Library in the candidate path, did you install compilers and run build.sh in root path?
```

と言われるときは

```
pip install xgboost
```

をしてから再度`python setup.py install`するとうまくいく場合がある。


## 確認

```
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information. 
>>> import xgboost
>>> xgboost
<module 'xgboost' from 'C:\\Users\\username\\Documents\\xgboost\\python-package\\xgboost\\__init__.py'> 
```

上の例だとxgboostのフォルダをDocumentsに置いており、そこから読み込まれていることがわかる


# 参考

[Installation Guide — xgboost 1.0.0-SNAPSHOT documentation](https://xgboost.readthedocs.io/en/latest/build.html)
#PowerApps における数学 #4

# 前回まで
[#PowerApps における数学 #1](https://qiita.com/h-nagao/items/e5e7a3708ddb5a10ce0e)
[#PowerApps における数学 #2](https://qiita.com/h-nagao/items/18d6919790a747bd34b0)
[#PowerApps における数学 #3](https://qiita.com/h-nagao/items/305b5186274cb35d27d7)

# 第2回の課題解説

>とある点(X,Y)を中心にして、30°おきにきれいに丸を配置するにはどのようにそれぞれのx,yを記述すればよいでしょうか？

第1回で解説した極座標と、第2回の相対位置を組み合わせることで表現できる問題です。

中心の座標(Xc,Yc)は仮にキャンバスの中心```(App.Width/2, App.Height/2)```と設定します。

極座標表示の半径rは、キャンバスからはみ出さないようにしたいので、最大```(App.Height/2-Circle1.Height)```までの値に設定します。今回は300pxにします。

最初の位置(角度θ)を決めれば、あとは30度ずつ足せばいいので、全部で12個のCircleを配置することになります。

```
Circle1.X : Xc+300*Cos(Radians(θ1))
Circle1.Y : Yc+300*Sin(Radians(θ1))

Circle2.X : Xc+300*Cos(Radians(θ1+30*(2-1)))
Circle2.Y : Yc+300*Sin(Radians(θ1+30*(2-1)))
...
CircleN.X : Xc+300*Cos(Radians(θ1+30*(N-1)))
CircleN.Y : Yc+300*Sin(Radians(θ1+30*(N-1)))
...
Circle12.X : Xc+300*Cos(Radians(θ1++30*(12-1)))
Circle12.Y : Yc+300*Sin(Radians(θ1+30*(12-1)))
```

ここでθ1が最初のCircleの位置をあらわします。(今回は中央上に配置するために-90度としています。)
また、Xc,Ycはグローバル変数として 

```
Xc:App.Width/2
Yc:App.Height/2
```

を設定しています。
結果の妥当性を確認するために、半径300pxの円を最背面に配置しました。
![Screen Shot 2019-08-15 at 11.10.43 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/72b8d654-71de-d161-2991-4f96ee9476f5.png)

なんとなく、右下にずれていますね。また各Circleの左上が最背面に置いた円周上に位置していることがわかります。

# 改善方法

各Circleが右にずれているのは、それぞれのX,Yプロパティがオブジェクトの左上をあらわしているからです。
![Screen Shot 2019-08-15 at 11.21.57 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/3a945cf2-896d-3b6c-753f-85c87fafbf42.png)

これを改善するためには、第2回で説明したオブジェクト内部の相対位置を考慮する必要があります。

上のCircle1.X~Circle12.Xであらわした座標は、本来であればCircleの中心がとるはずの座標です。

そしてCircleの中心からCircleの左上は

```
Circle.X : Circle中心.X-Circle.Width/2
Circle.Y : Circle中心.Y-Circle.Height/2
```
とあらわせることを第2回で説明しました。

これを利用すると、結局12個のCircleの(x,y)座標は

```
Circle1.X : Xc+300*Cos(Radians(θ1))-Circle1.Width/2
Circle1.Y : Yc+300*Sin(Radians(θ1))-Circle1.Height/2

Circle2.X : Xc+300*Cos(Radians(θ1+30*(2-1)))-Circle2.Width/2
Circle2.Y : Yc+300*Sin(Radians(θ1+30*(2-1)))-Circle2.Height/2
...
CircleN.X : Xc+300*Cos(Radians(θ1+30*(N-1)))-CircleN.Width/2
CircleN.Y : Yc+300*Sin(Radians(θ1+30*(N-1)))-CircleN.Height/2
...
Circle12.X : Xc+300*Cos(Radians(θ1+30*(12-1)))-Circle12.Width/2
Circle12.Y : Yc+300*Sin(Radians(θ1+30*(12-1)))-Circle12.Height/2
```

このように補正されることがわかります。
この補正はとても重要で、配置したい場所に、オブジェクトを正確に、数式で配置する場合に必ず考慮する必要があるものです。
![Screen Shot 2019-08-15 at 11.22.04 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/c12296a5-b5c0-8f92-9395-7f3902a553a4.png)
![Screen Shot 2019-08-15 at 11.29.07 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/7fc53d5d-3163-413e-57dd-f38db9aeb6d8.png)

# おまけ

Circleを図に変えて、第3回で解説した円運動を用いて観覧車を動かしてみました。
余裕があればトライしてみてください！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">観覧車/Ferris wheel <a href="https://t.co/BN0wPVqeLH">pic.twitter.com/BN0wPVqeLH</a></p>&mdash; Hiro #JSON()Addict (@mofumofu_dance) <a href="https://twitter.com/mofumofu_dance/status/1161985551609675777?ref_src=twsrc%5Etfw">August 15, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
HTMLでjavascriptを使う方法

どうも未来電子でインターンをしているものです。
今回はHTMLでjavascriptを使う方法をまとめたいと思います。
私はプログラミング初心者ですので、間違いがあるかもしれません。
お手柔らかにお願いします。
#もくじ
・インラインスクリプト
・外部ファイル

#インラインスクリプト
htmlないにjavascriptを直接記述することができます。

\<script>\</script>で囲むことで記述できます

```javascript
<script>
console.log("hello world")
</script>

>>>hello world
```


となります。

#外部ファイル
外部のjsファイルを読み込んで使うこともできます。
例えばsample.jsというファイルがあったとすれば


```javascript
<script src="sample.js"></script>
       
```

と記述することで外部ファイル,sample.jsを使うことができます。

#まとめ
以上、HTMLでjavascriptを使う方法をまとめました。