OmniAICreator/Qiita-1.07M huggingface dataset:
ASP.NET Core Blazor WebAssembly - 学ぶべきポイントまとめ【フロントエンド開発入門者向け】

こんにちは！

テクニカルコンサルティングチームの古堅です。

[ASP.NET Core Blazor ](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/?view=aspnetcore-5.0)(以下 Blazor) の入門者向けに、学ぶべきポイントのまとめ、および、参考になるページを紹介します！

本記事では、詳細の解説はしていませんが、気になる方はお気軽に[お問い合せ](https://jp.infragistics.com/about-us/contact-us#contactform)ください！

<!-- more -->


## Blazor 概要


[ASP.NET Core Blazor の概要](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/?view=aspnetcore-5.0)


## Blazor プロジェクトの構成


[Blazor プロジェクトの構成を、Blazor WebAssembly と Blazor Server を比較しながら確認する - ASP.NET Core Blazor で始めるフロントエンド 開発（入門編）- ①](https://blogs.jp.infragistics.com/entry/2020/12/10/150516)


## レイアウト


[ASP.NET Core Blazor レイアウト](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/layouts?view=aspnetcore-5.0)


## コンポーネント



[ASP.NET Core Razor コンポーネントの作成と使用](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/components/?view=aspnetcore-5.0)



### .NET から JavaScript を呼び出す

[ASP.NET Core Blazor で .NET メソッドから JavaScript 関数を呼び出す](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/call-javascript-from-dotnet?view=aspnetcore-5.0)

### JavaScript から C# 呼び出し

[ASP.NET Core Blazor で JavaScript 関数から .NET メソッドを呼び出す](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/call-dotnet-from-javascript?view=aspnetcore-5.0)

## データ バインディング

[ASP.NET Core Blazor データ バインディング](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/components/data-binding?view=aspnetcore-5.0)


## ルーティング (画面遷移)

[ASP.NET Core Blazor のルーティング](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/fundamentals/routing?view=aspnetcore-5.0)


## イベント処理

[ASP.NET Core Blazor のイベント処理](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/components/event-handling?view=aspnetcore-5.0)



## 依存性の注入 (DI)

[ASP.NET Core Blazor 依存関係の挿入](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/fundamentals/dependency-injection?view=aspnetcore-5.0)


## 入力バリデーション


[ASP.NET Core Blazor のフォームと検証](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/forms-validation?view=aspnetcore-5.0)



## ログの管理


[ASP.NET Core Blazor のログ](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/fundamentals/logging?view=aspnetcore-5.0)




## まとめ (弊社の技術トレーニングの紹介)

Blazor の各学習ポイントを紹介しましたが、弊社では、本記事で紹介したような基礎知識が学べる技術トレーニングを、各プラットフォーム毎に提供しています。

技術トレーニングは、一から作るサンプルアプリケーションを通して、実践的に基礎知識を学べる構成となっています。

また、作成したサンプルアプリケーションをベースにリアルタイムで質問でき、すぐに疑問点や懸念点が解消できるため、受講者の皆様にご好評をいただいています。

もし、興味があれば、お気軽に[お問い合せ](https://jp.infragistics.com/about-us/contact-us#contactform)ください！
Windowsで本番環境としてFlaskアプリをシンプルな構成で動かす（Windows + Flask + waitress）

# はじめに

こちらの記事はWindows上でFlaskアプリを本番環境として動かす際に、
Webサーバとしてwaitressを採用して以下の構成で動作させた際の備忘録です。
（Flask単体でも動作しますが本番環境では推奨されておりません）

Windows + Flask + waitress 


## 経緯

Wndows上で動くアプリと連携するWebアプリをFlaskで作成しており、
簡易アプリとはいえFlask単体での運用は推奨されていないので、本番公開用にWindows上でFlaskと連携できるWebサーバを探していました。
よく出てくる構成として下記のような方法があったのですが、

1. Windows + Flask + nginx + cygwin + uwsgi
2. Windows + Flask + mod_wsgi + Apache

uwsgiがUNIX用なので構成にcygwinが入ってきたり、開発が終了しているmod_wsgiを使う方法などで、
もう少しシンプルでサポートが続いているものがいいと思い探していたところ・・・。

FlaskのHPちゃんと読んでみたらwaitressなるもので本番環境を構築しており、WIndowsとLinux両対応で実装していたので、
そちらの使い方を備忘録として記録しておくこととしました。

# Waitress

waitress はPythonで実装されたWSGIWeb準拠のWebサーバで、本番品質で許容可能なパフォーマンスを謳っています。
nginx等の本格的なWebサーバには及びませんが、PythonのFlask標準のWebサーバと比較すればかなりレスポンス面で優れています。

## インストール

```
pip install waitress
```

## 使い方

下記のような簡単なFlaskアプリ(server.py)を例とします。

```python

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello World"


if __name__ == "__main__":
    app.run('0.0.0.0', port=5000)
```
### 方法1 : ソースコードのFlask起動処理をWaitressへ切り替えて起動

※こちらの方式ではFlaskアプリのソースコード変更が必要となります。

* flaskを起動しているソースコードへwaitressをインポート

```python

from waitress import serve
```

* flask起動部分をWaitressで置き換えます。

```python

if __name__ == "__main__":
    #app.run('0.0.0.0',port=5000)
    serve(app, host='0.0.0.0', port=5000)
```

* アプリを起動します

```
python server.py
```

### 方法2 : コマンドラインから直接実行

※こちらの方式ではFlaskのソースコードを変更せずに、コマンドラインからwaitressサーバを実行できます。

* コマンドラインで下記のように入力し、サーバを起動します

シンプルな呼び出しとしては以下のような形での実行となります。
その他呼び出しの詳細オプションについては[waitressのマニュアル](https://docs.pylonsproject.org/projects/waitress/en/stable/runner.html)を参照ください。

```
waitress-serve --port="port" "python_file_name":"flask_variable"
```


サンプルのserver.py場合はFlaskを下記のように初期化しているため、

```python
app = Flask(__name__)
```

実際のサーバの起動は以下のようなコマンドで実行します。

```
waitress-serve --port=5000 server:app
```

##　動作確認

上記のサンプルコードで動作させた場合
http://127.0.0.1:5000/
上記にアクセスすることでHello Worldが表示されるはずです。
メインスレッドのnavigator、ワーカースレッドのnavigator

# はじめに

こんにちは！☃️🎄
[LIFULLその2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/lifull2)の11日目は@mimatyがお送りします。
普段は[LIFULL HOME'S不動産売却査定](https://www.homes.co.jp/satei/lp/p003/)の開発をしています。

所属している開発グループでは強い個人になるために、
週に2時間自分の好きなことを勉強して良い時間が設けらました。

この記事ではその時間にWEBブラウザ全般について調べていた中、
navigatorの仕様についてわかったことを書きます。

# 本題

Serveice Workerでもしgeolocationを扱えるのであれば、
WEBサイトを閉じた後のユーザを追跡できてしまうのではないかと思ったのですが、
そんなことはできませんでした。

メインスレッドでもワーカースレッドでも同じようにnavigatorを呼び出すことができるのですが、
ワーカースレッドのnavigatorはgeolocation属性を持っていません。

```javascript:main.js
console.log(navigator.geolocaiton)
// Geolocation {}

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('sw.js');
}
```

```javascript:sw.js
console.log(navigator.geolocation)
// undefined
```
　
同じnavigatorから呼び出されるものであっても、

メインスレッド内で呼び出されるものは、
window.navigatorで呼び出される[Navigator](https://developer.mozilla.org/ja/docs/Web/API/Navigator)

ワーカースレッド内で呼び出されるものは、
WorkerGlobalScope.navigatorで呼び出される[WorkerNavigator](https://developer.mozilla.org/ja/docs/Web/API/WorkerNavigator)

とのことでした。

つまり、WorkerNavigatorにはgeolocationが実装されておらず、
Service Workerからユーザの位置情報を取得することはできません。


# 参考文献

- [WorkerNavigator](https://developer.mozilla.org/ja/docs/Web/API/WorkerNavigator)
- [WorkerGlobalScope.navigator](https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/navigator)
- [Navigator](https://developer.mozilla.org/ja/docs/Web/API/Navigator)
- [window.navigator](https://developer.mozilla.org/en-US/docs/Web/API/Window/navigator)
- [Global object](https://developer.mozilla.org/ja/docs/Glossary/Global_object)
【Rails】ストロングパラメータについて（初学者）


#はじめに
最近Railsを勉強していて、「ストロングパラメータ」というものをよく見かける。
結構頻繁に出てきていたので、理解を深めるために自分なりにまとめてみた。（備忘録）

#ストロングパラメータとは
ストロングパラメータとは、簡潔にいうとフォームから入力された情報を安全に受け取る仕組みらしい。
フォームから入力された情報とは、`form_with`や`form_for`などで渡される値のこと。
通常、フォームの情報というのは`params`受け取れる。以下のような感じ。

```ruby:users.contoroller.rb
@user = User.new(params[:user])
```
通常はこんな感じで、フォームの情報を取得するけどフォームの情報をすべて取得するんじゃなくて、取得する際に必要な情報と不要な情報を区別して必要な情報だけを取得するということだそうだ。


フォームの例は以下のような感じ。

```ruby:new.html.erb
<%= form_with(model: @user, local: true) do |f| %>

  <%= f.label :"name" %>
  <%= f.text_field :name, class:"form-control" %>

  <%= f.label :"email" %>
  <%= f.email_field :email, class:"form-control" %>

  <%= f.label :"password" %>
  <%= f.password_field :password, class:"form-control" %>
  
  <%= f.label :"confirmation" %>
  <%= f.password_field :password_confirmation, class:"form-control" %>

  <%= f.submit yield(:button_text), class:"btn btn-primary" %>

<% end %>
```


#ストロングパラメータの使い方
では、ストロングパラメータの使い方をみていく。

ストロングパラメータの定義はprivateメソッドをの中で、定義していく。
実際の定義の仕方としては、以下のような感じ。

```ruby:users_controller.rb
private

  #ストロングパラメータ
  def user_params
    params.require(:user).permit(:name,:email,:password,:password_confirmation)
  end
```
```ruby:users_controller.rb
def create
 @user = User.new(user_params)
end
```
ここで使用している`requireメソッド`と`permitメソッド`がそれぞれ何を意味しているかを考えていく。

##requireメソッド
パラメーターの中にモデルに対応するキーが存在するかを確認し、存在する場合にそのバリューを返す。
フォーム内の値がそれに当たる？？


```ruby:users_controller.rb
private

  #ストロングパラメータ
  def user_params
   #params.require(:モデル名）
    params.require(:user).permit(:name,:email,:password,:password_confirmation)
  end
```
```ruby:new.html.erb
<%= form_with(model: @user, local: true) do |f| %>

  <%= f.label :"name" %>
  <%= f.text_field :name, class:"form-control" %>

  <%= f.label :"email" %>
  <%= f.email_field :email, class:"form-control" %>

  <%= f.label :"password" %>
  <%= f.password_field :password, class:"form-control" %>
  
  <%= f.label :"confirmation" %>
  <%= f.password_field :password_confirmation, class:"form-control" %>

  <%= f.submit yield(:button_text), class:"btn btn-primary" %>

<% end %>
```




##permitメソッド
permitメソッドによって、取得したい情報を指定します。
受け取るフォームの情報を元に、取得したいキーの情報をpermitメソッドに書いていく。

```ruby:users_controller.rb
private

  #ストロングパラメータ
  def user_params
   #params.require(:モデル名).permit(:キー名,:キー名,..)
    params.require(:user).permit(:name,:email,:password,:password_confirmation)
  end
```
本当にあったエンジニア同士の会話での秀逸返答集

<br>
# はじめに
みなさん毎日会話しますよね
この記事ではエンジニア同士の会話で**本当にあった**秀逸な返しをまとめました

本当にただそれしか書いてません、技術の「g」の字も出てきません
日々様々な実装などでプログラミング言語に囲まれて疲弊している方が、少しでもフフッとなってくれたらこれほど嬉しいことはありません

※出てくる人間や会話の一部(秀逸部分は除く)に多少フェイクは含まれますが、その辺りは大目に見てください~~お願いしますなんでもしますから~~

<br>
# 自称天才~~マウント~~エンジニアとの会話
**自称天才~~マウント~~エンジニアとは：**
エンジニア歴が長く、古い技術こそが至高であり新しい技術なんて触りたくもないという老害エンジニア
すぐに自分の黄金SES時代を語りたがり、会話の端々でマウントをとってくる(なんせ自称天才エンジニアなんですからね)
<br>
天才さん😎「俺が〇〇会社(大手)で業務委託してたときなんてさ〜、この会社(弊社)ではありえないくらいなんでも厳しくてさ〜」

私🙂「(うわ、まーーーーた始まったよ……)」

天才さん😎「それを乗り越えてきたから、俺ってなにがあっても動じないし、なんでもそつなく出来ちゃうんだよね〜」
天才さん😎「現代のエンジニアはぬるい環境で仕事できるから、本当羨ましいよな〜」
天才さん😎「俺の時代なんて数日帰れないなんて当たり前だったのにさ〜、まあそれを俺は乗り越えたからなんでも出来ちゃうエンジニアになれたんだけどね〜」

私🙂**「しかし天才さん、今までやってきた仕事って保守だけですよね？」**

<br>
この後、天才さんは少し静かになってくれました
<span style='font-size:smaller'>※もちろん私は保守が簡単な仕事という扱いをしているわけではありません※</span>

<br>
# ハッキングに憧れを抱いている同期との会話
休憩中、同期と一緒になったので世間話でもしてみることにした
同期だし、これから仲良くなっていきたいからね！

<br>
同期くん😀「いやぁ〜俺ハッカーになりたくてこの職(ネットワークエンジニア)についたところあるんですよ！」

私🙂「そうなんだ！ハッキングって難しいって聞くよ〜？」

同期くん😀「だからこそこれからたくさん勉強して、俺、ハッカーになります！！！笑」

私🙂「すごい意気込みだね！そういえば休みの日とかは何してるの？（きっとハッキングの勉強とかしてるんだろうな〜）」

同期くん😀「サッカーしてます！！！」

私🙂**「そっかあ！確かにハッカーとサッカーって語感似てるもんね！」**

<br>
そういうことではない
同期くんがハッカーになれるのはいつになるんだろうか…

<br>
# いつも居眠りしている上司がトラブってるのを一緒に見ているサブリーダー同士の会話
毎日居眠りしているリーダー、その配下のサブリーダーやメンバーはもう呆れて諦めていた
そんな中、メンバーが部署を跨ぐミスをしてしまい、少しだけバタバタした
もちろん、リーダーはメンバーの管理はサブリーダーに任せ自分は何一つしていなかったので、状況の把握が遅れた

<br>
リーダー😡「一体何をしてどうしてこうなっているんだ！他部署からクレームが来ているぞ！」

サブリーダー1🙁「あーあー、バタバタしてるねえ」

サブリーダー2🙁「普段現場見てないで寝てるからそのツケでしょ」

クレームした他部署の偉い人👱‍♂️「彼(リーダー)こんなことでかなり慌ててるけど、普段何を見ているんだ？(キレ気味)」

サブリーダー2🙁**「ああ、彼ならいつも夢見てますよ」**

<br>
次の日から居眠りリーダーの姿を見た人間は誰一人としていなかったという……
というのは冗談ですが、これに懲りず今でも業務中に居眠りしているそうです

<br>
# さいごに
こんな記事を最後までご覧くださり、本当にありがとうございました

会話という行動がある以上、秀逸な返しはどんどん生まれると思っています
みなさんが過去にしてきたエンジニア同士の会話の中にも、この記事内の返しよりももっと秀逸なものがあるのではないかとも思っています

もしよろしければ、あなたが持っている「秀逸な返し」をコメントに投稿していただけたらと🙇‍♀️
コメントを受けた私も、コメントを読んだ方もフフッとなるような、優しい~~世界~~記事にしていきましょう

### 謝辞
協力：どんな現場に行っても絶対中間管理職になってしまう元彼
ネタ提供手伝ってくれて本当にありがとう、また飲みに行こう
GatsbyやStorybookなどwebpackを利用しているツールで特定の拡張子ファイル用のwebpack loaderを入れ替えたい


# 前振り

タイトルが複雑ですよね。自分でもなんでこんなことせんとアカンの...って気持ちです。

例えば、svgファイルをアプリケーション上で利用したいとします。
通常であればGatsbyやStorybookがデフォルトでurl-loaderやfile-loaderを利用してよしなにしてくれます。
ですが、svgファイルを 別のloaderで処理したい！という時どうする？というのを解決していきたいと思います。

単にwebpack loaderを追加したい！という場合には公式にある通りに進めていけば問題ないです。
https://www.gatsbyjs.com/docs/add-custom-webpack-config/
https://storybook.js.org/docs/react/configure/webpack

# Gatsby

まずGatsbyのほうからやっていきます。

公式にあるとおりGatsbyでは`gatsby-node.js`というファイルからwebpackのconfigを操作できます。

svgファイルのloaderを以下のものに変更したいなら
[GitHub - JetBrains/svg-sprite-loader: Webpack loader for creating SVG sprites.](https://github.com/JetBrains/svg-sprite-loader)

```javascript

exports.onCreateWebpackConfig = ({actions, getConfig}) => {
  const config = getConfig();

  config.module.rules = config.module.rules.map(rule => {
    if (
      rule.test &&
      rule.test.toString() === '/\\.(ico|svg|jpg|jpeg|png|gif|webp)(\\?.*)?$/'
    ) {
      return {
        ...rule,
        test: /(\.(ico|jpg|jpeg|png|gif|webp)(\?.*)?$)/,
      };
    } else {
      return rule;
    }
  });

  config.module.rules.push({
    test: /\.svg$/,
    loader: 'svg-sprite-loader',
  });

  actions.replaceWebpackConfig(config);
};


```

のようにすれば動きます。
ポイントは以下になります。

```javascript

if (
  rule.test &&
  rule.test.toString() === '/\\.(ico|svg|jpg|jpeg|png|gif|webp)(\\?.*)?$/'
) {
  return {
    ...rule,
    test: /(\.(ico|jpg|jpeg|png|gif|webp)(\?.*)?$)/,
  };
}

```


渡されたtestフィールドでsvgファイルが該当するようになるloaderから愚直にsvgが該当にならないようにします。
その上で新しく入れ替えたいloaderを利用する宣言をしています。

ずいぶん力業だな〜。と私は思っちゃいましたが
`svg-sprite-loader`をgatsby-pluginとして読み込む
[GitHub - stldo/gatsby-plugin-svg-sprite-loader: Gatsby plugin for creating SVG sprites using SVG sprite loader](https://github.com/stldo/gatsby-plugin-svg-sprite-loader)
でも同じことしていました。なので私は採用しちゃいました。
[gatsby-plugin-svg-sprite-loader/gatsby-node.js at master · stldo/gatsby-plugin-svg-sprite-loader · GitHub](https://github.com/stldo/gatsby-plugin-svg-sprite-loader/blob/master/gatsby-node.js)

# Storybookの場合

察しの良い、ここまで読んでくださった人ならもうお分かりだと思いますが、Storybookでも同じような手順で入れ替えられます。
Storybookの場合は`.storybook/main.js`でwebpackのconfigが操作できます。

```javascript


module.exports = {
  stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
  addons: [],
  webpackFinal: config => {
    config.module.rules = config.module.rules.map(rule => {
      if (test &&
            test.toString() === '/\\.(ico|svg|jpg|jpeg|png|gif|webp)(\\?.*)?$/') 
		{
        return { ...rule, test: /(\.(ico|jpg|jpeg|png|gif|webp)(\?.*)?$)/ }
      } else {
        return rule
      }
    })

    config.module.rules.push({
      test: /\.svg$/,
      loader: 'svg-sprite-loader',
    });

    return config;
  },
};

```

GatsbyとStorybookに限らず、webpackを利用しているツールでは
webpackを操作するポイントさえどうにでもloaderが入れ替えできるよ。というのがわかりましたね。
めでたしめでたし。
「それっぽい」配色ができちゃうツールを集めてみた

# この記事について
この記事は、[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html)の開発チーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)」にて行っているアウトプット企画である
「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」の11日目の記事です。

# 配色、難しくないですか？
作ってみたツールのUIデザイン、説明資料に載せる図の色、発表スライドのテーマ...
人間、生きていると **いい感じの配色** を選ばなければいけない場面は少なくないと思います。

こういう時の配色って難しくないですか？
ケースによっては、ゼロから自分で色をいくつか選ぶ必要があることもあれば、
あらかじめ何色か決まっているところに、さらに足す色を選ばなければいけないこともあったり...

「配色センスはないし、色彩理論もよくわからない。」
「でもそれっぽい色を選んでいい感じのデザインにしたい...」
という方に紹介したいおすすめのツールを、お悩みパターン別に一つずつご紹介します。

# お悩みパターン一覧
今回はこんなお悩み向けのツールを紹介します。

- カラーセットのテーマもイメージも何も決まってない...
- 色彩理論に沿って選んでみたいけど、理論には詳しくないなあ...
- 入れたい色が決まってるけど、他の色はどうしよう...
- あの会社・あのサービスの配色をそれとなく意識した色にしたいなあ...

他にも「こんなことで困ってます...」という声があればぜひコメントで教えていただければと思います！

## カラーセットのテーマもイメージも何も決まってない...

### [Color Hunt](https://colorhunt.co/)
![Screenshot 2020-12-10 23.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/02cdbfe7-99ee-5fe0-6828-7f06b3fca5cc.png)
顔のアイコンが可愛いColor Huntは、他の人が登録した配色を表示してくれるサービスです。
パレットの表示順序は、「New」「Trendy」「Popular」「Random」の4種類から選べます。
万人受けを狙いたい時は「Popular」を選びますが、ちょっと冒険しようかな〜という時や、
配色に何の制約もない、という時は「Random」を選んで、気に入るものが見つかるまでひたすら眺めています。
ちなみにお気に入りの配色は、ハートボタンを押せばお気に入り登録できます。

## 色彩理論に沿って選んでみたいけど、理論には詳しくないなあ...

### [Color Supply](https://colorsupplyyy.com/app)
![Screenshot 2020-12-10 23.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/b5434882-0bab-d67d-2502-99d9e2785300.png)
Color Supplyは個人的に一番好きな配色ツールです、
画像上部分の色相環を直感的に操作しつつ、理論に沿った配色を試すことができます。
画像では3色の配色パターンが表示されてますが、2色〜4色のパターンも試せます。
12色の色相環も、9色や13色のバージョンが用意されてたりします。
これだけで一記事くらいのボリュームになっちゃいそうなので割愛します。ぜひ触ってみてください。

## 入れたい色が決まってるけど、他の色はどうしよう...

### [ColorSpace](https://mycolor.space/)
![Screenshot 2020-12-11 0.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/ddada8a0-d978-e1d3-36f2-07a39686291d.png)

選んだ色を含む、いい感じの配色を教えてくれます。
画面右側に表示されている #BAA7D9 を使った配色がなんと 25種類 も表示されます。
「Collective」「Classy」など、様々なテーマに沿った配色が表示されます。
たまに「この色、どうやってあわせよう...」みたいな色と出会うんですが、
そういう難しい色にも対応してくれるのが嬉しいですね。

お悩みからは少し逸れますが、このツールはグラデーション作成機能も豊富。
Instagramのテーマカラーっぽい、おしゃれなグラデーションもお手の物です。

## あの会社・あのサービスをそれとなく意識した色にしたいなあ...

### [BrandColors](https://brandcolors.net/)
![Screenshot 2020-12-11 0.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696809/7aa35b64-e44f-a2c7-f0fd-170fb0b029bc.png)

このお悩みパターン、意外とありませんか...？
技術系LTのスライドで「あのサービス使ったから意識した色にしたいな〜」って人をちょくちょく見かけますね。
私自身もさりげなく色を入れたくなる派の人間です。
このツール、会社やサービスで使われている色を教えてくれます。
会社やサービスだけでなく、プログラミング言語やフレームワークの配色も登録されてました。
各色をクリックすればカラーコードをクリップボードにコピーできます。
著名な会社・サービスはほとんどヒットしますし、検索もしやすいのでお気に入りです。


# まとめ
配色を決める時に役立つツールを4種類紹介しました。
配色ツールや紹介記事はたくさんある一方で、機能ベースで分類して紹介していたり、
一度に多くのツールを紹介する記事が多いように感じたので、
今回はあえてお悩みパターンという切り口から、気に入っているものだけを少数精鋭でご紹介しました。

今後も色々なツールを駆使しつつ、「それっぽい」配色を目指していきたいと思います。
Amazon RDSのエンドポイントの命名規則について

Amazon RDSのエンドポイントのDNS名って、どういうルールで決まっているんだろうと思っていたのですが。

ふつうにドキュメントに書いてありましたね。

> 識別子は、RDS によってインスタンスに割り当てられた DNS ホスト名の一部として使用されます。たとえば、db1 を DB インスタンス識別子として指定した場合、RDS は、db1.123456789012.us-east-1.rds.amazonaws.com などのインスタンスの DNS エンドポイントを自動的に割り当て、ここでの 123456789012 はアカウントの特定の地域の固定識別子です。 

[Amazon RDS DB インスタンス](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Overview.DBInstance.html)

> ここでの 123456789012 はアカウントの特定の地域の固定識別子です。 

なるほど。この部分が、いつもなんだろう？？？って思ってたんですよね。

つまり

* RDSのインスタンス識別子
* AWSアカウントID
* RDSインスタンスを配置するリージョン

が変わらなければ、たとえばRDSインスタンスを作り直してもエンドポイントは変わらない、ってことになりそうです。
Oracle Cloud Infrastructure Computeで古いOSイメージを使用する

# 1. はじめに

Oracle Cloud InfrastructureでComputeインスタンスを作成するとき、古いバージョンのOSイメージを使いたいときがある。**たとえば、既存環境と同じイメージを使いたいときや、yum/dnfのテストをしたいときだ。その方法を説明する。**

なお、特別な要件が無い限り、新しいイメージを利用することを推奨する。新しいイメージでは単にパッケージのバージョンが新しくなっているだけでなく、追加のパッケージや、その他の改修が加わっていることがある。そのため`yum update`しただけでは同じにならない可能性があるからだ。

### 1-1. 対象環境

* Oracle Cloud Infrastructure Compute

# 2. 古いイメージを指定する

Infrastructure Console（WebUI）では、ドロップダウンリストなどで古いイメージを指定できない。古いイメージを指定するには、イメージのOCIDを入力する必要がある。OCIDを調べるには次の2つの方法があり、それぞれについて説明する。

* 既存インスタンスのイメージOCIDを利用する
* マニュアルのイメージリストからOCIDを探す

### 2-1. 既存インスタンスのイメージOCIDを利用する
この方法は、同一リージョンに利用したいComputeインスタンスが存在するときに使える方法だ。異なるリージョンのイメージOCIDは利用できない。

1. Infrastructure Consoleで、利用したいComputeの詳細ページを表示する。そのページの「Image」をクリックする。
![comp-img06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/b326cfb2-c6ef-75c9-7092-1abd00a21673.png)

2.「Copy」をクリックして、OCIDをコピーする。
![comp-img07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/46b45de1-9142-1be5-215b-2c3019c29794.png)

3.Computeの作成ページで「Change Image」をクリックする。
![comp-img04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/304b9fca-c9e9-bd36-4fcb-2c2e8ea31289.png)

4.「Image OCID」タブをクリックし、コピーしたOCIDをペーストして「Select Image」をクリックする。
![comp-img05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/e665cf8f-96a8-d2a5-099b-71b5f00ccff0.png)

5.あとは通常通りインスタンスを作成すればよい。なおAlways Freeでは、Free対象のイメージでも、古いバージョンによっては使えないことがあった。

### 2-2. マニュアルのイメージリストからOCIDを探す

こちらの方法はマニュアルからOCIDを調べる方法だ。

1. Oracle Cloud Infrastructureマニュアルの**「[Imagesページ](https://docs.cloud.oracle.com/en-us/iaas/images/)」**から使用するOSイメージを探す。
![comp-img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/9673bf59-923a-4e9d-0fa3-1e069539b4da.png)

2.使用するイメージが決まったら「Read more」をクリックする。
![comp-img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/ec1fa0f3-8a30-258b-5783-44c6d830cdb9.png)

3.インスタンスを作成するリージョンのOCIDをコピーする。
![comp-img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/941acdd0-7cea-ff07-86c3-271cd27137d0.png)

4.あとは同じ操作で作成できる。
SORACOM GPSマルチユニット+AWSを使って温度管理してみた。


## はじめに

2020/11/10~2020/11/12にAWSがオンラインで主催した「IoT Jumpstart セミナー」に参加してきました。その際にSORACOM GPSマルチユニットを使ったのでそれについて書きます。
>IoT Jumpstart セミナーとは？
AWSが主催するIoTの設計と構築を学ぶセミナー。講義・ハンズオントレーニングを通してIoTの基礎を学ぶことができ、さらに参加者が自ら持参したプロジェクトのPoC構築とその補助を提供してくれる。

## GPSマルチユニットの説明
今回の主役です。
手に収まるサイズでとても可愛らしい見た目をしていますが、この見た目とは裏腹にかなり優秀な機能を携えています。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700820/3e539f4e-1cd2-bab1-0b08-f2867bffc375.jpeg">
>GPSマルチユニット SORACOM Editionは、京セラ社のGPSマルチユニットをベースに、ソラコムを利用するための設定が行われているソラコム独自モデルです。1台に位置情報（GPS）、温度、湿度、加速度センサーと充電式のバッテリーを内蔵しています。省電力なセルラーLPWANであるLTE-M通信を搭載しているので、電源を入れるだけでどこでも通信が可能です。ブラウザから簡単な設定をするだけで、SORACOMのプラットフォームと連携し、すぐにデータ取得から可視化を始めることができます。
https://soracom.jp/products/kit/gps_multiunit/

要するにこれ一つで**位置情報(GPS)・温度・湿度・加速度**が取得できる超お手軽IoTデバイスです。
さらに右側の四角形のボタンを押すだけで、データがSORACOMのコンソールに届きます。
まさにIoT初心者の自分たちには、うってつけのデバイスです。


## 当初の予定 -挫折を添えて-
当初の予定では、GPSマルチユニットの"加速度割り込み"という機能を使用して、冷蔵庫に設置したGPSマルチユニットで、**ドアの開閉を検知**しようとしました。

>加速度割り込みとは？
>加速度の大きさが設定したしきい値を超えて変化した場合に、データを送信する機能
>参照 https://dev.soracom.io/jp/gps_multiunit/how-it-works/

しかし思わぬハプニングが...

このGPSマルチユニットから送られてくるデータでは、**加速度割り込みのデータと定期通信のデータが区別できない**という...

主な原因を下記にまとめました。
1. GPSマルチユニットから送られてくるデータの中に、加速度割り込みを区別するパラメーターがない
2. 定期通信を行なっている状態でしか、加速度割り込みを設定できない
3. ドアの開閉が短いアクションのため、加速度割り込みは生じるが、送られてくるデータは、ドアが閉じた後の加速度の状態となってしまう(加速度の検知から送信までにラグがあるため)

特に3の送信までのラグに関しては、原因の特定までに時間がかかり、データは送られてくるけど、加速度の値は元のままという状態に悩まされてしまいました。

そんな訳で、今回は加速度割り込みの機能は諦めて、**温度センサーによる温度管理**サービスを構築しました。



## 出来上がったもの
### サービス概要
夏になると、ご年配の方々がエアコンをつけずに熱中症になってしまうというニュースをよく目にするので、本人ないしは離れて暮らす家族に、GPSマルチユニットから取得できる温度データを用いて、アラートをしたいと思いました。

具体的なサービスは下記の項目です

* しきい値を上回る(もしくは下回る)温度に達すればLINEで通知を行う
* Quickサイトによる温度推移の可視化

この二つを目的として作業を進めて行きました。

### 完成したアーキテクチャ
![](https://i.imgur.com/jubTmHb.png)
SORACOMのコンソールからAWS IoT Coreのルールを使って、AWS LambdaとAWS IoT Analyticsにデータを流しました。
Lambda側でLINEに通知する処理を記述し、IoT Analytics側でQuickSightで可視化するための処理を行いました。

## 実際の挙動
LINEでの通知ですが、今回は手軽にLINE Notifyを使用して通知を行いました。

>LINE Notify
https://notify-bot.line.me/ja/

下の画像を見て頂くと、問題なくデータの取得とアラートが行えているのが確認できますね。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700820/2178aa86-768d-932a-a218-e47166083f94.png">
※しきい値は動作確認のため上限：20度・下限：15度の設定です。

画像はありませんが、Quick Sightでの可視化も問題なく行えていました！

## 感想(まとめ)
紆余曲折ありましたが、GPSマルチユニットを使用して、なんとかサービスを構築することができました。
当初予定していたドアの開閉の検知ができなかったのは、自分たちのデバイスに対する理解が及ばなかったことが原因なので、次回の反省点にしたいと思います。

SORACOMのIoT 体験キットに磁気センサーもあるので、こちらを使用すれば当初予定していたサービスは実施できたかもしれません。機会があれば再度トライしたいです。
>SORACOM IoT体験キット 〜磁気センサー〜
https://soracom.jp/products/kit/magnetic_sensor_kit/


さて今回GPSマルチユニットを使用してみた感想ですが、超お手軽にデータの取得ができて驚きを隠せませんでした。
SORACOM SIMを挿入して、電源ボタンを押すだけで、SORACOMのコンソール上に**位置情報(GPS)・温度・湿度・加速度**のデータが送信することができるなんて、まさに「**IoTテクノロジーの民主化**」を感じました。

今回使用したデータは温度だけですが、いつかスキルアップをして、あえなく断念した加速度や、他にも位置情報(GPS)機能を用いたサービスも構築してみたいですね。
ABC 045C たくさんの数式 を Python で解いてみた。

# はじめに

今回はAtCoderの『ABC 045C たくさんの数式』をPythonで解いてみました。
# 問題

[ABC045C-たくさんの数式](https://atcoder.jp/contests/abc045/tasks/arc061_a)

# 方針
- "+"が入るパターンを全探索（再帰）
- "+"が"入る時"と"入らない時"で分岐
- 文字列を数字化して計算する
 
# 実装

準備として

- 入力
- 再帰のために桁数の取得

これらを行います

```python
s = input()
n = len(s)
```

次に再帰の関数を定義していきます。

- 文字列がs[0],s[1],s[2]…s[n-1]という順に全探索し終えたタイミングでそれぞれ文字列を数値化して計算するように書く。

- 合計値を出力するので戻り値を分岐した数式の和となるように設計する

```python
def dfs(i, f):
    # 全検索が終了
    if i == n - 1:
        # 文字列を数値化して計算する
        return sum(list(map(int, f.split("+")))
    # 分岐した数式の和
    return dfs(i + 1, f + s[i + 1]) + dfs(i + 1, f + "+" + s[i + 1])
```

最終的に再帰の関数に初期値を設定してprintで出力します。

```python
print(dfs(0, s[0]))
```

# 答え

```python
def dfs(i, f):
    if i == n - 1:
        return sum(list(map(int, f.split("+")))
    return dfs(i + 1, f + s[i + 1]) + dfs(i + 1, f + "+" + s[i + 1])
s = input()
n = len(s)
print(dfs(0, s[0]))
```
今回は『全検索(再帰)』 『文字列の数値化』が分かれば解けた問題でした。
LINE Bot実装時のデバッグ（エラー内容確認）方法

[朝活LINE Bot](https://qiita.com/mshimadaaa/items/5fa4ff9cefa7689e5e6e)を実装していたとき、DBへインサートできない不具合発生しました。このエラー内容を表示し、解決した方法をご説明します。
LINE Botはエラー等の出力がされないので、こういった方法を参考に開発を進めてみると良いと思います！
#開発環境
言語：PHP7.4
フレームワーク：Laravel5.5
データベース管理システム：MySQL8.0
サーバー：ConoHa VPS
#変数の中身を確認
たくさんの変数を用いてコードを書くと思いますが、デバッグ時には変数の中身が意図したものになっていることを確認することが重要です。
ここでは、変数の中身をテキストファイルへ出力する方法を説明します。
####①ログを書き込むファイルを作成
以下のコマンドで新規ファイルを作成します。

```
touch ファイル名
```
または

```
vi ファイル名
:wq
```
としてファイルを作成します。
ファイルはテキストファイルになるので、拡張子は「.txt」にしておきます。
このとき、
#####ファイルの絶対パス
をメモしておいてください。後々使用します。
####②作成したファイルのパーミッションを変更
ログを書き込むことができるように、以下のコマンドでパーミッションを変更してください。

```
chmod 777 ファイル名
```
####③変数を出力するコードを追記
以下のコードをLINE Botの処理を行っているコントローラ等に追記してください。

```
error_log(print_r($result, true) . "\n", 3, 'ログファイルへの絶対パス');
//$resultのところには、表示したい変数名を入れる
```
これによって$resultの中身がファイルへ出力されます。
LINE Botを動かしてみてください。
error_logやprint_rに関する説明は以下をご覧ください。
[PHP : error_log - Manual](https://www.php.net/manual/ja/function.error-log.php)
[PHP : print_r - Manual](https://www.php.net/manual/ja/function.print-r.php)
####④ファイルへの出力結果確認
コンソール画面で以下のコマンドを実行すると、リアルタイムでファイルへの出力が確認できます。
別タブを開いてやってみるといいかもしれません。

```
tail -f ファイル名
```
control + c　で処理を停止します。

この方法を使って変数の中身が想定通りになっているかを調べることができます。
想定と異なる部分があれば、その周辺にエラー発生要因が存在している可能性が高いです。
エラー発生部位が特定できたら、次の方法でエラー内容を表示させます。
#try-catch文を用いて例外（エラー）の表示
try-catchに関する詳細は以下の記事をご覧ください。
[PHP : 例外(exceptions) - Manual](https://www.php.net/manual/ja/language.exceptions.php)
[【PHP】try-catch解説](https://qiita.com/Chelsea/items/59436cfda149a6ac6c91)

先程の方法で特定した部分をtry-catchで囲み、例外表示処理を追記します。

```
try {
    エラーが発生したと思われる部分
} catch(\Exception $e) {
    error_log(print_r($e, true) . "\n", 3, 'ログファイルへの絶対パス');
    exit;
}
```
LINE Botを動かして、[④ファイルへの出力結果確認](####④ファイルへの出力結果確認)でエラー内容を確認します。

以上となります。この方法を参考にLINE Bot開発してみてください！
LINE WORKSを使って打刻せず勤怠を記録する

今年はテレワークの導入が進んだ1年となりましたね。
弊社が開発、販売する、在宅や外出先からの打刻もできる勤怠管理・交通費精算クラウド「[kincone（キンコン）](https://www.kincone.com/)」が、LINE WORKSとの連携を開始した年でもあります。

専用のスマホアプリを使って打刻できますが、LINE WORKSと連携すればアプリ不要で出勤を記録し、勤務状況をメンバーにも伝えることができます。
打刻するというよりは、挨拶したら打刻もできているという感じです。

<h2>打刻イメージ</h2>
![画像①.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922569/10a73289-4147-32c6-d58d-a2be16c62ac0.jpeg)

このように、LINE WORKSで「おはようございます」と送信するだけで出勤打刻完了です。
自宅や外出先からもできますね。

そのままkinconeにも時刻が登録されます。

![2020-12-11_14h47_57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922569/41b23e66-bc0b-58fc-d5f7-670b094fb125.jpeg)

<h2>打刻用のワードを決める</h2>
指定したキーワードを送信すると打刻が行われれる仕組みです。
ただし、単純に「おはようございます」とか「おつかれさまでした」だと、意図しない打刻が発生してしまいますよね。
そのためには、引き金となるワード（絵文字も可）を決めておく必要があります。

![2020-12-08_09h47_56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922569/68bcb1d4-6b67-e238-88d9-df134ba51503.jpeg)

「:sunny:おはようございます」で出勤、
「:full_moon_with_face:おつかれさまでした」で退勤
など。
チーム内で打刻用の絵文字を決めておくとわかりやすいですね。

<h2>連携方法</h2>
kinconeとLINE WORKS Developer Console の両方で設定を行います。
LINE WORKS の Developer Console にアクセスし、API IDとServer API Consumer Keyを発行します。

![Ex2oSbHz6S3UbgmP2NMmVVE38CidG8EBxg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922569/7f301f4c-300e-a51c-837b-fc6bc53b170e.png)

![D4PcmY_yBPUpFe3fJvhyLY83bl2J3UiqmQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922569/64cfec67-5330-80a8-99b6-04405acda9a4.png)

kinconeにはLINE WORKSとの連携用メニューが用意されているので、そこから手順通りにすすめていくだけです。

![2020-12-08_09h46_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922569/608084ab-79e0-a358-ae6c-526dcec6495d.jpeg)

<h2>おわりに</h2>
忙しいとついつい疎かにしてしまいがちな勤怠管理。
LINE WORKSは、ビジネス版LINEとして誰にでも使いやすいビジネスチャットツールですから、これで打刻を忘れることはなくなる。はずです！

＜参考＞
[LINE WORKS連携によるチャット打刻（１）LINE WORKS側での事前準備](https://help.kincone.com/support/solutions/articles/35000152015-line-works%E9%80%A3%E6%90%BA%E3%81%AB%E3%82%88%E3%82%8B%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E6%89%93%E5%88%BB%EF%BC%88%EF%BC%91%EF%BC%89line-works%E5%81%B4%E3%81%A7%E3%81%AE%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)
[LINE WORKS連携によるチャット打刻（２）LINE WORKS側での事前準備](https://help.kincone.com/support/solutions/articles/35000152018-line-works%E9%80%A3%E6%90%BA%E3%81%AB%E3%82%88%E3%82%8B%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E6%89%93%E5%88%BB%EF%BC%88%EF%BC%92%EF%BC%89kincone%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA%E8%A8%AD%E5%AE%9A)
Process (保護ドメイン)のシステムコールとライブラリ

ここではVMX root modeのring3 で動作する process (保護ドメイン)で使えるシステムコールとライブラリを簡単に紹介したいと思います．

## システムコール

保護ドメインはいわゆるユーザランドですので，システムコールがあります．ユーザから使えるインタフェースとしては[process/lib/lib_syscalls.c](https://sourceforge.net/p/bitvisor/code/ci/default/tree/process/lib/lib_syscalls.c)で定義されています．以下の14種類があります，

```c
#define SYS_NOP                 1
#define SYS_MSGSETFUNC          3
#define SYS_MSGREGISTER         4
#define SYS_MSGOPEN             5
#define SYS_MSGCLOSE            6
#define SYS_MSGSENDINT          7
#define SYS_MSGRET              8
#define SYS_MSGSENDDESC         9
#define SYS_NEWPROCESS          10
#define SYS_MSGSENDBUF          11
#define SYS_MSGUNREGISTER       12
#define SYS_EXITPROCESS         13
#define SYS_SETLIMIT            14
```

なんだか数が少なくて，また大部分を`SYS_MSG_*` というものが占めていてこれでいいの? と思う方がいるかもしれません．しかしBitVisorの本体 (ring0で動作する部分) は別に一般のOSとして機能しているわけではなく，process自体はあくまで本体と独立して動作することが一つの目的であるのでこれでいいのです．

といってもBitVisor本体とやりとりしなければ入出力などはできません．そこで登場するのが `SYS_MSG_*` で定義されるシステムコールを利用したメッセージパッシングです．メッセージパッシングの仕組みを利用すると，threadやprocess間でコールバック関数を利用したデータのやりとり及び処理ができるようになります．これによってprocessからBitVisor本体を呼び出して入出力をおこなったり，また逆にBitVisor本体からメッセージパッシングによってprocessの処理を実行することができます．process/以下にあるいくつかのプログラムを見てみると，どのように利用するのかのイメージがつくと思います．

メッセージパッシングの実装に関しては以下に記事があります．

- deep_tkkn, [BitVisor の保護ドメインとのI/F のお話](https://qiita.com/deep_tkkn/items/77d47bd470cbac3540e9),  Qiita, BitVisor Advent Calendar 2016

## ライブラリ

[process/lib](https://sourceforge.net/p/bitvisor/code/ci/default/tree/process/lib/) 以下にはシステムコール意外にも，processを作成する際に利用できるライブラリがいくつかあります． `printf()` 系の関数や，簡単なメモリアロケータ，文字列処理の関数などがあるのでprocessを作成する際は一度確認してみるといいでしょう．

もしこれ以外のライブラリを利用したい場合は，process側に移植するか，あるいはBitVisor本体側に移植してメッセージパッシングで利用することになります．
なんと便利なラムダ式

#なんと便利なラムダ式
##はじめに
　この断りを書かないと怒られそうなので。
　**「今回紹介するのはラムダ式のごく一部です」**
　ラムダ式、クエリ式に興味を持ってもらえたらいいな～という程度です。自分が使っていて便利だなと感じた場面をいくつか紹介しようと思います。何卒御容赦下さい。ちなみに言語はC#です。

##ラムダ式・クエリ式とは
　ラムダ式・クエリ式とは、本来ならば関数を定義するところを簡単に1行で書けたり、配列を直感的に操作できるすごい奴だよ。
　ラムダ式・クエリ式とまとめて書きましたが、今回紹介するのは**ラムダ式のみ**になります。
　正直ラムダ式紹介するだけでも知らない方からすれば結構楽しんでもらえると思います。自分自身初めて触れたときには「プログラミングって案外ラフなんだなー」と感心したものです。

##ラムダ式の書き方
　基本的にラムダ式と言うと`=>`や`->`といった矢印が用いられていることが多いです。(もしかしたら他にも記法があるのかも？)
　一般的にプログラミングの関数は`C++`なら`int function()`や`Python`では`def function()`等、名前をはじめに決めて処理を内部に書くことが基本ですが、簡単な関数、ましてや1度や2度しか使わない関数にも同様に名前を付けて使わなければならない場面があったりします。しかしと言うかやはりと言うかモブみたいな関数に一丁前に名前を付けて主役級の関数と同じ扱いをするのは疲れてくるわけです。
　そこでいよいよ登場**「ラムダ式」**となるわけですが、ラムダ式は`Delegate`や`Action`といった匿名関数(無名関数)の延長線なので、詳しく知りたい方は調べてみると面白いかもしれません。繰り返しになりますが本ページでは**「ラムダ式のごく一部」**しか紹介しませんので悪しからず。

##実際に書いてみよう
###簡単な例
####ソースコード

```csharp
using System;
using System.Linq;

class Program {
    static void Main(string[] args) {
        string str = "Hello World";
        //for-each
        Console.WriteLine("for-each");
        foreach(string s in str.Split(' ')) {
            Console.WriteLine(s);
        }
        Console.WriteLine("");
        Console.WriteLine("lambda");
        //ラムダ式
        str.Split(' ').ToList().ForEach(s => Console.WriteLine(s));
    }
}

```

####実行結果

```
for-each
Hello
World

lambda
Hello
World
```

　**「文字列"Hello World"を空白で分割してそれぞれ配列に格納して各要素を出力する」**ということを`foreach`と`=>`でそれぞれ書いてみました。言わずもがな`for`を使うこともできますが、その場合は少しだけ`foreach`に比べて書く文字数が多くなります。
　`ForEach()`を使うと怒られるかもしれませんが、これはあくまで簡単な例ということで。(`ForEach()`はラムダ式を用いる、つまり`Delegate`を生成している分、単純な`for`や`foreach`等よりもリソースを食う可能性がある。)

###実用的な例
####ソースコード

```csharp
using System;
using System.Linq;

class Program {
    static void Main(string[] args) {
        string str = "0, 1, 2, 3, 4, 5, 6, 7, 8, 9";
        //for-each
        Console.WriteLine("for-each");
        //文字列型配列の宣言と初期化
        string[] strArray = str.Split(',');
        //整数型配列の宣言
        int[] num_foreach = new int[strArray.Length];
        //インデックス変数の宣言と初期化
        int i = 0;
        //整数型配列の代入
        foreach(string s in strArray) {
            num_foreach[i] = int.Parse(s);
            i++;
        }
        //整数型配列の各要素の出力
        foreach(int n in num_foreach) {
            Console.WriteLine(n);
        }

        //ラムダ式
        Console.WriteLine("");
        Console.WriteLine("lambda");
        //文字列の分割からの整数型配列の宣言と初期化
        int[] num_lambda = str.Split(',').Select(s => int.Parse(s)).ToArray();
        //整数型配列の各要素の出力
        foreach(int j in num_lambda) {
            Console.WriteLine(j);
        }
    }
}

```

####実行結果

```
for-each
0
1
2
3
4
5
6
7
8
9

lambda
0
1
2
3
4
5
6
7
8
9
```

　**「csv形式のファイルから数値を配列に格納する」**プログラムです。これはセーブデータの外部ファイルへの保存等応用の幅は広いと思います。上記の出力の部分に関してはあえて別途書きましたが、書く文字数はそれを差し引いても圧倒的な差があることがわかると思います。あとはラムダ式のほうが視線を縦に動かさずに済むのでそういった意味では可読性も高いかもしれません。自分の場合はラムダ式を用いた方が楽で何をやっているのか見やすいので使う機会が多いですね。

##さいごに
　ラムダ式やクエリ式等はあくまでも楽に書くための補佐的文法でしかないので、基本的な文法でもあらゆることが代替可能ではありますが、開発の際の時間、文字数、人材等のリソースの無駄な部分がカットできる可能性がありますので、「一度しか使わない代入のためだけの関数がバグの原因っぽいけど関数作りすぎてどの辺にあったかわかりづらい」や「配列を操作するのにわざわざfor文で操作するの面倒くさい」等痒い所に手が届く仕組みが`Linq`には備わっているので、ぜひリファレンスや他の記事を一読してみるのもいいかもしれません。
MySQLで日本語をINSERTしようとすると改行され続ける【解決方法求む】

#MySQLで日本語をINSERTしようとすると改行され続ける

###使用環境
* windows10
* PHP8
* XAMPPのshell

##背景
XAMPPのshellからコマンドラインでINSERT INTOしようとすると改行され続けてINSERTができない。
調べたところ、どうやら日本語のINSERTができない模様。ローマ字とかだとINSERTできる。
シングルクォーテーションをダブルクオーテーションに変えても同様の現象が起こった。

```
MariaDB[database]> INSERT INTO database('あ','い','う','え','お');
'>
'>
'>
'>

以下繰り返し


```

一応、文字コードを確認してみる
一部、UTF8になってるけれど特に問題なさそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615830/850a42f5-6d4d-24bd-679b-0ba384fd89e9.png)


shell自体の文字コードを確認してみる
一応、UTF8になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615830/36b3c730-92e2-b2e6-5170-8fa5a447fbd5.png)

##わかったこと
改行され続けるエラーというのはシングルクォーテーションが閉じていないと判断されてしまい起こっているらしい。

##対処法
現在、有効な対処法はわかっていない。
**ご存じの方がいらしたらぜひ教えてください。**

今できる唯一の対処法はphpMyAdminを使用すること。
少し手間がかかるが仕方がない。
【Java】varを使った変数宣言

# Javaで「var」を使った変数宣言

についてまとめました。

## 【要約】

いわゆる型推論と呼ばれる機構で、ローカル変数の宣言時に変数の型を指定する代わりに「var」と書くことで、型の指定を省略することができます。

## 【説明】

書き方自体は従来の方法と変わりなく、データ型の記述部分を「var」にするだけです。

```java
String str1 = "従来の書き方";
var str2 = "varを使った書き方";

System.out.println(str2);
```

```java
varを使った書き方
```

## コンパイルエラーの例

varを使った場合、「データ型を特定できない」時にコンパイルエラーを起こします。以下の場合などです。

- **変数が初期化されていない**
- **nullで初期化する**
- **ラムダ式**
- **配列の初期化式**

これらは主に、varの使った型推論の機能の特性が関係しています。

型推論はコンパイル時にコンパイラが代入演算子「=」の右辺から変数のデータ型を推論し、そのデータ型を置き換える機能のため、何型の変数やインスタンスを生成すればいいか判断ができない場合にエラーが起きます。

## 型推論を行える場合の例

### ダイヤモンド演算子

ダイヤモンド演算子による型推論ではもしか他情報がなければObject型の型として与えられるため、型推論を行うことができる。

```java
//ダイヤモンド演算子で型が推論できない場合にはOject型が使われる
var arry new ArrayList<Object>();
```

### メソッドの戻り値型ローカル変数の型を推論

ローカル変数の型推論はリテラルだけでなく、次のようにメソッドの戻り値を受け取るのにも使える。これはメソッドの定義から戻り値の方が判別できるため。

```java
var a =sample();
```
## 【まとめ】

試験対策としてはvarを使った場合、「データ型を特定できない」時にコンパイルエラーを起こす ということを覚えておくこと。

## 参考文献・記事

- [徹底攻略Java SE 11 Silver問題集[1Z0-815]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625/ref=pd_lpo_14_img_0/356-5238196-1895250?_encoding=UTF8&pd_rd_i=4295007625&pd_rd_r=1c21865b-a9fe-43e8-ac01-46170e44abca&pd_rd_w=9El0Q&pd_rd_wg=hh5Hc&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=72AVH18EM90CKG00CH5W&psc=1&refRID=72AVH18EM90CKG00CH5W)
- - [型推論](https://ja.wikipedia.org/wiki/%E5%9E%8B%E6%8E%A8%E8%AB%96#:~:text=%E5%9E%8B%E6%8E%A8%E8%AB%96%EF%BC%88%E3%81%8B%E3%81%9F%E3%81%99%E3%81%84%E3%82%8D%E3%82%93,%E6%B1%BA%E5%AE%9A%E3%81%99%E3%82%8B%E6%A9%9F%E6%A7%8B%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82)
GitHubでプルリクエストのマージするブランチを間違えたのにマージ後に気づいたときのGUI上での対処

プルリクエストのレビューでマージ先の確認が漏れていたため、間違ったブランチにマージしてしまうというのが起きたときに、めんどくさい作業を誰かがしないとなーと調べてたらGUIでサクッと修正できたのでそのメモ

## 要約

1. 間違ったプルリクエストのrevertボタンからプルリクエストを作成しマージして戻す
1. revertのプルリクエストから更にrevertボタンを押しプルリクエストを作成する
1. このときにマージ先を本来マージしたい先にする
1. マージする

## 起きたこと

中規模の開発案件で、それ用のマージ先のブランチを用意していたが、プルリクエストがデフォルトブランチのdevelopを向いたままだった上に初期だったためレビューの差分でも気づかず、マージまで行ってしまった。

## 行ったこと

feature/hogehoge から kaihatsuA ブランチにマージするはずが、developにマージしてしまった

### まずは行った修正を戻す（revert）

間違ってマージしてしまったプルリクエストからrevertのプルリクエストを作成できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140947/d17cb1fb-11df-2118-90aa-e949a6ff7f7c.png)


GitHubを使いこなせていないため、GUI上でrevertできることすら知らなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140947/972bd1eb-1bba-45df-cc83-2e9e5eccc23b.png)


これはあまり考えずに、マージしてしまって良い。

### 戻した状況の確認

git初心者だともとに戻ったんだからこれで良いじゃん、と考えてしまう人もいるかもしれないが、revertは時を戻してくれるものではない。
あくまで「前のコードと同じものにする」というだけで、commit historyなどを見るとrevertが「追記」されていることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140947/7805a151-dabe-227e-9874-29642e8afd15.png)


つまり、前に戻ったのではない。むしろdevelopのほうがマージ元より新しい状態になっている。
そのため、再度developに向けてプルリクエストを送ると差分が出ない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140947/9ff0833d-53d1-b2dc-4fe3-7a87d8666507.png)


そのためマージ先にこの状態でfeature/hogehogeをkaihatsuAにマージしてしまうと、その取消コミットがdevelopにはあるぶん新しいためこのマージ先からdevelopにマージしようとしたときにその差分が出ない・もしくはコンフリクトで泣きを見ることになる。

### revertしたものをrevertし、さらに向き先を本来のマージ先にする

先程revertのプルリクエストを出したが、さらにこれのrevertをボタンを押す。
こうすることで、feature/hogehogeから見ると、新しくしたコードを前のコードで書き直して（revert1）、さらにまた新しくしたコードで書き直した（revert2）がプルリクとして作成される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140947/dfcf9627-623f-01b4-ae7d-12c4629ca25a.png)


その上でマージ先を本来のマージ先に向けると行いたかった差分が出てくるはずである。
baseがdevelopに向いているのでkaihatsuAに向ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140947/68be08fd-1a16-80ca-065a-e8f87011b911.png)

コミット差分はこの通り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140947/0db89f95-364b-d1cb-0863-fcef8cfa19e9.png)


注：このときマージ元のデータはdevelopのデータ＋revertの差分なので、developにあってマージ先（kaihatsuA）にないコミットも含まれます。差分を正しく見たい場合は、マージ先にdevelopのデータを取り込めばよいです。

これをマージすれば、期待した差分が目的のブランチにマージされた形になります。
転職に向けてポートフォリオの作成

Qiita初投稿です！！

作っていくポートフォリオは、前職が現場仕事だったこともあり、工具を管理することができるアプリを作ろうと思っています。

実装する機能は、

・トップページに新規登録ボタンとログインボタンの配置

・新規登録またはログインした場合にトップページにログアウトボタンに切り替わって表示される

・工具の情報を追加する機能（画像やコメント機能を用いて使い方など）

・追加した工具の情報の編集、削除機能

・工具が壊れてしまった場合に外部の工具購入サイトにアクセスできる画像（リンク）を表示させる

などの機能を追加していきたいと思います。

　　　　　　　　　　　　　　　　　　　　　　　　以上
新規格のOracleDBBronzeについて

# ①はじめに
本記事では、2020年より新規格になった「<b>Oracle DataBase Bronze Fundamentals</b>」(以下Bronzeと略します)
についての注意事項と出てきた問題についてまとめました。
※一部理解が間違っている部分があるかもしれませんが、参考程度で読んでいただけると幸いです。
#②なぜこの記事を書こうと思ったのか
私は、今年入社した新卒になります。しかし、コロナの問題もあり、研修期間が延びてしまいました。
そこで、私は学生時代に取得に失敗してしまった「<b>Bronze</b>」の獲得を目指し再度勉強を始めました。
しかし、勉強し始めて2か月ほどたったある日に新規格になっていたことを知りました。
新規格では、<b>SQL</b>は出題されません。私は、SQLを勉強していたのでやってしまった…と思いました。
[新規格について詳しく知りたい方はこちら](https://www.oracle.com/jp/education/index-172250-ja.html#5)

#③以前の旧規格と新規格では何が違うのか
では、旧規格と新規格では、どのように変わったのかをまとめてみました。

・旧規格の場合
旧規格の場合では、Bronzeの試験を取得するためには、２つの試験に合格する必要があります。
❶DB管理者向け(DBA)試験
　-Bronze DBA12c

❷SQLの書き方など基本的な部分が出題される
　-Bronze SQL基礎I 又は 12c SQL基礎

・新規格の場合
新規格の場合、SQL試験はありません。(silver以上で出題されます)
また、１つの試験に合格するだけで取得が可能になります。
❶Oracle DataBase Fundamentals(1Z0-085)

この試験項目では、<b>SQL</b>は出題されないので注意が必要です。

#④受験するうえでの注意点
❶アカウントを二つ作る必要がある。
Oracleの試験を受験するうえで必要なアカウントが二つあります。

1つ目:[<b>CreateView</b>](https://www.pearsonvue.co.jp/Clients/Oracle.aspx)
2つ目:[<b>Oracle.com</b>](https://education.oracle.com/ja/)

この二つを登録する必要があるので、間違えないようにしましょう。
先に作成するアカウントは、<b>CreateView</b>をお勧めします。
また、Oracle.comにログインした際に初回認証としてCreateViewを使用します。
そのアカウント同士の連携の際に、3回入力を失敗してしまうと、手動認証が必要となります。
手動認証する際には、1営業日内に来るメールでの対応が必要になります。
私の場合、1営業日待ってもメールは届くことはありませんでした。
その場合、Oracleでは電話受付をしていませんので、専用の受付フォームでの問合せになります。
しかし、問合せフォームのエラーで何度試しても送ることが出来ませんでした。
私の場合、10回以上試みてようやく送ることが出来ました。
間違えると面倒なことになるかもしれないので、間違えないようにしましょう。
[サポートセンターはこちら](https://education.oracle.com/ja/help)

❷支払方法
受験をする際の支払いに必要なものはクレジットカードです。
私はクレジットカードを所持していなかったので、苦労しました。

❸身分証明書
顔写真付きのもの1つと保険証以外でもクレジットカードや個人を証明するもの1つが必要です。
私の場合は、「免許証＋保険証」で受験することが出来ました。

#⑤問題の出題形式について
❶5つのなかから２、３個正しいものを選ぶ問題
この形式の問題が非常に多く出てきます。
1つ1つの単語の意味をきちんと覚えてくことが必要です。
また、1つ1つツールがどこまで出来てどこからが出来ないかなども覚えておくことをとても重要になります。
※Oracleのツールには、簡易的に出来るが細かくやるためには違うツールを使う必要なものが多いので注意が必要です。

❷あるケースから〇〇を実行した。正しい結果はどれ
この形式も数は多くありませんが出てくることが多いです。
これも、ツールなどの使用用途をしっかりと理解しておくことが重要です。

❸複数回答なものが多い
❶でも紹介しましたが、OracleDBの問題は複数回答になるものがとても多いです。
1つだけわかっているのに…となることが多くならないようにしましょう。

#⑥まとめ
Bronzeの試験は3万近くかかるので落ちるのが不安になってしまい、なかなか受験しにくい方もいらっしゃると思います。
OracleDBでは、2020年12月から2021年5月末まで再受験が無料になるキャンペーンを実施しているので、落ちることが不安な方でも受けやすい環境になっています。
この機会にOracleDBを取得してみては！！
[キャンペーンサイトはこちら](https://www.oracle.com/jp/education/campaign-1898205-ja.html)
【VBA】高速化設定用チートシート クラス作成

# どんなチートシート？

私が前から欲しいと思っていたチートシートです。
コピペしてサボれるソースをWeb上に置いておきたくて作りました。
これがあれば、過去の私やそれに近しい人がハッピーになれます。

### そもそも

Excelのマクロの高速化には下記のようなテクニックが大切です。

- [VBA高速化テクニック | Office TANAKA](http://officetanaka.net/excel/vba/speed/)
- [マクロVBAの高速化・速度対策の具体的手順と検証 | エクセルの神髄](https://excel-ubara.com/excelvba4/EXCEL228.html)
- [VBA の処理を高速化する | Tipsfound](https://www.tipsfound.com/vba/02014)

その中で、この設定をしておけば早いという項目がいくつかあります。
その設定をコード内の各所で切り替えると、設定の戻し忘れが発生しやすいです。
ユーザー視点から見て、それは怖いので防止策としてクラスを作成しました。

GitHubに上げようかと思ったのですが、コピペで十分なレベルだったため、
サボってQiitaに直接貼っておきます。

# 使い方

大前提として、`Selection`や「１セルごと書き込みの繰り返し」など、
無駄な処理が消込されていることを確認してください。

まずは下記の[クラス内の記述](#クラス内の記述)を基にして、クラスを作成します。

その後、このように`ToFastEnvironment`と`ToDefault`で重い処理を挟みます。

```vb:SampleModule.bas
Public Sub HeavyMethod()
  Dim MyConfig As FastConfig
  MyConfig.ToFastEnvironment("いまとても頑張ってるよ！！")
  '重い処理 Heavy Process...
  Call MyConfig.ToDefault
End Sub
```

# クラス内の記述

```vb:FastConfig.cls
Public Sub ToDefault()
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .DisplayAlerts = True
        .Calculation = Excel.XlCalculation.xlCalculationAutomatic
        .StatusBar = False
    End With
End Sub

Public Sub ToFastEnvironment(message As String)
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .DisplayAlerts = False
        .Calculation = Excel.XlCalculation.xlCalculationManual
        .StatusBar = message
    End With
End Sub

Private Sub Class_Terminate()
    Call ToDefault
End Sub
```

### コード解説

- ToDefault
    - このプロシージャで通常の環境に戻せます。
- ToFastEnvironment
    - このプロシージャで高速環境が実現できます。
- Class_Terminate
    - インスタンスオブジェクトが消滅するときに通常の環境に戻します。
- ScreenUpdating
    - これで画面の更新をオフにしてExcelの表示をフリーズできます。
- EnableEvents
    - これでWorksheet内などで発生するイベントの多重発生を防ぐことができます。
    - 特にセル入力に対してインテリセンス的な処理を行うときに便利です。
- DisplayAlerts
    - これで「本当に消しますか？」系のメッセージをオフにできます。
- Calculation
    - これでセル内の計算の自動実行をオフにしてCPU負荷を減らせます。
- StatusBar
    - Excelのステータスバー（ウィンドウの一番下の細いところ）にメッセージが表示できます。


# 関連先輩記事

[ファンタグレープうめえ](https://qiita.com/loach/items/3ae9100034ecf2d804ce)
[ExcelVBAを高速化する方法](https://qiita.com/kariyaitaru/items/65696800b8f8140f107e)
[VBA(Excel)高速化対策 -配列化編-](https://qiita.com/sango/items/c46a30c62e154077a0c7)
[Excel VBA 高速化における基本設定構文](https://qiita.com/kyokugenultimate/items/0ab9c53c6f8b7fce83aa)
[VBA(Excel)高速化対策 -描画処理無効化編-](https://qiita.com/sango/items/a3949d031bbdda6b0149)
[VBA 二次元配列を使ってシートに高速で書き込む](https://qiita.com/saeki4n/items/cf954b39c43573986d51)

# まとめ

過去数年間の自分よ！これでラクをしてくれ！
それでは、みなさん、また来週！
コピペでステキなサボりライフを！

**Excelsior!**
accepts_nested_attributes_for メソッド：空のレコードができないようにする！

accepts_nested_attributes_for メソッドで苦労した点の記録です。表題の通り、ユーザーが何も入力しなかった場合に空のレコードができてしまうのを防ぐためのメソッドを探して実装した際の記録になります。

####結論
:reject_if proc (もしくはlambda) を使う

####起きていた現象
個人的にはとても便利な accepts_nested_attributes_for メソッドですが、[前回](https://qiita.com/HIROKOBA/items/274aa9f0744fe79f3381)の記事でも編集画面の不具合が出るのを修正したり、結構クセのあるメソッドだなという印象を受けています。

今回取り扱うのは、上にも書いた通り「ユーザーが何も入力しなかった場合に空のレコードが発生してしまう」というもの。といっても、何も入力しなけりゃそりゃ空のレコードができても仕方ないよ、と思ってしまうのですが、この状況を解消したいと思って調べてみました。

####問題解決のためにやったこと
今回は大したことやっておらず、とりあえずRailsガイドで調べてみた[こちらの記事](https://railsguides.jp/form_helpers.html#%E7%A9%BA%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)を見つけました。

>9.5 空のレコードができないようにする
ユーザーが何も入力しなかったフィールドを無視できれば何かと便利です。これは、:reject_if procをaccepts_nested_attributes_forに渡すことで制御できます。

早速使ってみます。

```models/user.rb
class User < ApplicationRecord
  has_many :blogs, dependent: :destroy
  accepts_nested_attributes_for :blogs, reject_if: proc {|attributes| attributes['title'].blank? and attributes['content'].blank? and attributes['blog_num'].blank?}, allow_destroy: true
end
```
確かに、これで編集画面で空のレコードが登録されてしまう不具合は出なくなりました。

一点気になるのが、Rails ガイドの解説文では :reject_if proc を使うと書いてあるのに、用例では :reject_if lambda を用いていました。

>ユーザーが何も入力しなかったフィールドを無視できれば何かと便利です。これは、:reject_if procをaccepts_nested_attributes_forに渡すことで制御できます。このprocは、フォームから送信された属性のハッシュ1つ1つについて呼び出されます。このprocがfalseを返す場合、Active Recordはそのハッシュに関連付けられたオブジェクトを作成しません。以下の例では、kind属性が設定されている場合にのみ住所オブジェクトを生成します。

>class Person < ApplicationRecord
  has_many :addresses
  accepts_nested_attributes_for :addresses, reject_if: lambda {|attributes| attributes['kind'].blank?}
end

proc でも lambda でも不具合は解消されましたが、２つがどう異なるのか現時点ではうまく説明できません。。。これも解決したら記事を更新しようと思っています。

今回の不具合も accepts_nested_attributes_for メソッド を使うと起こりがちらしいので、使う場合は気をつけたいと思います。
【Java】変数を初期化しなくてもいい時・しなきゃいけない時（+初期化の方法いろいろ）

#はじめに
Javaの勉強を始めたばかりの頃、「<b>変数は宣言時に初期化するもの</b>」と覚えました。

```java:宣言時に初期化
int a = 3;
```
でも、Java Silverの勉強をして、Javaでは<b>宣言した変数を初期化しなくてもコンパイルエラーにならないケースがある</b>ことを知りました。そして、初期化の方法は上記以外にも色々あるらしいということも・・・
　
勉強の一環でまとめてみました。

#変数を初期化しなければならないケース
###１　変数がローカル変数の場合
　ローカル変数は自動的に初期化されないので、自分で初期化しなければならない。
※　ただし、配列だけは自動で初期化される。

###２　クラス変数・インスタンス変数を「final」で定数化した場合
「<b>final</b>」で修飾された変数は定数として扱われ、一度設定した値は変更することが出来ない。この場合も、初期化しないとコンパイルエラーになる。

#変数を初期化しなくてもいいケース
###変数がクラス変数・インスタンス変数の場合
変数がクラス変数、またはインスタンス変数の時は、明示的に初期化しないと、既定の値が初期値として入る。つまり、初期化するためのコードを書かなくてもコンパイルは通る。

既定の値は型に応じて、以下の様に設定されている。


|種類|型|デフォルト値|
|:-----------:|:------------:|:------------:|
|整数|int/short/byte/long|0|
|浮動小数点数|float/double|0.0|
|文字|char|\u0000|
|真偽値|boolean|false|
|参照型|String/配列/クラス等|null|

　
#初期化の方法いろいろ
変数の初期化には、意外と色んなやり方がある。
###１　変数宣言時に初期化
一番基本的な方法。

```java
int a = 4;
```
 
###２　コンストラクタで初期化（インスタンス変数）
インスタンス変数の場合、変数の宣言だけしておいて、インスタンス化された時にコンストラクタで初期化するという方法をとることができる。

```java
Class Sample{
  int a;
  String b;
  Sample(int a, String b){
    this.a = a;
    this.b = b;
  }
} 
```

 
###３　初期化子・static初期化子を用いて初期化（クラス変数・インスタンス変数）
初期化子を用いて初期化する方法もある。初期化子には、以下の２種類がある。

<b>（１）初期化子</b>
　→　全てのコンストラクタで共通する前処理を実行するために記述。コンストラクタが実行される前に実行される。
<b>（２）static初期化子</b>
　→　クラス変数を初期化するための何らかの処理を記述するときに用いる。クラスのロード時に実行されるのでstatic 変数のみにアクセスできる。

```java:初期化子
Class Sample{
  int a;
  String b;
  {
    a = 3;  //コンストラクタが実行される前に実行
    b = 4;
  }
  Sample(){ }
} 
```
 
```java:static初期化子
>|java|
Class Sample{
  static int a;
  String b = "test";
  static{
    a = 3;  //クラスのロード時に実行
  }
} 
```
お酒の失敗を防ぐ機械

##書こうと思った動機
この記事を書こうと思った理由は僕らは来年からは成人になります。今はまだ未成年でお酒を飲むことが出来ませんが、来年からは飲むことが出来る年齢になります。
会社での付き合いや友人との付き合いできっとお酒を飲んだりする機会が多いと思ったからです。また、**お酒による失敗談などを大人からよくきいたりします。**

##アルコール測定リストバンド
アルコールの検査といえばよく思いつくのは息を吹きかける方を思い浮かべますよね。しかし、このアルコール測定リストバンドを使えばわざわざ吹きかけて度数を図る必要がなくなります。
このアルコール測定リストバンドは**汗に含まれる体内の化学物質を内蔵した特殊センサーが検出してくれます。
**そのため、リアルタイムで血中のアルコール度数を見ることが可能なのです。
また、血中アルコール度数のデータをスマホに送信してくれます。そして、酔いすぎないための解決策として自分がこの辺で飲むのを**辞めた方がよいと思う血中アルコール度数を決めれば、その度数に達した時点で警戒アラートがでてきます。
**私がこの機械の凄いと思うところは**飲んだ後にどの程度の時間を置けば運転が可能なまでに酔いが引くかを教えてくれるのです。
実際のアルコールの分解具合は体格や体質により異なりますが、このアルコール測定リストバンドをつけていれば正確にアルコールの引き具合を判断してくれるので、体格や体質による差を気にする必要がなくなります。

##メリット
**①酔いすぎることを防げる。**

**②機械が通知をしてくれるので客観的な目線で酔い具合の程度を知れる。**

**③アルコールを摂取してからどの程度で車に乗れるか知ることが出来る。**

##デメリット
**①酔ったふりができない。**

##まとめ
最近の技術は、腕に巻くものが多くなったと感じた。例えば、リストバンドで脈拍をはかったり、血圧を測定したりするなどが多くなったと思いました。これからの社会は体の変化に対するものをデータにしてとるものが増えていくと感じました。私も技術者としてもっと勉強して視野を広げて活躍できる技術者になりたいと感じました。

引用元：http://hero-x.jp/movie/6632/