OmniAICreator/Qiita-1.07M huggingface dataset:
宅配弁当を頼んだ話

## はじめに

[琉球大学AdventCalender](https://adventar.org/calendars/5231)18日目の記事です。

今年で晴れて社会人になりました。今年はコロナウィルスの関係で会社もバタバタして、新生活も大きく影響を受けバタバタしました。今回は悩んだ末に日々の食生活を宅配弁当にした話を書きます。個人的すぎて、ほとんどの人には刺さることのない記事だと思います。

## 宅配弁当を頼むまで
### 4月-6月

会社の業務はフルリモート研修で、しかも定時できっちり終わります。私は毎日近所のスーパーに通い、値引きされた具材を購入、料理してました。今思うと心身的な余裕もあって、値引き食材から献立を決めてだいたい月の食費は2万弱で回せていたと思います。大学のころはミーラーだったので、自炊への不安はありましたが不要な心配だったと思っていました。

### 7-9月

研修終了、配属されました。配属されると今までのリモートとは打って変わり基本出社でした。会社まで往復1時間くらいの場所に住んでいるたので、これに伴い日々の生活から1時間を失いました。電車の中で何かやれ！と言う話ですが、基本乗り換えと駅の中を歩く時間です。乗ってる時間は10分くらいですね。スーパーにいく時間もちょっと遅くなりました。この期間の間で徐々に値下がりした食材を買うのをやめ、値下がりお惣菜を買う様になりました。自分で料理するのとお惣菜だと、お惣菜の方が高かったらしく、月の食費は3万をゆうに超える様になりました。お惣菜ばかり買うと栄養がかたよるので、たまに料理もしました。が、1回の食事で準備からご飯たべて片付けまで1時間くらい。しかし私は所詮自炊初心者。時間の割に美味しい料理はできず、この1時間がすごく無駄に感じはじめました。料理するにも労力が必要で、成果（お味）が労力に見合ってませんでした。

### 10月- 12月
かつては毎日スーパーに通っていましたが、これもめんどくさくなりコンビニですますことも多くなりました。コンビニの回数が多くなると月の食費は右肩上がりで、栄養の偏りもかなりのものになってきました。食費は上がってるのに、食に対する満足度は下がっているので抜本的な見直しを検討しました。悩んだ末に宅配の弁当を頼むことにしました。そして今に至ります。

## 宅配弁当にした感想
宅配弁当を手放しでおすすめすることはできませんが、良いこともありました。

### よかったこと
#### 食の時間の短縮
お弁当にしたことで、時間が増えました。以前は朝と夜で1日のうち2時間ほどが食に取られていましたが、弁当にすることで朝と夜で30分にすることができました。結果1時間30分の時間が捻出できました。ゴロゴロできますね。

#### 栄養の改善
人の体は食べたものでできています。宅配弁当は栄養調整されて品目も多いため、コンビニご飯などがメインだったころと比べるとかなり改善されました。

### 微妙なところ
#### 食費の増加
1月の弁当代で４万かかります。会社に出社した時は家の弁当が食べられないため、外で食べることになり１月で合計５万ほど食費でかかっています。友達では2万くらいで済ませている人もいるのでお財布にはきついです。ですが、実の所私の食生活が崩壊しつつあった時でも４万くらいかかっていたので個人的には大幅に増加したわけではありません。

#### 嫌いなものもはいる
１週間分まとめてくるのと、細かく選べないので嫌いな食材も食べるハメになります。当然ながらテンションは下がります。栄養と割り切って食べてます。

#### めちゃくちゃ美味しいわけでもない
残念ながらめちゃくちゃ美味しいわけではありません。私の好きな食材であっても、まあ普通の味です。

## まとめ

ということで、宅配弁当を頼んでみたと言う記事でした。一長一短ですが、個人的には以前とくらべて1日あたり1時間半の時間が捻出できるようになり満足しています。最後に思うことは、「大学のミールは時間もかからないし食費面でもコスパよくて、かなり助けられていたんだぁ」です。
【初心者向け】文字の上揃え、下揃えが効かないときに確認する3つの事

#どうも7noteです。文字の上揃え、下揃えが効かないときに確認する3つの事

`vertical-align: middle;`を使って、文字や画像の上下の位置を上揃えにしたり、下揃えにしたりしたいのに上手く効かない！
そんな時に確認しておきたい3つのポイントをご紹介したいと思います。

## 1. `vertical-align: center;`をブロック要素に効かせようとしている

```style.css
p {
  vertical-align: middle;  /* これは効きません！ */
}
```

基本的に、**インライン要素、ブロック要素（とtable-cell要素）**にしか`vertical-align`は**効きません**
もし間違えてspanじゃなくpタグに書いていた！という場合はそれを直すだけで一発解決かも？

※[ブロック要素かインライン要素かを調べる](http://www.htmq.com/htmlkihon/005.shtml)

## 2. 親要素のflexboxの影響を受けてる

```style.css
p {
  display: flex; /* 親要素にflexboxが効いていると・・・ */
}

p span {
  vertical-align: middle;  /* これは効きません！ */
}
```

親要素で位置を調節しているので、**優先順位が`display: flex;`が優先されてしまい`vertical-align`が効かなくなります。**
併用するときは注意が必要！！


## 3. 揃えたい要素が浮いている


```style.css

p span {
  position: absolute;  /* position: fixed;等も */
  float: left;         /* floatも一緒に使っていると・・・ */

  vertical-align: middle;  /* これは効きません！ */
}

```


イメージとしては**`position: absolute;`や`float`は浮いている状態**なので、浮いているものに対して**`vertical-align`を指定しても効きません。**
こちらも注意しましょう。


## まとめ

初心者の方は結構ひっかかりやすい`vertical-align`の罠ですが、今回紹介したポイントさえしっかり抑えていれば難しいことはないと思います！
ただ忘れやすいので、「`vertical-align`はブロック要素には効かない」っと3回くらい唱えて覚えてもいいかもしれません。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Vue3 Composition API でのVue Routerの使い方

Vue2までのOptions APIでは、`this.$router`のように`this`を介してルーターオブジェクトにアクセスをしていました。しかしながら、Composition APIの`setup`メソッド内では`this`にアクセスすることができません。そのため、今までとは違うアプローチからアクセスする必要があります。

# useRouter()・useRoute()に置き換える

ルーターオブジェクトを得るためには、`vue-rouer`から`useRouter`または`useRoute`関数をインポートします。それぞれの関数は以下のように対応しています。


| Options API | Composition API |
|:-:|:-:|
| this.$router  | useRouter  |
| this.$route  | useRoute  |

```vue

<script lang="ts">
import { defineComponent } from 'vue'
import { useRoute, useRouter } from 'vue-router'

export default defineComponent({
  setup() {
    const router = useRouter()
    const route = useRoute()

    const fetch = () => {
      const { id } = route.params
      store.getTodo(id)
    }
    const goHome = () => {
      router.push('/')
    }

    return {
      goHome,
    }
  },
})
</script>
```

`useRoute()`関数から取得できる`route`オブジェクトは、リアクティブとなっています。

なお、テンプレート内では今までどおり、`$router`、`$route`にアクセスできます。ですから、`router`または`$route`オブジェクトをreturnする必要はありません。

## setupメソッド外からはアクセスすることはできない

先程例示した`goHome`関数は汎用的に使えそうなのでComposition APIの流儀にならって別のファイルに分割してみたいところです。試しに、この関数を`src/composable/router/index.ts`に配置してそこから呼び出すように変えてみましょう。

```src/composable/router/index.ts
import router from '@/router'
import { useRouter } from 'vue-router'

const router = useRouter()

export const goHome = () => {
  router.push('/')
}
```

```somePage.vue
<template>
  <button @click="goHome">トップへ戻る</button>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import { goHome } from '@/composables/router'

export default defineComponent({
  setup() {
    return {
      goHome,
    }
  },
})
</script>

```

ボタンを押してみても、思いに反して反応してくれません。コンソールエラーを見てみると、どうやら`useRouter()`から得た`router`オブジェクトが`undefined`になっているようです。

![スクリーンショット 2020-12-18 22.20.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/9e1ee044-3e36-597b-1a54-05ca499374ec.png)

# コンポーネント内ナビゲーションガード

ナビゲーションガードも同様に、`vue-router`から関数をインポートして使います。

Opsitions APIにおける`beforeRouteEnter`に対応するものは提供されていないようです。

| Options API | Composition API |
|:-:|:-:|
| beforeRouteEnter  | -  |
| beforeRouteUpdate  | onBeforeRouteLeave  |
| beforeRouteLeave  |onBeforeRouteLeave |

```vue
<script lang="ts">
import { defineComponent } from 'vue'
import { onBeforeRouteLeave, onBeforeRouteUpdate, } from 'vue-router'
export default defineComponent({
  setup() {
    onBeforeRouteLeave((to, from) => {
      // 
    })

    onBeforeRouteUpdate((to, from) => {
      // 
    })
  },
})
</script>
```
Next.jsの静的ジェネレーションでデータをfetchできなかった話

# はじめに
Next.jsの静的ジェネレーション getStaticProps内でAPIからデータをfetchしようとしたところエラーが出て調べたけど記事として上がってなさそうだったので自分が解決した方法を載せます。
同じ問題に遭遇した人がこの記事を見て解決に役立てればと思います。

# 事象
ローカル開発環境で、APIのサーバとして [json-server](https://github.com/typicode/json-server)を使いました。
json-serverを立ち上げたときのログです。

```:log
backend_1   | 
backend_1   |   \{^_^}/ hi!
backend_1   | 
backend_1   |   Loading db.json
backend_1   |   Done
backend_1   | 
backend_1   |   Resources
backend_1   |   http://0.0.0.0:80/users
backend_1   | 
backend_1   |   Home
backend_1   |   http://0.0.0.0:80
backend_1   | 
backend_1   |   Type s + enter at any time to create a snapshot of the database
backend_1   |   Watching...
backend_1   | 
backend_1   | GET /users 200 48.743 ms - 355
backend_1   | GET /users 304 6.090 ms - -
```

http://0.0.0.0/users にアクセスするとちゃんと画面が表示されます。

```:画面の表示内容
[
  {
    "name": "aaaaa",
    "password": "password",
    "id": 1
  },
  {
    "name": "aaaaa",
    "password": "password",
    "id": 2
  },
  {
    "name": "daodao",
    "password": "password",
    "id": 3
  },
  {
    "name": "daodao",
    "password": "password",
    "id": 4
  },
  {
    "name": "daodao",
    "password": "password",
    "id": 5
  }
]
```
Next.jsのソースはgetStaticProps内でfetchしています。

```javascript
export async function getStaticProps() {
  const res = await axios.get('http://0.0.0.0/users')
  console.log(res.data)
  const users = res.data

  return {
    props: {
      users
    }
  }
}
```

実行すると`connect ECONNREFUSED`というエラーが表示されました。
![スクリーンショット 2020-12-18 22.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231124/a4c7ae97-36b3-3b49-0123-01e5b3d63852.png)
調べてみると、フロントがサーバとの接続を切断したという意味です。
つまり、リクエストが中断されたということです。

# 仮説
原因を調べたのですが、良い解決策が見つかりませんでした。
なので、自分で仮説を立てて検証することにしました。

getStaticPropsはビルド時に必要なデータをfetchして事前にHTMLを生成し、ユーザのリクエストがあった時に返します。
ローカル開発環境で立ち上げたサーバは自分のコンピュータのみでしかアクセスできないので、Next.jsをビルドするときにグローバルにアクセスできるサーバでないとデータを取得できないのでこのようなエラーが発生するのかなと仮定しました。

# 検証
仮説を検証するために、AWSのEC2インスタンスを立ててその中にjson-serverを配置しました。
その際、json-serverで使用するポートを0.0.0.0/0でどこからでもアクセスできるようにしました。

```javascript
export async function getStaticProps() {
  const res = await axios.get('http://52.196.252.109/users')
  console.log(res.data)
  const users = res.data

  return {
    props: {
      users
    }
  }
}
```

ブラウザで確認すると、console.logで仕込んだログにちゃんとユーザデータが表示されていました。
また、コンポーネントにusersのpropsが渡ってきているのを確認しました。

# まとめ
Next.jsの静的ジェネレーションはサーバがグローバルな環境に置かれていないと、正常にビルドできないと判断し`connect ECONNREFUSED`というエラーを吐き出すようです。
なので、検証するときはサーバをlocalhostではなく、グローバルにアクセスできる環境に置かないと使えないようです。
静的ジェネレーションの仕組みを理解していれば、当たり前といえば当たり前だったかもです。
第11回

\![Ubuntu-20.04.1](<https://img.shields.io/badge/Ubuntu-20.04.1-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。


# やったこと

-   class化


# class化


## お題

以前作ったhello.rbをclass化しましょう


## classの書き方

classは

```ruby
class hogehoge
  def fugafuga
    処理内容
  end
end

hogehoge.new
```

というのが基本形。これに従って改良してみる


## 実践

```ruby
class Greeter
  def initialize
    @name = gets_name
    puts_hello
  end

  def puts_hello
    puts "Hello #{@name}."
  end

  def gets_name
    name = ARGV[0] || 'world'
    return name
  end
end

Greeter.new
```

「Greeter」クラスの中に「initialize」というメソッドがあり、initializeが入力を受け付ける「gets\_name」メソッド、出力を行う「puts\_hello」メソッドを順に呼び出すという塩梅。まあ至ってシンプルですね

```ruby
> ruby hello_class.rb MO_data
> Hello MO_data
```

initializeって名前にすることで、このメソッドをクラス内に記述した時にオブジェクト作成時に自動的に呼び出されるらしい


## 発展問題

hello.rbだけで終わると味気ないのでテキストの発展問題に挑戦。お題は「assert\_equalをclass化せよ」

```ruby
require 'colorize'

class assert_equal
  def initialize
    assert_equal(1,1)
    assert_equal(1,2)
    assert_not_equal(1,2)
    assert_not_equal(1,2)
  end

  def puts_vals(expected, result)
    p ['expected',expected]
    p ['result',result]
  end

  def assert_equal(expected,result)
    puts_vals(expected, result)
    if expected == result
      puts 'succeeded in assert_equal'.magenta
    else
      puts 'failed in assert_equal'.cyan
    end
  end

  def assert_not_equal(expected,result)
    puts_vals(expected, result)
    if expected == result
      puts 'failed in assert_not_equal'.magenta
    else
      puts 'succeeded in assert_not_equal'.cyan
    end
  end
end

assert_equal = assert_equal.new
#+end src
これを実行すると
#+begin_src ruby
codes/assert_equal_class.rb:4: class/module name must be CONSTANT
class assert_equal
```

ん？CONSTANTでないといけない？ドユコト？？？<br>調べるとモジュール名は大文字で始めないといけないらしいので、class名をAssert\_equalに変更すると

```ruby
["expected", 1]
["result", 1]
succeeded in assert_equal
["expected", 1]
["result", 2]
failed in assert_equal
["expected", 1]
["result", 2]
succeeded in assert_not_equal
["expected", 1]
["result", 2]
succeeded in assert_not_equal
```

いけたいけた


# 参考記事

[チャート式ruby-VI(hello class)](<https://qiita.com/daddygongon/items/969ad5112878f6dab844>)



------
 - **source** ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter11.org
challengeだけの世界

これは [Digital Identity技術勉強会 \#iddance Advent Calendar 2020 \- Qiita](https://qiita.com/advent-calendar/2020/iddance) 18日目の記事です。

今年から OAuth とか OIDC とか FIDO とか本格的にやり始めた pinozlo です。好きな拡張はみんな大好き [PKCE](https://tools.ietf.org/html/rfc7636) です。

で、PKCE とか勉強すると「state とか nonce とどう違うの？同じランダム値でしょ？」とか「PKCE で CSRF 防げるなら state いらんやん」とか「nonce でも CSRF 防げるの？なおさら state いらんやん」みたいな道を通るようです。私もなりました。

そして現在策定中の [OAuth 2.1](https://tools.ietf.org/html/draft-ietf-oauth-v2-1-00) では PKCE は MUST になりそうな雰囲気です。やったね！！

## おさらい

まずは state, nonce, PKCE の役割をおさらいしてみましょう

### state

* CSRF を防げる
* PKCE よりも早い段階で検知可能

### nonce

* リプレイアタックを防げる
* CSRF も防げる
* セッションと紐付ければ認可コードインジェクションも防げる

### PKCE

* 認可コード横取り攻撃を防げる
* CSRF も防げる
* 認可コードインジェクションも防げる

## 本題

ここからが本題です。といっても妄想をだらだら書くだけです。PKCE, nonce, state について学んだ人間ならたぶん大体の人は一度は考えたことあるであろう妄想です。

認可リクエストに3つもランダム値なパラメータあるのややこしいですよね。なんとか減らせませんかね？

state と nonce は何か（URL や ID Token）に埋め込まれて比較されるというシンプルな存在です。ある程度のエントロピーが確保されていれば別の値で代用できそうです。

PKCE の code_challenge は code_challenge_method=S256 ならばハッシュなので code_verifier を算出するのは難しいでしょう。露出しても良さそうです。

というか個人的には code_challenge_method=plain はいらないと思っています。第二の ROPC は言い過ぎでも第二の Implict Grtant ぐらいには危険そうです。

そんなわけで code_challenge で nonce や state の代用をしたフローを考えてみましょう。もはや認可コードのためのものにとどまらないので verifier と challenge としましょう。

1. Client は十分なエントロピーの verfier を生成し、ハッシュを challenge としてセッションに紐付けておく
2. Client は challenge と challenge_method を認可リクエストのパラメータとして送信する
3. Server は認可コードを生成し、challenge と紐付けておく
4. Server は ID Token を発行するならば challenge の値を埋め込む
5. Server は認可レスポンスのリダイレクト URL に `challenge=値` のクエリパラメータを付与する
6. Client はクエリパラメータから challenge の値を取得して、セッションに保存されている challenge の値と比較する（CSRF対策）
7. Client は ID Token を取得してログイン処理をするときに challenge の値を取得し、比較して未ログインならば使用済みとして処理する（リプレイアタック対策）
8. Client は認可コードと verifier をトークンリクエストのパラメータとして送信する
9. Server は verifier を challenge_method でハッシュ計算し、値が認可コードに紐付いている challenge と一致するかどうかを検証する（認可コード横取り攻撃対策）
10. Server は ID Token を発行するならば認可コードに紐付いている challenge を ID Token に埋め込む
11. Client は ID Token に埋め込まれている challenge がセッションに保存されている challenge の値と比較する（認可コードインジェクション対策）

とまあ、見た目上はうまくいきそうです。リプレイアタック対策はログイン処理に使用されたときにセッションから削除するのが多いと思いますが、セッション内の challenge が頻繁に使用されるのでどう削除するか？どのようにセッションに保持するか？あたりは工夫が必要そうです。（ハイブリッドフローとの兼ね合いでなんか不都合がありそうな気もしますが）

で、こんなことをして何の得があるのでしょう？ポイントは PKCE が MUST になりそうという点です。

つまり必須パラメータで OPTIONAL なパラメータの代用が出来るなら、 OPTIONAL なパラメータをドロップすることができて少しだけ仕様がスッキリします。

そして必須パラメータなので、常に攻撃に対するチェックがなされるのでトータルとしてのセキュリティの向上が見込めるのじゃないでしょうか？Server と Client が正しく実装されていたらですけど。

あと、URL に露出するので method=plain は自然とドロップになります。ちゃんと RFC 読まないやつはいくら Security Consideration に書いてあっても無視するんですよ。

もちろん1つのパラメータの役割は1つにするというのが基本ですが、こんな妄想もクリスマスに舞う1粒の粉雪として消えていくのもいいのではないかな。自分で言っていて意味がわからないけど。
@〇〇.〇〇.〇〇の読み方[アソシエーション済み]

viewsファイル内の@〇〇.〇〇.〇〇というコード
---

``` videos_controller.rb
class VideosController < ApplicationController

  def index
    @videos = Video.all
  end


  private
  def prototype_params
    params.require(:prototype).permit(:title, :catch_copy, :concept, :image)
    .merge(user_id: current_user.id)
  end
end
```

```videos/show.html.erb
<%= link_to "#{@videos.user.name}", user_path(@videos.user.id), class: 
:media__user %>
```

`"#{@videos.user.name}"`
・videoモデルを通じてvideosテーブルへ移動
・アソシエーションを組んでいるので、mergeしているuser_idを通してusersテーブルへ移動
・usersテーブルの中のnameカラムの値を取得


`(@videos.user.id)`
(video.rbモデル→videosテーブル→usersテーブル→idカラムの値)　を取得
ECRからdocker pullしてコンテナを起動して中身を確認する

Amazon ECRにDockerイメージを保存していて、それをAWS CodePipelineでFargateにデプロイするという構成において、デプロイに失敗した。コンテナがなにかおかしいらしいのでコンテナを確認したい。という状況になり、ECRからDockerイメージを落としてきて確認したくなったが、いつもやりかたを忘れるので備忘録として残しておく。

## ECRからdocker pullする

```
$ docker pull your-aws-account-id.dkr.ecr.ap-northeast-1.amazonaws.com/xxx/yyy/zzz:latest
```

上記コマンドを実行すると認証エラーになった。（イメージのURLはAWSコンソールでECRを選択して選ぶ）

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/Registries.html#registry_auth
ここを確認するとレジストリ認証が必要らしい。


```
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin your-aws-account-id.dkr.ecr.ap-northeast-1.amazonaws.com
```

これでログインする。
aws cli v1ではget-login-passwordがなかったので注意。
事前に環境変数にAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYとAWS_SESSION_TOKENをセットする必要があるかも。

これが成功したら先程のdocker pullを再実行すると成功する。

## docker pullしたイメージを起動する

```
$ docker images
```

まずは上記コマンドでイメージが追加されてることを確認する。

```
$ docker run -it your-aws-account-id.dkr.ecr.ap-northeast-1.amazonaws.com/xxx/yyy/zzz:latest /bin/bash
```

最後に `/bin/bash` と入れることでコンテナ内にbashで入れる。あとはご自由に。
zsh: command not found: ls

こんにちは、ヤマウチです！
windowsユーザーだった僕は、ついに憧れのmacを手にしました。
やったぜ

ということで色々ツールとかダウンロードしてなんかのタイミングでコマンドを打ったら

```shell
zsh: command not found: ls
```

まじかよ

## .zshrcを編集

homeディレクトリに.zshrcがあるかどうか確認しましょう。

```shell
% ls -la ~
zsh: command not found: ls
```

知ってた

ということでfinderでも使って確認してください。
あればそれを、なければ作成して以下の内容を追記しましょう。

```shell
PATH=/bin:/usr/bin:/usr/local/bin:${PATH}
export PATH
```

これでOK。

ということでmacライフを楽しみます＼(^^)／
DataPortal: 新機能さかのぼり（条件付き書式の「日付」と「日付と時刻」）

DataPortalのまだ知らない使えそうな機能を求めて、新機能の一覧を遡ってみました。

条件付き書式の「日付」と「日付と時刻」
> 新しい「日付」と「日付と時刻」フィールドに基づいて、グラフに条件付き書式ルールを追加できるようになりました。

早速試してみます。

### 表
![スクリーンショット 2020-12-18 22.11.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/1e9c6321-c637-ead5-f538-b6fb61f17465.png)

### ピボットテーブル
![スクリーンショット 2020-12-18 21.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/17dfbee2-78cb-6952-fbe5-cd6775a4a60d.png)


日付に基づいて色を変更できました。
多くの情報から、あまり見なくてよいものを視界から除外したり、逆に見てもらいたいものを強調しやすくなりました。
C言語で時間を管理してみた

#はじめに

この記事は、[SLP KBIT Advent Calendar 2020](https://adventar.org/calendars/5402) の18日目の記事です。
あと1週間するとクリスマスですね。

今回は、C言語でタイマーとストップウォッチを作っていきます。


#作成する

###環境
- Windows10
- Visual Studio Code


###タイマーの作成

【 [C言語：指定した秒数経過後にメッセージを表示する](https://torisky.com/c%E8%A8%80%E8%AA%9E%EF%BC%9A%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E7%A7%92%E6%95%B0%E7%B5%8C%E9%81%8E%E5%BE%8C%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99/) 】を参考にしました。

```C:timer.c
		double start, end;
		double total = 0.0, set = 0.0;
			
		char message[] = "時間です！";
			
		printf("タイマーを何秒後にセットしますか？ ");	
		scanf("%lf", &set);
			
		start = clock() / CLOCKS_PER_SEC;
		
		while(1){
			if(total > set){
				break;
			}
			end = clock() / CLOCKS_PER_SEC;
			total = end - start;
		}
		printf("%s\n", message);
```

これを実行すると以下のようになります。
![スクリーンショット 2020-12-18 215910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960577/e117af7a-8e87-1eb5-c158-264b23202b50.png)
(約)3秒後に「時間です！」と表示されました。
次はストップウォッチを作成していきます。


###ストップウォッチの作成

【 [C言語で簡単なストップウォッチのサンプルプログラム](https://pctraveljournal.com/?p=526) 】を参考にしました。

```C:stopwatch.c
		double start, end;
		double total = 0.0, set = 0.0;
			
		char message[] = "時間だよ！";
			
		printf("タイマーを何秒後にセットしますか？ ");	
		scanf("%lf", &set);
		
		start = clock() / CLOCKS_PER_SEC;
		
		while(1){
			if(total > set){
				break;
			}
			end = clock() / CLOCKS_PER_SEC;
			total = end - start;
		}
		printf("%s\n", message);
```

これを実行すると以下のようになります。
![スクリーンショット 2020-12-18 215752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960577/8a47f88c-1bc5-dfe1-df9c-dc1e28e33fcb.png)
Enterキーを押すと経過時間が表示されました。


#完成したソースコード

タイマーとストップウォッチを一つにまとめました。

```C:timekeep.c
	#include <stdio.h>
	#include <stdlib.h>
	#include <time.h>

	int main(void)
	{
		double start, end;
		double total = 0.0, set = 0.0;
		int a, b;
		char message[] = "時間です！";
		
		puts("タイマーを使いますか？ストップウォッチを使いますか？");
		puts("タイマー：1 , ストップウォッチ:2");
		
		do{
			printf("1か2を入力してください：");
			scanf("%d", &a);
			
		}while(a < 0 || a > 2);
		
		if(a == 1){
			/* タイマー */
			printf("\nタイマーを何秒後にセットしますか？ ");	
			scanf("%lf", &set);
			
			start = clock() / CLOCKS_PER_SEC;
			
			while(1){
				if(total > set){
					break;
				}
				end = clock() / CLOCKS_PER_SEC;
				total = end - start;
			}
			printf("\n\n%s\n", message);
		}else{
			/* ストップウォッチ */
			clock_t start, end;
			puts("\nストップウォッチを開始します。");
			printf("止めるときはEnterキーを押してください。");
			
			b = getchar();
			putchar(b);
			start = clock();
			
			b = getchar();
			putchar(b);
			end = clock();
			printf("%.3f秒です。\n", (double)(end - start) / CLOCKS_PER_SEC);
		}
	}
```


#おわりに

C言語でタイマーとストップウォッチを作りました。
タイマーを作る際に音楽が流れるようにしたかったのですが、やり方が分からず断念しました。
次はパソコン内の音楽を流す方法を考えていきます。

また、記事を書くことが初めてで読みづらい文章になってしまいました。
今後はおおくの記事を読んで研究して、読みやすいものを書きます。


#参考にしたもの

- 人生は読めないブログ
[C言語：指定した秒数経過後にメッセージを表示する](https://torisky.com/c%E8%A8%80%E8%AA%9E%EF%BC%9A%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E7%A7%92%E6%95%B0%E7%B5%8C%E9%81%8E%E5%BE%8C%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99/)

- PcTravelJouonal
[C言語で簡単なストップウォッチのサンプルプログラム](https://pctraveljournal.com/?p=526)
[Node.js] Node.jsのフレームワーク「Express」とは……(これから勉強)

#フレームワーク「Express」とは

（私は）初心者なので、Node.jsってなんかカッコイイ！やってみよう！と思うわけです。
それで、フレームワークなるものに「Express」なるものがあることを知るわけですね。

###techacademyさんの記事

[techacademyさんの記事](https://techacademy.jp/magazine/16119 "techacademy")

「Express」とは何ぞや？ということで、検索しますと、上記のtechacademyさんの記事が出てくるわけです。

はい。初心者向けの記事のようですが、（私は）初心者以下だったようで、読んでもわかりません（残念）。

いえいえ、残念がることはありません！学習方法も紹介してくださっているので、これから勉強したいと思いますよ！
sql-migrateを使ってみる

# はじめに
この記事は[ITRC Advent Calendar 2020](https://adventar.org/calendars/5535)の18目の記事です。
前の記事？→　[【Neovim】琴葉葵が教えるおすすめのテキストエディタ【Voiceroid】](https://www.youtube.com/watch?v=hcBGx_dPHhw&feature=youtu.be&ab_channel=%E8%92%B2%E7%94%9F%E8%BE%B0%E5%B7%B3)
こんにちはRIN1208です。今回はsql-migrateを使ってみたら便利だったのでそのお話をしようかと思います。

# 必要環境
- docker-compose
- mac os

上記の環境で説明していきます

# sql-migrateとは？
- SQLite, PostgreSQL, MySQL, Oracleなどの色々なデータベースをサポートしている
- CLIツールまたはライブラリとして使用可能
- go getで取得可能


# 構築する

リポジトリは[こちら](https://github.com/rubenv/sql-migrate)

今回sql-migrateを使用する上で必要なファイルは以下の4つです

- dbconfig.yml
- docker-compose.yml (docker-composeを使用して今回お話しするので)
- Dockerfile　　　（go getでインストールするためgoの環境にしています）
- sqlのマイグレーションファイル


##  docker-compose.ymlを書く

docker-compose.ymlを書いていきます。今回は確認用にphpmyadminを使用しています

```yaml
version: '3.7'
services:
  api:
    build: .
    ports:
      - "8080:8080"
    tty: true
    volumes:
      - ./:/app
    working_dir: /app
    environment:
     - MYSQL_USER=root
     - MYSQL_PASSWORD=root
     - MYSQL_HOST=[mysql]
     - MYSQL_PORT=3306
     - MYSQL_DATABASE=test
  mysql:
    image: mysql:5.6
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --innodb_file_per_table
      --innodb_file_format=BARRACUDA
      --innodb_large_prefix=1
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - 8000:80
    environment:
      - PMA_HOST=mysql
      - PMA_PASSWORD=root
      - PMA_USER=root
      - PMA_ARBITRARY=1
    links:
      - mysql
    depends_on:
      - mysql
```


##  Dockerfileを書く

次にdockerfileを書いていきます

```dockerfile

FROM golang:1.14

RUN go get github.com/rubenv/sql-migrate/...
```

## sqlのマイグレーションファイルを書く
次にsqlのマイグレーションファイルを書きます。ここではsqlをそのまま書く為主キーや外部キーを簡単に設定できます。ファイル名は.sqlのファイルであればなんでも大丈夫です。

```sql
-- +migrate Up
CREATE TABLE IF NOT EXISTS user (
    user_id VARCHAR(128) NOT NULL PRIMARY KEY,
    user_name VARCHAR(128)

);
-- +migrate Down
DROP TABLE IF EXISTS user;
```

## dbconfig.ymlを書く
次にdbconfig.ymlを書きます。ここではsql-migrateのconfigを書きます。


```yml
development:
    dialect: mysql 
    datasource: ${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(${MYSQL_HOST}:${MYSQL_PORT})/${MYSQL_DATABASE}?parseTime=true
    dir: .
```

- dialect  
この部分では使用するDBを選択しています。今回はmysqlを使用するのでmysqlと書いてあります。  
- datasource  
この部分ではmysqlに接続するための情報を記入しています。今回はそのまま書くのではなく環境変数から取得しています。環境変数はdocker-compose.ymlにて定義してあります。
- dir  
この部分では実行するsqlファイルの場所を選択しています。/api/db下に置いてある場合はapi/dbと記入してください。

# 実行してみる
それでは以下のコマンドを実行してマイグレートをしてみましょう。

```
docker-compose exec api bash -c "sql-migrate up"
```
http://localhost:8000/ に接続しphpmyadminで確認無事userテーブルが作成できて入れば成功です。

# 終わりに
ここまで読んでくださりありがとうございます。
sql-migrateが便利だったので今回記事に書きました。
sql-migrateを使おうとしている方の手助けになれば幸いです。
また間違っている点などがございましたらコメントなどで指摘していただけると助かります。
Vim お気に入り追加ショートカット


2d 13h の遅延、申し訳ありません

Vim Advent Calender 2 の 16日目の記事です

## なぜ書いたか

jj -> esc などの非常に使い勝手がよく、手になじむコマンドを広めたい
主に `.vimrc` での設定についてです

## jj to esc

一番 Vim での作業効率が上がるコマンドだと思っている

```
imap jj <Esc>
```

https://vim.fandom.com/wiki/Avoid_the_escape_key

多分ここを見て知った

普段入力する insert mode から カーソルを移動させたり行単位で削除やカット、複製をする normal mode への移動には 
`esc` か `ctrl h` を使っていたが、前者では大きく左上に、後者では少し右下に、左手をホームポジションから浮かせて動かさなければならない。一方　このマッピングで適用した　jj ならばホームポジションのまま右の人差し指を二連打するだけで切り替えができる。
j を二つ使う単語や j で終わる単語があれば困るが、英単語にも日本語にも j が連続する単語はなく、j で終わる単語も

https://www.thefreedictionary.com/words-that-end-in-j

これなどを参考に見てもなさそうで、実際に使っていても遭遇したことがないので、干渉する事はないと思う。

VScode でも

https://github.com/VSCodeVim/Vim

https://github.com/VSCodeVim/Vim/issues/3088

ここを参考に

VScode の preferences -> setting をクリックして setting を開き

![Screen Shot 2021-01-02 at 12.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243383/7e97a015-810c-174c-e8a5-7e569c59af6d.png)

右上のアイコンの右から三番目のファイルマークのアイコンを開き、 設定ファイルを表示して

setting.json に

```json:setting.json
  "vim.insertModeKeyBindings": [
    {
      "before": ["j", "j"],
      "after": ["<Esc>"]
    }
  ],
```

と書けば jj で インサートから ノーマルに抜けられる。
VScode でも非常に便利なのでおすすめ

## cll to console.log()

https://gist.github.com/nervetattoo/3652878

おそらくこちらの gist からコピペして使っていたはず

```vim:
imap cll console.log();<Esc>==f(a
```

js 限定だが、何かと使うことが多いのに入力数が多い `console.log()`

このマッピングをするとホームポジションのまま
左手中指を一段下げて一回、右手薬指をそのままの段で二連打するだけで、`console.log()` の 10文字が打てる。
しかもカーソルが()の内部に入っているのでさらにすぐ中身が書ける。

欠点としては普段 c を入力した後に数フレーム c が入力されずに入力待ちになるのが少し気になるかもしれない。

js で `console.log()` を打つのがめんどくさいと感じている人にはおすすめ

## H/L で行の最初/最後に

これは出典不明です。わかり次第追記します

```
map H ^
map L $
```

H で空白以外の行頭
L で行末 にカーソルを一気に飛ばせる。

h で左に、l で右に移動するのが染み付いてくると、
シフト押しながら H で一気に一番行の左へ！！！！
シフト押しながら L で一気に一番行に右へ！！！！
と直感的でわかりやすい。

ホームポジションから左小指を少し下げるだけで手首の移動なしで入力できる。

## yank と普段のコピーの統一

https://stackoverflow.com/questions/30691466/what-is-difference-between-vims-clipboard-unnamed-and-unnamedplus-settings

この辺を参考にコピペした

Linux, Mac, Win, で異なるので注意。私は Ubuntu でハマった

```vim:
set clipboard=unnamed
```

vim を使っているときに yank する場所と普段のブラウザやエディタのクリップボードは違っている。
全部一つに統一してしまった方が私は捗るのでそうしている

これを適用して、vim でマークダウン書いて gg V G y で全部コピーして Qiita や Notion に CMD V で貼り付けしている

## esc esc to delete search highlight

これも出典が見つからなかった。勉強会で直接教えてもらった記憶がある。

```
nnoremap <Esc><Esc> :nohlsearch<CR>
```

esc esc を No HighLight Search にマッピングする

普通に検索するなり間違えて単語の上で `*` を押すなりすると検索した単語がハイライトされる
VScode などなら x を押せば検索窓が終了してハイライトも消えるが、Vim ではコマンドで消さないと延々と残り続けて目障りなので、すぐに消せるように ESC 二連打にマップすると検索が終わった後に ハイライトを消せて楽。

## まとめ

以上の

```vim:
imap jj <Esc>
```

での jj でのインサート抜け

```vim:
imap cll console.log();<Esc>==f(a
```

での cll での console.log() 

```vim:
set clipboard=unnamed
```

での vim と普段のクリップボードの統一

```vim:
nnoremap <Esc><Esc> :nohlsearch<CR>
```

での esc esc で検索単語のハイライトの解除

が私のおすすめ Vim 追加コマンド(マッピング)でした。
io_uringを使うプログラムはCentOS 8上のDockerでは動かない

Linux kernel 5.1から導入されたio_uringという非同期IOのカーネル機能がありますが、それを使うDockerイメージはCentOS 8で動きませんよと。
知ってる人にはまあ、そうだよねという事ではあるのですが。

Docker/Linuxコンテナのポータビリティは万能ではないんですよと議論したい場合の論拠として。

# io_uring使うプログラムをUbuntu 20.10で作る

１．OSがUbuntu 20.10の仮想マシンを作る。
https://ubuntu.com/download

２．Dockerをインストールする。
https://docs.docker.com/engine/install/ubuntu/

３．Docker上でUbuntu 20.10イメージを起動する。
```# docker run -it --rm --name=io_uring-test ubuntu:20.10 bash```

４．一応、uname -aで利用中のカーネルを確認。
```(c)# uname -a```

```
（実行結果）
root@17003dd74a2f:/liburing/examples# uname -a
Linux 17003dd74a2f 5.8.0-33-generic #36-Ubuntu SMP Wed Dec 9 09:14:40 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```

５．gccとio_uringのライブラリ、gitをインストールする。
```(c)# apt-get update```
```(c)# apt-get install -y build-essential liburing-dev git```

６．io_uringのサンプルプログラムを入手する。
https://blogs.oracle.com/linux/an-introduction-to-the-io_uring-asynchronous-io-framework
```(c)# git clone https://github.com/axboe/liburing.git```

７．サンプルプログラムをコンパイルする。
```(c)# cd liburing/examples```
```(c)# gcc -Wall -O2 -D_GNU_SOURCE -o io_uring-test io_uring-test.c -luring```

８．プログラムを実行する。当然、こちらは動作する。
```(c)# ./io_uring-test io_uring-test.c```

```
(実行結果)
root@08ad6f4c804c:/liburing/examples# ./io_uring-test io_uring-test.c
Submitted=1, completed=1, bytes=2256
```

９．コンテナからデタッチ（C-p, C-q）し、コミット、イメージ保存する。
```# docker commit io_uring-test io_uring-test```
```# docker save io_uring-test -o io_uring-test.tar```

# CentOS 8のDockerでそのプログラムを動かす

１．OSがCentOS 8.3の仮想マシンを作る。
https://www.centos.org/download/

２．Dockerをインストールする。
https://docs.docker.com/engine/install/centos/

３．先のDockerイメージ（io_uring-test.tar）をCentOS 8マシンにコピーし、ロードする。
```# docker load -i io_uring-test.tar```

４．コンテナを起動する。
```# docker run -it --rm io_uring-test bash```

５．一応、uname -aで利用中のカーネルを確認。ホストのCentOS 8と同じ4.18なはず。
```(c)# uname -a```

```
（実行結果）
root@824c737193b6:/# uname -a
Linux 824c737193b6 4.18.0-240.1.1.el8_3.x86_64 #1 SMP Thu Nov 19 17:20:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

（ついでに）
root@824c737193b6:/liburing/examples# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.10 (Groovy Gorilla)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.10"
VERSION_ID="20.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=groovy
UBUNTU_CODENAME=groovy
```



５．サンプルプログラムを動かす。
```(c)# cd liburing/examples/```
```(c)# ./io_uring-test io_uring-test.c```

```
（実行結果）
root@824c737193b6:/liburing/examples# ./io_uring-test io_uring-test.c
queue_init: Function not implemented
```

まあ、動きませんよね、と。
20代後半女性　Web制作・デザインで転職を目指す

# はじめに
はじめまして。
早速ですが、この記事は
**20代後半　女性　未経験　地方　働きながら**
Web制作・デザインを学びエンジニア転職を実現する　ものとなっております！

学習記録などを都度共有しますので、参考になる部分は活用していただけると嬉しいです。


#この記事を書く前
2020年9月〜Progate
　　　10月〜ドットインストール、模写開始

模写に入ったところで、
**「サイトの見た目は合わせることが出来るけど、答え合わせが難しい」
「どこまで何をやればいいの？」
「そもそもの基礎がよく分かっていない」**
など効率を考えるあまり情報の精査に時間を取られしまっていました。

#デイトラ入会・本格的に勉強開始（2020年12月〜）
**「独学では情報の精査などに時間が取られ効率的ではない」
「質問できる環境やコミュニティが欲しい」**
そこで興味のあったデイトラWeb制作・デザインコースに入会しました。

なのでここからはデイトラとともにフロントエンドエンジニア（デザイン含む）
転職を目指していきたいと思います！
なんでボールは勝手に転がるの？

# はじめに
こんにちは　たこといいます。
[LifeisTech!TokaiAdventCalender](https://qiita.com/advent-calendar/2020/life-is-tech-tokai)の12/18用に書きます。

今回はUnityをやっていて、疑問に思っていたけど理由までははっきり分からなかったことを、こういう機会がないとやらないので、自分で調べてみようと思いました。

そのテーマが、RigidbodyのConstraintsとtransform.position、AddForceについてです。

きっかけは下のGIFのように、ボールを矢印キーで動かし、落ちたらスタート地点に戻るという際に、矢印キーを離しているのに勝手に転がってしまうのはなんでなんだろうと思ったからです。
![example.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728526/13b6ba55-0596-f548-7142-75be92125e5c.gif)



これの解決策自体はRigidbodyのConstraintsのFreeze Rotation xとFreeze Rotation zにチェックを入れることで解決するのですが、理由はいまいち分からりませんでした。

そこで今回は、Sphereを以下のような条件(A~F)で場合分けをして調べました。

#実験
・床とSphereを用意
・Sphereを矢印キーで前後左右に動かすスクリプトを用意
・Sphereに、Rigidbodyをつける
・Sphereは最初(0，3，0)の位置にあり再生すると床まで落下し静止

||Sphereの動かし方|Physic Material|
|:--|--:|:--:|
|A|transform.position|なし|
|B|transform.position|あり 　動摩擦力・静止摩擦力1|
|C|transform.position|あり　 動摩擦力・静止摩擦力0|
|D|AddForce　　|なし|
|E|AddForce　　|あり　　動摩擦力・静止摩擦力1|
|F|AddForce　　|あり　　動摩擦力・静止摩擦力0|

そして、各A~Fの条件の下で、RigidbodyのConstraintsの選択を下の表の32パターンにし、Sphereの動きを調べました。(Position yにチェックを入れると始めに落下しないため除外)


||Constraints|の|チェック|を|入れた|項目|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|何もなし|Pos x|Pos z|Pos x,z|Rot x|Rot y|Rot z|
|Rot x,y|Rot x,z|Rot y,z|Rot x,y,z|Pos x Rot x|Pos x Rot y|Pos x Rot z|
|Pos x Rot x,y|Pos x Rot x,z|Pos x Rot y,z|Pos x Rot x,y,z|Pos z Rot x|Pos z Rot y|Pos z Rot z|
|Pos z Rot x,y|Pos z Rot x,z|Pos z Rot y,z|Pos z Rot x,y,z|Pos x,z Rot x|Pos x,z Rot y|Pos x,z Rot z|
|Pos x,z Rot x,y|Pos x,z Rot x,z|Pos x,z Rot y,z|Pos x,z Rot x,y,z|

#結果
ボールを矢印キーでしっかりコントロールでき、落下後もスタート地点で静止させるのに必要な条件はこのようになりました。

・条件A~C（Sphereをtransform.positionで動かす場合）では、少なくともFreeze Rotation x とFreeze Rotation zの二つのチェックを入れる

・条件D,E（SphereをAddForceで動かす場合）の下でうまくいく条件は存在しない

・条件F（SphereをAddForceで動かす場合）の下で少なくともFreeze Rotation x と Freeze Rotaion zの二つにチェックを入れる必要


#他に分かったこと

・条件D~Fで、Freeze Positionにチェックを入れると矢印キーを押しても動かないが、条件A~Cで、Freeze Position にチェックを入れると矢印キーを押したら動く

・条件D,EでFreeze Rotation x と Freeze Rotation zの二つにチェックを入れて再生すると、すごくゆっくり動く

・条件A~Cでは、Physic Materialの有無で結果は変わらなかった

・条件A~Cでは、1のようにぬるっと落ちない場合と、始めのうちはスタート地点に戻った後も原点で停止する
　しかし、2のように落ちるとスタート地点に戻った後も勝手に転がる
###1　ぬるっと落ちない
![notnuru2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728526/34020627-909a-62e7-ddae-0cc20f4d5457.gif)


###2　ぬるっと落ちる
![nuru2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728526/bb67b35a-d14a-3d43-58e6-313846e3a30a.gif)



#考えたこと
Sphereでは、軸が回転することによる力がボールにかかっているため、その力により勝手に動き出すのではないかということを考えました。

・条件A~Cでは、positionを直接動かすので、落ち方によってはあまりSphereが回転せず落下するのでスタート地点に戻った後も静止する　

・条件D~Fでは、力をSphereに加えることで動かすため、左右キーを押すとPositionが左右に動くだけでなく、ｚ軸を回転軸とし回転する力も加わるため左右キーを離しても回転し、力はかかり続ける

そのため、RotationｘとRotationｚにチェックを入れることで、Sphereは回転せず動きます。つまり、回転による力がかからなくなり、矢印キーを離しても動くことはなくなります。

また今回の実験では、SphereをCubeに変えて同じことをしました。
CubeはSphereほど、勝手に転がる現象は見られませんでしたが、条件D~Fの際に、すごくゆっくり動くかまったく動かない状況になり、なぜすべての項目でスムーズに動かなかったのかは新しく疑問に思いました。これはまた考えてみようと思います。


#感想
調べる項目が多くて大変だったけど、少しもやもやしていた所がすっきりしたのでやって良かったと思いました。

ゲームのことを考えると、ボールが矢印キーを離した後も勝手に転がってしまうから落ちないようにコントロールすること自体は面白いと思います。でも、落下してスタート地点に戻ってきてもう一度やろうとしたら、すごいスピードで転がってしまっていては自分でボールを操作できないので、そうしたい場合はリロードしたりすればいいのかなと思いました。

ありがとうございました。
VisualStudioCodeに惚れ込んだわけ

最近思うんですが。
Eclipseうざ。
 [Visual Studio Code Advent Calendar 2020](https://qiita.com/advent-calendar/2020/vscode "Visual Studio Code Advent Calendar 2020
")１８日目です。
なぜEclipseとAtomを捨ててVSCodeにハマったのかを書いていこうと思います。
#EclipseはGCが頻発して使えなかった。
GCとはガーベージコレクションのことです。
正直Eclipseって相当Javaに詳しい人なら使いこなせますが。
一般人には使いにくいものでした。
自分は使い慣れてたので当然チューニングしたんですが。
３ヶ月として持ちません。
３ヶ月に一回Eclipseの総入れ替えをしていました。
マジめんどくさかった。
だけどコードの自動整形機能は最高でしたけどね。
#軽いIDEを求めて
軽いIDEって本当にいいものですよ。
だけどAtomを使ったんですが。
逆に使い物にならず。
プラグイン入れると重くなるし使いようにならなかったです。
もっと軽いものと探し求める毎日でした。
我慢してEclipse使ってましたけどね。
#MSがなにか開発してるらしい
この話を聞いたときに軽いやつだといいけどなぁと思いました。
散々VisualStudioには裏切られてきましたからね。
いつも重いし中に入っているソフトの更新がクソ遅い。
今Gitが使えるようにしなくてはいけないのでVisualStudio2019Commnity入れてますが本と使いようにならない。
C#組むのには最高なんだけどね。
ここで出てきたのがVisualStudioCodeです。
プラグイン入れるだけでいろんなプログラム言語の自動コード整形してくれるしデバッカーは最高だし、しかもターミナル付いてるんですよ。
ここは外そうと思ってはいけない。
つい最近職場でターミナル使わなきゃいけない状況が発生したんです。
ターミナルがVisualStudioCodeについているので速攻でコマンドでSSHでログインしログを調べることができて助かりました。
あと言っておきますがいろんな言語は使えますがプラグイン入れ過ぎちゃあかんです。
Eclipseの最悪なところはプラグインを色々とまとめて入れてくるところ。
VisualStudioCodeは自分で選べてほしいものだけ入れることができます。
マジでこの機能には助けられています。
ちなみにLaravelもPHPもC#もJavascriptもプラグイン入れてます。

そう言えば未だにテキストエディターで書いている人見かけるんですがマジでコードはIDE任せに楽にコーディングしたほうがいいですよ。
#VisualStudioCodeにかけているものは
正直言ってGUI使えるようにしてほしいですね。
殆どコードで書いてしまうので結局ブラウザの出番が来てしまいます。
これが見れるようにしてくれればVisualStuioなんてぽいっと捨てられるのに。
ウルトラワイドほしい理由はVisualStudioCodeでコードを書きながらデバックしたいからです。
これはマジで思ってます。
３４インチのLGの３４インチウルトラワイドモニターまじでほしいですもん。
画面ワケできるし使い勝手良さそうだけど。
昔使ってた勉強机をモニター用にして別のデスクを安く買いたいなぁと思います。
#VisualStudioCodeは開発しやすい
正直思うのですがテキストエディタ・Atom・Eclipseと比べたら断然VisualStudioCodeが勝ってます。
IntelliJ系を入れられると同等になっちゃうんですけどね。
軽いは最高です。
みんなもVisualStudioCode入れてハマっちゃいましょうよ。
ほんと手放せないです。
GitClientとしても使えるらしいですよ。
一時期使ってましたけど遜色なかったですがもっと追加した内容を書きたいんですので残念ながら別物使っちゃいます。
だけど俺はGitはgitkraken派なのでやっぱコードマップが見えるとコンフリクトの解決に役立つんでいいですよ。
しかもしっかりとコードの進捗や改良点が書けるので助かってます。
SourceTreeははっきり言って使えません。
SSHキー何度も要求されて飽きました。
OAuthに対応してると言いながらこれだったのでむかつき倒しました。
おいおいGitクライアントの話になっとるｗ。

そんなところで終わっておきたいと思います。
VisualStudioCodeはWindows・Mac・Ubuntu・Redhat系で使えるので最強です。
マジでハマっちゃいましょう。

明日は[tnk4on](https://qiita.com/tnk4on "tnk4on")さんです。
お楽しみに。
組織らしさを出すためにやっていること

※この記事は、[CyberAgent PTA Advent Calendar 2020](https://adventar.org/calendars/5741)の18日目の記事です。

# はじめに
ABEMAの広告の部署でサーバサイドエンジニアをやってるNakagawaです。
今年やった仕事のことで何か書こうと思ったんですが、思い返すとどれもこれも社外が絡んでることなので、今回は組織運営で取り組んでいることを書こうと思います。

# 背景
広告の部署のエンジニアに求められるスキルってハイトラフィックな配信基盤やログ量の多いデータ基盤を開発できる技術力だけではなく、売上を伸ばすためにあれこれ考えるグロースエンジニアなスキルも求められると思っています。
しかし、広告未経験のエンジニアが加入しても市場動向も分からないし、どうすれば売上伸ばせるの？？？？って状態になると思います。
うちの部署に加入してくる人達も最初はそんな感じです。
なので、せっかくだから皆で切磋琢磨して成長して行こうってやってることを紹介します。

# 業界知識を向上させるためにやっていること
まず、広告の知識や、業界のトレンドを追うためにやっていることです。

* slackに広告の記事が流れるrssチャンネルを作成
* 毎週30分今週の気になるニュースを共有しあう会を開催

## slackに広告の記事が流れるrssチャンネルを作成
広告関連の記事が公開されたこのチャンネルに流れるようにしておけば、新しい人をこのチャンネルに入れるだけでどんなサイトに情報があるかを共有できます。
![スクリーンショット 2020-12-16 16.31.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955584/bf6c7376-f80f-037f-dae7-62505c434a88.png)

## 毎週30分今週の気になるニュースを共有しあう会を開催
最初は業界のトピックが流れてきたとしても、どこに着目すればいいのかが分かりませんよね？
そのために、気になるニュースをあーだこーだ議論してそれが追い風なのか、脅威なのかとかを整理していきます。
この会はエンジニアだけでやるのではなく、営業やプロダクト開発のPdMなども巻き込んでやると視点が広がって良いです。


# 分析力をあげるためにやっていること
次に自分たちのプロダクトを分析する力を向上させるためにやっていることです。

## ダッシュボード作成会
大抵の事業KPIは既にダッシュボード化されていることが多いと思いますが、それをあえて自分たちで再度作ってみたり、ダッシュボード化されてないものを可視化してみる会になります。
本格的なダッシュボードはTableauを使っていますが、ライセンス料が高いのでライセンス料がかからない[Datastudio](https://datastudio.google.com/)を使ってやっています。

これをやることによって、どんなデータがあるのかが見えてきたり、次にどんなデータを可視化してみたいだったりとログに対する意識がかわってるくるのでログの設計力もあがってくれるといいなと思って始めました。

# 切磋琢磨するためにやっていること
最後に、同じ組織に属してるんだから周りの人の目標も把握して互いにサポートしあって成長していこうよってためにやっていることです。

## 隣のやつの成長に責任を持つ会
これは目標のレビュー会と360度評価を組み合わせたものになります。
まずQの最初の月にみんなで今Q注力する目標と、それに対するアドバイスをリストアップします。
![スクリーンショット 2020-12-16 16.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955584/9f6ac9ec-c725-9d32-0de2-2310f6b2de61.png)

Qの残りの月では周りの各メンバーに対して良かった点や感謝したいこと、期待する点や、もっとこうすると良いんじゃないって点をあげてもらいます。
これはなるべくネガティブがワードが出ないように注意が必要です。
お互いに感謝しあってプラスな目線になるようにしましょう。
![スクリーンショット 2020-12-16 16.58.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955584/5cd6b026-288b-2a91-be20-594a159e761b.png)

万が一に備えて匿名性にしています。
これをやることで、上司との1on1だけのFBだけでなく、周りからもFBが得られるので納得感がうまれたり、頑張りが周りにみとめられてるのが可視化しやすくなります。
マネージャーの人達も自分のサポートが足りてるのか足りてないかが分かりやすくなると思います。

# 最後に
うちの部署ではこんなことをやっていますが、皆さんのとこではどうでしょうか？
うちはこれやって効果あったよーってことがあれば教えていただけるとありがたいです。
herokuのログ情報の出力方法

どうも、２０代N高生のゆういちです。

今回はherokuのログ情報について色々調べました。
自分なりに整理して書き上げたので、ちょっと参考にしてみてわからない事があれば他の記事をみながら参考にしていただければと思います！

それでは行きましょう！

## ログの出力方法
通常の出力コマンドは`heroku logs`です。
実行してみると以下のように長文のログ情報が出てきます。

```
$ heroku logs
yyyy-mm-ddT00:00:00.000000+00:00 heroku[router]: at=info method=GET path="/" host=xxx-xxx-xxx.herokuapp.com request_id=xxx...xxx fwd="xxx.xx.xx.xxx" dyno=web.1 connect=1ms service=6ms status=200 bytes=100 protocol=https
```

いきなり数行の長文で何が何だかわからないですよね...
この出力されたログの構成はどうなっているのかというと、上と下とで照らし合わせれば分かるかなと。

```
timestamp source[dyno]: message
```

- timestamp - ログが出力された日時を表す
- source - ログの発生元を表す。今回はherokuアプリケーションを使用しているので、appですね。
- dyno - sourceより細かい発生元。
- message - メッセージを表す

いたって単純ですね！

### ログの出力内容
|ログ情報|意味|
|---|---|
|at|ログの重要度。エラーが発生すると`error`と表示される。|
|method|HTTPメソッドのこと。(GET/POST/PUT/DELETE)|
|path|HTTPリクエストのリクエストターゲットのパスの一部を表す|
|host|HTTPリクエストのHostヘッダの値|
|fwd|クライアントIPアドレス|
|request_id|リクエストID。herokuにおいて、クライアントが送信する際にX-Request-IDヘッダとして設定される。|
|dyno|HTTPリクエストを処理した仮想マシンの名称|
|connect|Dynoへの接続に要した時間(ミリ秒)|
|service|Dyno接続からレスポンスを受け取るまでに要した時間(ミリ病)|
|status|HTTPステータスコード|
|bytes|HTTPレスポンス全体の長さ。|

## リアルタイムでログを出力する
都度出力コマンドを出さなくてすみます。

```
$ heroku logs --tail
```

## 特定のDynoのみ表示する

```
heroku logs --ps api
```

## 特定のソースのみ表示する
```
$ heroku logs --source heroku
```

## ログの行を制限する
デフォルトでは100行表示されます。ログは最大１５００行まで取得されますが、それより超えちゃうと古いログが自動的に破棄されます。

```
$ heroku logs -n 50
あるいは
$ heroku logs --num 50
```

こんな感じ?
慣れたら--tailと--psなどで組み合わせて実行するのもアリです！
ではまた。

## 参考URL
[Herokuでのlogの表示方法 - nafuruby’s diary](http://nafuruby.hatenablog.com/entry/2014/11/12/011636)
[heroku - ログ | heroku Tutorial](https://sodocumentation.net/ja/heroku/topic/8327/%E3%83%AD%E3%82%B0)
firewall設定でsshを開けずにログアウトしてしまった時の対処法

# 対処法
[TIME4VPS](https://www.time4vps.com/linux-vps/) でVPSを立ててfirewall設定をしていた際に、22番ポートを開け忘れて ssh できないことになってしまいました。

使っていたOSは Ubuntu 20.04でした。

firewall設定には ufw を使っていたので色々設定ファイルを漁っていたところ、
`/etc/ufw/ufw.conf` の6行目の `ENABLED = yes` を `no` に変えれば良さそうだったので、

TIME4VPS ならではなのかもしれませんが、OS の再インストールの際に script が流し込めることを利用して、
以下の init script を流し込んだら ufw が無効になり無事に設定し直すことができました！

```jsx
sed -e "6s/yes/no/" /etc/ufw/ufw.conf
```

ufw は結局 iptables の操作をしているものなので Ubuntu以外の場合は iptables の設定を直接いじるのでも良さそうですね
TensorFlowのver2以降でtf.Session()は非推奨

TensorFlowのver2以降ではセッション開始時に以下のような記述をすると非推奨のためエラーになります。

```python
sess = tf.Session()
```

ver2以降で動かすためには以下のように書き換える必要があります。

```python
sess = tf.compat.v1.Session()
```
Flutter メモ　Get

Bookモデルtitleカラムの形

|Book   |title                 |
|----------|--------------------------|

```dart:book_list_model.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'book.dart';

class BookListModel extends ChangeNotifier {
  List<Book> books = [];  //<= このbooks➀が
  Future fetchBooks() async {
    //documentを入手し、docsという変数に代入
    final docs = await Firestore.instance.collection('books').getDocuments();
    //docsをBook型に変換し配列にしなおして、booksという変数に再代入
    final books = docs.documents.map((doc) => Book(doc['title'])).toList();
    this.books = books;　//<= this.booksのbooks➁と連動
    notifyListeners();
  }
}
```

```dart:book_list_page.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'book_list_model.dart';
class BookListPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<BookListModel>(
      create: (_) => BookListModel()..fetchBooks(),
      child: Scaffold(
        appBar: AppBar(
            title: Text('本一覧')
        ),
        body: Consumer<BookListModel>(
            builder: (context,model, child) {
             //modelの中からbooksを取り出し、booksに代入
              final books = model.books; //<= このbooks➂とも連動
              final ListTitles = books.map(
                    (book_tantai) => ListTile(
                      title: Text(book_tantai.title),
                    ),
              ).toList();
              return ListView(
                children: ListTitles,
);}),),);}}
```

`create`で`BookListModel`モデルを呼び出すと同時に、`fetchBooks`メソッドを呼び出す。
呼び出し終わったら`notifyListeners();`をする
その後`Consumer`を回す。


```dart:book.dart
class Book {
  Book(this.title);
  String title;
}
```
CDKでもLambdaのコンテナ対応されていた

# はじめに

タイトルの通りです。[re:invent2020](https://reinvent.awsevents.com/)にて[Lambdaのコンテナサポート](https://aws.amazon.com/jp/blogs/news/new-for-aws-lambda-container-image-support/)が発表されました。
しかしCDKの対応はもう少し先かとおもっていたのですが、どうやら[ドキュメント](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-lambda-readme.html)よりライブラリがアップデートされていました。

# 実装してみる

今回はLambdaのみの実装です。とりあえずデプロイがされてテスト実行が成功すればOKということにします。

Dockerfileと関数は本当に最小限です。

```dockerfile:Dockerfile
FROM public.ecr.aws/lambda/nodejs:12

COPY index.js ./

CMD ["index.handler"]
```

```typescript:index.ts
export const handler = () => {
  console.log('Hello lambda container')
  return { statusCode: 200 }
}
```

後はCDKを実装します。

```typescript:lib/lambda-container-stack.ts
import * as cdk from '@aws-cdk/core'
import * as lambda from '@aws-cdk/aws-lambda'

export class LambdaContainerStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new lambda.DockerImageFunction(this, 'Function', {
      code: lambda.DockerImageCode.fromImageAsset('./lambda'),
    })    
  }
}
```

なんとこれで`cdk deploy`を実行するとDockerビルドとECRへのプッシュを勝手にやってくれるらしいのです。これは楽。
とりあえず結果としてテスト実行すると`console.log`表示ができたので成功かと思います。

```
Hello lambda container
```

# おわりに

かなり短いですが終わりです。[ソースはこちら](https://github.com/ufoo68/lambda-container)で公開しています。これでLambdaの夢が広がりますね。
LaravelでAPIのレスポンスにバリデーションの内容をのせる方法

## やり方

```php
public function test(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'mail' => 'required',
        ]);
        
        // バリデーションエラーの場合は'errors'で内容と箇所を返す
        if ($validator->fails()) {
            return response()->json([
                'errors' => $validator->errors()
            ], 200);
        }

        // 成功
        // 何か処理...
    }
```
Notionでタスクの状態を絵文字で可視化する

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 18日目のエントリです。
17日目は[Notionで締切までの日数をカウントする](https://qiita.com/pictiny/items/bf5ed2d00ac208a7f3a2)でした。

# 日付の計算
プロパティの値を使って何か計算をする場合、 `Formula` というプロパティタイプを使います。
`Formula` の式では、絵文字を使うことができます。

## 絵文字による可視化
締切が過ぎていないタスクは 😊 、締切が過ぎたタスクは 😵 を表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/ab885be6-e416-1a10-6671-f7befde3567f.png)

計算式は以下のようになります。

```c
if(prop("締切までの残り日数") > 0, "😊", "😵")
```

# まとめ
Formulaの式には絵文字を使うことができます。

公式ドキュメントは[Formulas](https://www.notion.so/Formulas-28f3f5c3ae644c59b4d862046ea6a541)にありますので、そちらもご覧ください。
【Ruby】変数の命名ルールについて。定数、クラス、メソッドの命名規則も。

個人メモです。

JSでは変数の定義時に`let`, `const`など宣言があるが、rubyでは特に宣言がなく、区別方法を調べてみたのでそのまとめ。

| 対象 | 命名規則 | 実例 |
|:-:|:-:|:-:|
| 変数  | 小文字。アンスコでつなげる  | product_name  |
| 定数  | すべて大文字。アンスコでつなげる  | PLODUCT_PRICE_LIST  |
| クラス  | 冒頭だけ大文字。キャメル  | ProductCategory  |
| メソッド  | 小文字。アンスコでつなげる  | show_price_list  |


定数はすべて大文字なので区別しやすい。
ハイフンは使わない。
Next.jsでFOUCが起きたりscriptが動かない場合

# 概要
next.jsで作った一部のページで、遷移後にCSSが一瞬効いてなくてチラつく `FOUC(Flash of Unstyled Content)` が起きたり、JavaScriptの処理が動いていない問題が起きた

# 条件
よく調べると、起きる条件は

JS処理が動いていない場合、動いていない処理は別リポジトリにあるHTMLを[raw-loader](https://webpack.js.org/loaders/raw-loader/)で引っ張ってきて `dangerouslySetInnerHTML` で埋め込んでいた中にあるscriptタグのものだった

CSSがFOUCする場合は

```jsx 
<Head>
  <link rel='stylesheet' href='/hoge.css' />
</Head>
```

のようにアセットを[next/head](https://nextjs.org/docs/api-reference/next/head)タグ内で読んでいた

そして、それらのページへ[next/link](https://nextjs.org/docs/api-reference/next/link)で遷移していることだった

# 原因
next/linkを使った遷移はSPA的なクライアントサイド遷移であり、ページを0からロードせず、マークアップの差分だけ変更される
JSが動かないことに関しては、React.jsはdangerouslySetInnerHTMLで挿入されたscriptタグが実行されないことが原因
CSSがFOUCすることに関しては、next/linkでの差分変更時にCSSの取得と適用よりもbodyが変更されることが圧倒的に速いからと思われる
（ちなみにnext/linkはprefetchがありdefault:trueだが、これのtrue/falseはFOUCには関係なかった）

# 解決策
そのような構成になっているページへの遷移にnext/linkを使うのをやめ、aタグを使い、0からロードさせる

# 学び
そのような構成のページはSPA（向き）ではないので、クライアントサイド遷移でSPAとして作るためのnext/linkを使うのは間違っていた

# しかしなんでnext.jsでそんなことを…？
他者が作り、ほぼ出来上がってるHTML+CSS+JSを使って若干機能を追加したページを表示する必要があったので
ZohoCRMカスタム関数でちょっぴり幸せになろう

こんにちは、まめぞうです。
今回はZohoCRMのカスタム関数でちょっぴり幸せになろうということで、カスタム関数を使って自動化して幸せになろうぜという話です。

普段からZohoCRMを使っているけれど、なんかイマイチ使いこなせていないなぁという方は必見です！

#カスタム関数とは
Excelのマクロみたいな感じ。プログラムを書いて、データの更新や外部との連携など自動化できる優れものです。
ワークフローに紐付けたり、商談プロセスを自動化できます。

#どういったときに使えるの？
- 粗利や売上の自動計算
- 発注書から見積書や請求書を作成
- 条件に合わせて項目を自動で更新またはメール送信
- 住所の自動変換
- タスクの自動生成やアラート関連

モノは使いようです。設定によっては化けます。

# チャレンジした方が良い人
- 商談の金額計算ロジックが複雑で手計算している人。
- CRMなどでデータが滅茶苦茶になってしまった人。
- 手動でやってるけど「これ簡単に自動化できるやろ」と日々ストレスが溜まっている人。

#注意点
カスタム関数は万能ではありません。特徴として、トランザクション処理に特化しており、集計などの大量のデータを扱う処理は苦手です。

#実際にやってみよう（住所変換機能）
では、郵便番号を入力して、住所を番地まで記載するカスタム関数を実装してみましょう。
今回はボタンとして「見込み客タブ」に作成します。
1. ボタンの作成へ移動する<br>設定→カスタマイズのタブ＆項目→見込み客→リンクとボタン→新しいボタン
2. ボタンの作成<br>ボタンの名前を入れ、「ページの編集」へ配置、ユーザーがクリックした時「関数の作成」を選択
3. 引数設定<br>`LeadId : int`（見込み客のID）<br>`ZipCode : string`（郵便番号）
4. 以下コードをコピペ

```deluge:StreetAdressSync.dg
zipRes = getUrl("http://zipcloud.ibsnet.co.jp/api/search?zipcode=" + ZipCode);
prefecture = zipRes.executeXPath("/root/results/address1/text()");
city = zipRes.executeXPath("/root/results/address2/text()");
street = zipRes.executeXPath("/root/results/address3/text()");
mp = Map();
mp.put("State",prefecture);
mp.put("City",city);
mp.put("Street",street);
resp = zoho.crm.updateRecord("Leads",LeadId,mp);
return "住所を自動入力しました。";
```

見込み客のAPI名によって異なってくるのですが、デフォルトだと上のままで大丈夫です。
また、今回郵便番号から住所情報を取得するために外部のAPIを使用しています。
・郵便番号検索API
http://zipcloud.ibsnet.co.jp/doc/api

いかがでしたでしょうか。
他にも以下サイトを参考に是非カスタム関数でちょっぴり幸せになってくださいね。

その他参考できる記事
・ワークフロールールでのカスタム関数の関連付け | オンラインヘルプ - Zoho CRM
https://www.zoho.com/jp/crm/help/automation/custom-functions.html

・カスタム関数の実装例
https://www.zoho.com/jp/crm/help/automation/custom-function-examples.html
Amebientのモデリング(遠景編)

Capです。Amebient Advent Calendar 18日目、遠景モデルの話です。

![](https://i.gyazo.com/b46919ecb1c38fee333af8c7a3919af0.png)

## 鉄塔

![](https://i.gyazo.com/c251e535e589c5106198a90c3f97331a.png)

![](https://i.gyazo.com/faf2e238543cb0386c611380f31efcc8.png)

![](https://i.gyazo.com/e2158b3a11fffc0638d3aa587ac3f87b.png)

[小物編](https://qiita.com/c4p/items/1e4536c8e2a69eca664b)でも言っていますが、鉄塔のモデルはBlenderモディファイアの`Wireframe`で作っています。

`Wireframe`は辺を参照して立体のワイヤフレームを生成してくれます。断面形状は操作できない(三角柱)のでディティール面ではメリハリが付きにくい(のっぺりした感じ？)のですが、今回の様に遠景用でシルエットがちゃんと出ていればいいような場合はけっこう有用だと思っています。

![](https://i.gyazo.com/c5951771d19f57b167c308a7a7bf10ac.png)

↑のように辺を割って`Wireframe`をかけると、

![](https://i.gyazo.com/1263eb5e87b295843e994f498cb9f399.png)

こうなります。便利。
そういえば、最初につくった仮の鉄塔がこれなんですが↓

![](https://i.gyazo.com/53d4d2cc741964db75be7afd09c4f116.png)

実はあの鉄塔は二つのモデルが重なってます。

![](https://i.gyazo.com/fa9e46ace62e3179f0851227fa7ed4c5.jpg)

最初に作ったやつと、後に作った大きいやつがあって、置き換えようとして位置合わせたら良い感じに合体して**かっこよかった**のでそのままにしました。

## 電柱
この子たちです。

![](https://i.gyazo.com/ab83b41240c9d7fa2bd8a24716f02f27.png)

![](https://i.gyazo.com/a5c14f21806c84df8d6b8791852e041f.jpg)

鉄塔からビルまでの電線をリレーしてくれてる子と、電線が千切れてる単体の子が居ます。

![](https://i.gyazo.com/d889b19b7458526ca30fc5ca8671f01a.png)

配線はカーブを使ってにょーんと垂らしています。

![](https://i.gyazo.com/2d58ba98cd837c0329db1b41ee60e5d8.png)

![](https://i.gyazo.com/d0b828142ba65babc3d1678406db6685.png)

![](https://i.gyazo.com/a74d5157f28deafa9da4e03440c2362a.png)

これもイメージソースが`少女終末旅行`ですね。幾何学的なシルエット。基底現実の電柱だとなんか違うかなと思ってこんな感じになりました。配線がなんかえらいことになってるのは(一回もっとやりすぎててぐちゃぐちゃになってた)、誰かが無理矢理使えるようにしてこうなってる、という気持ちです。これらがちゃんと働いていたときはもっときれいだったんでしょう。

## ビル
![](https://i.gyazo.com/19fecb23649575261845ac286979f441.png)

この子たちはボツになった`Building_MK-3`を**破壊**したものです。

![](https://i.gyazo.com/3cd30cc1f7834dae3dbc7d5427cf283f.png)

![](https://i.gyazo.com/1f4d2965d1c639572275d03006993972.png)

イメージソースは...`NieR:Automata`かな。少なくともリファレンスにはありました。
破壊は`Boolean`で削り取って行っています。ザクザクっとカットしたらかなり良い感じになりました。

あ、そういえばこの子たちにもコライダーが入ってます。なので一応乗れます。phiさんが入れといてくれました。やったー！
真ん中が吹き抜けになっていて、そこに`鐘`が入っています。

## 鐘

![](https://i.gyazo.com/049fc42d54aa8538804b27e5ce42ac88.png)

鐘です。"終わった"あとに、5つのビルの中から旋律を奏でてくれます。
実は、どの鐘も若干見えるようにしています。ただ遠くて分かりにくいと思います。なんかあるな、くらいに気付く人がいるといいなという気持ち。

> 鉄塔に向かって一番左のビルの鐘が分かりやすいと思うんですが、これを"人影"と認識する人がわりと居たみたいです。ある時遊んでる人を観察してたら、「あっちのビルにも、誰か居るんじゃない？」「向こうは向こうで演奏してるんだろうなあ」って話してて、めちゃくちゃ良かった。

![](https://i.gyazo.com/4500a4c4ffad79b3234a370c0ce1e4e1.png)

鐘が乗ってる塔はお馴染みの`Wireframe`モディファイアで作りました。

![](https://i.gyazo.com/e287944f28b1ec1ea9d635f3f13d4863.png)

![](https://i.gyazo.com/c16f1e1b2213f80f348efadf6d70f7e2.png)

鐘のモデルはわりと凝っています...最後にビルが消えて鐘だけが残る案もあったので。
でもビルまで来て鐘を確認してる人がけっこう居ますね(ちなみに、来れるような機能は用意してないです。**なんかがんばったら**一応行けるという感じ)。ちゃんと綺麗な鐘にしておいて良かったと思います。

## まとめ
遠景、見たい景色がちゃんと出来た感あって良かったです、ほんと。ビルとか若干不安だったかも。破壊あんまりやったことなかったので。あとボツになったビルとか有効活用できてよかったね。こういう制作過程も含めて"歴史"感あって良いなと思います。

以上になります。次回は全体のテクスチャまわりの話をする予定です。ありがとうございました。