OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Kinect Sensor SDKをソースコードからビルドする

3D Sensor Advent Calendar 2019の5日目の記事です。

この記事ではAzure Kinect Sensor SDKをソースコードからビルドする方法を紹介します。

開発環境
--------
以下の開発環境を使用しました。

* Windows 10
* Visual Studio 2019
* CMake 3.16.0
* Git for Windows 2.24.0
* Azure Kinect Sensor SDK v1.3.0

ビルド方法
---------
1. GitでAzure Kinect Sensor SDKをクローンする。
   以下のコマンドを実行してAzure Kinect Sensor SDKをクローンする。<sup>*1<sup>
   この記事では<code>C:\Azure-Kinect-Sensor-SDK</code>にクローンしたとして説明します。

     ```
     git clone https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git
     cd Azure-Kinect-Sensor-SDK
     git checkout -b v1.3.0 refs/tags/v1.3.0
     ```
   
2. CMakeでAzure Kinect Sensor SDKのビルドファイルを生成する。
   CMake-GUIを管理者権限で起動、以下の操作を行う。<sup>*2</sup>

     1. ソースコードの入力先とソリューションファイルの出力先を指定する。
       * **Where is the source code:** C:/Azure-Kinect-Sensor-SDK
       * **Where is build the binaries:** C:/Azure-Kinect-Sensor-SDK/build 

     2. [Configure]ボタンを押してターゲットとなるVisual StudioとPlatformを指定する。
       * **Specify the generator for this project** Visual Studio 16 2019
       * **Optional platform for generator(if empty, generator uses: x64)** x64

     3. 各種設定を行う。(GroupedとAdvancedにチェックを入れるとわかりやすい。)
       * **BUILD**
         * **BUILD_TESTING** ☐(uncheck)
       * **CMAKE**
         * **CMAKE_INSTALL_PREFIX** C:/Program Files/K4A <sup>*2</sup>

     4. [Configure]ボタン、[Generate]ボタンを押してVisual Studioのビルドファイルを出力する。

     5. [Open Project]ボタンを押してVisual Studioを起動する。

3. Visual StudioでAzure Kinect Sensor SDKをビルドする。
     1. Visual Studioでソリューション構成をRelWithDebugに設定する。
     2. ALL_BUILDプロジェクトをビルドする。

4. Visual StudioでAzure Kinect Sensor SDKをインストールする。
     1. INSTALLプロジェクトをビルドする。
     2. CMAKE_INSTALL_PREFIXで指定したディレクトリ（C:/Program Files/K4A）にインストールされる。

5. Azure Kinect Sensor SDKのインストーラー、またはNuGetのパッケージからdepthengine_2_0.dllをコピーする。
     1. K4A/binディレクトリにdepthengine_2_0.dllをコピーする。<sup>*4</sup>

環境変数
-------
1. 環境変数PathにAzure Kinect Sensor SDKのパスを追加する。
     * C:\Program Files\K4A\bin

まとめ
-----
Azure Kinect Senosr SDKをソースコードからビルドする方法を紹介しました。
ソースコードからビルドする方法を知っておくと、バグに遭遇したとき内部まで詳しく調べることができるようになります。
また、k4aConfig.cmakeなどのCMakeでAzure Kinect Sensor SDKを検出するために必要なファイルもインストールされます。
CMakeでプロジェクトを管理するときに大変便利になります。

明日12/6(金)はd_forestさんで「C++初心者がKinectV2 + PCLでトラッキングした話」です。私はPCLのコミッターをしているので個人的にとっても楽しみにしています！

---
<sup>1. Azure Kinect Sensor SDKは依存関係をgit submoduleで管理しているため、ZIPでダウンロードすると依存関係を自動的に解決できません。必ずgit cloneでダウンロードしてください。</sup>
<sup>2. CMake-GUIを管理者権限で起動しておくと[Open Project]ボタンを押して起動したVisual Studioも管理者権限で起動します。これはINSTALLプロジェクトでインストールするときに権限関連でエラーになるのを防ぐことができます。もしINSTALLプロジェクトをビルドしたときにエラーになったときは、Visual Studioが管理者権限で起動しているか確認しましょう。</sup>
<sup>3. CMAKE_INSTALL_PREFIXはINSTALLプロジェクトでインストールされるディレクトリです。デフォルトではC:/Program Files (x86)/...になっているため、ターゲットプラットフォームがx64の場合は手動でC:/Program Files/...に変更しておきましょう。</sup>
<sup>4. depthengine_2_0.dllはクローズドソースなため自分でビルドすることはできません。Azure Kinect Sensor SDKのインストーラーまたはNuGetパッケージに含まれて配布されています。Azure Kinect Sensor SDKをソースコードからビルドした場合はこれらからdepthengine_2_0.dllを手動でコピーしてくる必要があります。</sup>
GoのNull許容型guregu/nullの使い方

# 概要

GoでStringやIntのNull許容型をguregu/null packageで扱うときの方法を示す。

# 使い方

```
import "github.com/guregu/null"
```

`"github.com/guregu/null"` をimportする。

## null.Bool

`null.NewBool` で初期化する

```
bool := null.NewBool(true, true)
```

第1引数は値、第2引数はこのstructがnullかどうか

## null.Int


`null.NewInt` で初期化する

```
int := null.NewInt(1, true)
```

第1引数は値、第2引数はこのstructがnullかどうか

## null.String

`null.NewString` で初期化する

```
string := null.NewString("example text", true)
```

第1引数は値、第2引数はこのstructがnullかどうか

## structで使うとき

```
type ExampleStruct struct {
    fieldBool    null.Bool
    fieldString  null.String
    fieldInt     null.Int
}
```

# サンプルコード

[Go Playground](https://play.golang.org/p/zcIotSdmqXq)
Raspberry Piで電子回路開発はVSCode Remote Developmentがイイ感じ

## まえがき

RaspberryPiで回路系のプログラミングの際は、どんな環境で開発していますか？
以下のようなストレスをお持ちの方に、VSCodeの `Remote Development` プラグインの ご提案です！RaspberryPiに限らずサーバ上で直接開発したいニーズにもそのまま対応可能です。

   * RasberryPiのデスクトップ環境でエディタで開発
     * 普段利用する環境ではないので操作が不慣れだったり、調べ事しながらだと辛い。
   * RaspberryPiにIDEをインストールして開発
     * スペック的に厳しい。動作重そう。
    
   * RaspberryPiにSSHで接続してvim や emacs で開発。
     * 普段コンソール上で開発しない人にとっては辛い


## 提案

VSCodeの `Remote Development` プラグインを使うと、
RaspberryPi に sshで接続することさえできれば、いつも使っているパソコンで直接開発が可能です。
動作も早くとても快適に開発できます。(主観です)
何よりIDEの恩恵が受けられ、手元でググりながらができるので捗ります！（VSCode縛りになってしまいますが。。。）
ぜひやってみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/ecfa2eda-3cab-5300-9f6d-c2a6b2db3892.png)



## 利用手順

### 前提
* VSCodeがインストールされている前提で説明します。
* RaspberryPi に ssh できることを前提に説明します。
* 手元の環境は mac を前提に説明します。


* 動作環境 （2019-12-07 9:17 加筆）
  - ARMv6系のCPUは サポートしていないようです。Raspberry Pi でいうと、初代とZero はダメそうです。
  - [動作環境参考](https://code.visualstudio.com/docs/remote/linux)
  - @m_take さん ご確認いただきありがとうございました。



### VSCodeの `Remote Development` プラグインをインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/922774c5-1fd6-6852-545d-f4d81fe694ef.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/196f3cae-8ff4-2236-b0b1-7c6f2526ef03.png)



###  接続

* 左下の青いアイコンをクリックして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/b3536ea7-9045-ff8a-16fa-10d5e25a8666.png)

* コマンド窓で、 `Connect to Host`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/63b48234-2774-9850-60da-b2a90ac5a8c5.png)


* RaspberryPi の 接続先を 入力して `Enter`
    * 私の場合は、 `pi@192.168.0.110`


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/67b40399-3ba0-e1a0-f0cf-daf732ee03c3.png)


* パスフレーズやパスワードなどの入力が求められるので入力すると接続されます！
  * ssh の設定は、.ssh/config をきちんと参照してくれているようです。（楽ちん）


### フォルダを開く

RaspberryPiと繋がっていれば、OpenFolderでRaspberryPi の フォルダ（ディレクトリ）が指定できます！
ここからはもう、いつものVSCodeですね！ 煮るなり焼くなり好き勝手やってください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/d8dc6b05-9755-b94c-cd79-256c61bfa49a.png)


### ローカルで開発しているような気分！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/eafdee5e-9102-11a9-471a-a1b8c74166ec.png)

* ターミナルを開くと ちゃんと RaspberryPi に 接続された画面が出てきます。
    * ここでコマンド実行などできそうですね！

* VSCode上の git も使えます！
   * VSCodeの GUIでやるか、
   * RaspberryPi上でgitをインストールしてターミナルでコマンド叩くのもありですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/2b659525-ef0f-b280-13ae-a3daf05d1f3c.png)


* [Lチカ動画](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21391/640849b3-5e16-656c-d538-0bbf472b9273.gif)のgif


## あとがき
* Webエンジニアも気軽に RaspberryPi で開発できると良いですね＼(^o^)／
* Remote Development を知ったのは、 [gigazine](https://gigazine.net/news/20191120-facebook-microsoft-partnering-remote-development/)さんの記事でした。ありがとうございます！
* 久しぶりに Lチカ（LEDチカチカ）をやったので、 Lチカに関しては、[こちらの記事](https://qiita.com/masato/items/715e28e0c0c945a54297)を参考にさせていただきました！
* RaspberryPi4買ってしまいました＼(^o^)／!
conversations.list でプライベートチャンネルの一覧を取得するとき、プライベートチャンネルの作られ方でレスポンスの中身が変わる


実際に自分でAPIを叩いてよくわからず、ヘルプに問い合わせて確認、理解した内容のメモです。
2019年12月ごろ。

### TL;DR

* [conversations.list](https://api.slack.com/methods/conversations.list) を使ってプライベートチャンネルを取得するとき、**チャンネルの作られ方**によってレスポンスボディの中身が変わる
* プライベートチャンネルのみを取得したいのであれば、取得した json を集計するより、最初からリクエストのオプションを指定したほうがよい
* [groups.list](https://api.slack.com/methods/groups.list) は非推奨なので使わない

# conversations.list について

Slackでは、WebAPIを使って様々なデータを取得できます。
所属するチャンネルの一覧を取得したい場合は、 [conversations.list](https://api.slack.com/methods/conversations.list) を使えます。
このAPIは、所属するワークスペースのチャンネル(=conversations)、DM(=im)、および複数人でのグループ会話(=mpin) に関する情報が取得できます。

## Slackでの【プライベートチャンネル】のでき方について

Slackでは、二通りの方法でプライベートチャンネルが作成できます

- 最初からプライベートチャンネルで作成する
- パブリックチャンネルで作成し、途中でプライベートチャンネルへ変更する

## 最初からプライベートチャンネルで作成した場合  

`conversations.list` でのレスポンスボディの中で、

```
"is_channel": false,
"is_group": true,
```

となります。
もともと `is_channel` はパブリックチャンネルであることを意味するbooleanで、 `is_group`がその対になるプライベートチャンネルを意味するbooleanです。

## 最初にパブリックで作成したあとにプライベート化した場合

このケースの場合、 `conversations.list` のレスポンスとしては

```
"is_channel": true,
"is_private": true,
```

として扱われます。
最初にパブリックで作成したタイミングで、 `is_channel` が true となり、その後プライベート化すると、 `is_group` が true になるのではなく、 `is_private` が true になる、という挙動をします。

上記により、プライベートチャンネルの作成の仕方によって、同じプライベートチャンネルであってもレスポンスボディに含まれる属性に差がでます。

## 【パブリックチャンネル】だけを取得するなら、クエリストリングで指定を

HTTPリクエストのクエリストリングで `types` オプションが使用でき、指定しなかった場合はデフォルトで `public_channel` として扱われます。パブリックチャンネル/プライベートチャンネル両方を取得したい場合は、 `&types=public_channel,private_channel` と、カンマ区切りで指定します。
あとで json を集計するより、こちらのほうが楽でしょう。
ただし、「全チャンネルを取得して、パブリック/プライベートに仕分けたい」場合は、この方法だと同じAPIを2回叩く必要があるので、ちょっとだけ面倒です。

## 非推奨APIについて

チャンネル情報の取得のためのAPIとして、パブリックチャンネル情報のための [channels.list](https://api.slack.com/methods/channels.list) と、プライベートチャンネルのための [groups.list](https://api.slack.com/methods/groups.list) というAPIがあります。
この二つは既に非推奨となっており、 `groups.list` のほうは正確にデータを取れない場合があるというバグもあるので、使わないようにしましょう。

`Don't use this method. Use conversations.list instead.`
Maplat Core（UIなし版）をnpmから設定

Maplat Advent Calendar 3日目は、Maplat Coreをnpmから設定する方法です。
npmから設定すると言っても、相変わらず画像ファイルはローカルに配置するのですが...

今日の内容が動くバージョンは、CodeSandBoxのこちらで公開されています。 => [CodeSandBox Maplat Advent Calendar day 3](https://codesandbox.io/s/maplat-advent-calendar-day3-cxg9e)

npmを使うので、まずは`package.json`を設定しましょう。

```package.json
{
  "name": "maplat-advent-calendar-day3",
  "version": "1.0.0",
  "description": "",
  "main": "index.html",
  "scripts": {
    "start": "parcel index.html --open",
    "build": "parcel build index.html"
  },
  "dependencies": {
    "@maplat/core": "0.6.2"
  },
  "devDependencies": {
    "@babel/core": "7.2.0",
    "parcel-bundler": "^1.6.1"
  },
  "keywords": []
}
```
`dependencies`で`@maplat/core`の0.6.2を読み込んでいます。

CodeSnadBoxでは変更かけるとすぐ反映してくれますが、ローカルでやる場合は当然`package.json`を変更するだけでなく、`npm install`などが必要です。

続いて、`index.html`、`app.css`などはほぼ同じなので、大きく変わるのは`app.js`。

```app.js
import "@maplat/core/dist/maplat_core.css";
import { MaplatApp } from "@maplat/core";

var option = {
  appid: "maplat_ac_day3",
  setting: {
    home_position: [139.5321, 36.249302],
    default_zoom: 17,
    start_from: "tatebayashi_ojozu",
    sources: [
      {
        mapID: "tatebayashi_ojozu",
        setting_file:
          "https://s.maplat.jp/r/tatebayashimap/maps/tatebayashi_ojozu.json"
      },
      "osm"
    ]
  }
};

var app = new MaplatApp(option);
app.waitReady.then(function() {
  console.log("Maplat App Ready");
});
```
まず、`import`で`@maplat/core/dist/maplat_core.css`を指定し、cssを読み込んでいます。
こんな構文はES6にはなく、完全にparcel環境依存なのですが、まあそれはいいでしょう。
続けてやはり`import`で、`@maplat/core`から`MaplatApp`クラスを読み込んでいます。

`option`は昨日とほぼ一緒。

違うのはMaplat Coreのオブジェクトを作るところです。
npm呼び出しの場合は、`new`構文で`MaplatApp`のオブジェクトを作り、そのオブジェクトのプロパティ`waitReady`が`Promise`を返すので、それを`then`や`await`で待ってオブジェクトを作ります。

これは、CDN呼び出しの方のインタフェースが、まだMaplatがモジュールシステムに`require.js`を使っていた頃の名残なので、将来的にCDN呼び出しの場合もnpmの方のインタフェースに合わせる可能性があります。
もっとも、CDN呼び出し側の後方互換性も維持するつもりではあります。

そして最後に、昨日同様、`parts`フォルダ下の画像リソースを`index.html`と同階層に配置すると、動作するようになります。

動作結果は昨日と同じなので省略。

明日は、このMaplat Core地図の設定を外部ファイルで指定する方法を試してみます。
Linux Ubuntu16.04 sudoを使ってコマンドを実行したらちょっと怖いエラーが出た

# 目的

- ユーザ作成直後、作られたユーザにログインしてsudoをつけてコマンドを実行したときに出たエラーを解決した話をまとめる。

# 結論

- 新規作成したユーザをsudoのグループに追加していなかった。

# 起きたこと

- sudoをつけてコマンドを実行したところ下記のエラーが出た。実行環境のユーザは`miriwo`とする。

    ```terminal
    $ sudo su
    [sudo] password for miriwo:
    >miriwo is not in the sudoers file. This incident will be reported. (和訳: sudoersファイルにmiriwoが登録されていません。このインシデントは報告しました。)
    ```
　
# 行った作業

1. 管理者権限を持っているユーザでLinuxマシンにログインし下記コマンドを実行してユーザ`miriwo`を作成した。

    ```terminal
    $ sudo adduser -a miriwo
    ```

1. ユーザ`miriwo`にログインし下記コマンドを実行した。

    ```terminal
    $ sudo su
    ```

1. ユーザ`miriwo`のパスワード入力後に下記のエラーが出た。

    ```text
    miriwo is not in the sudoers file. This is incident will be reported
    ```

# 解決方法

1. 管理者権限のあるユーザでLinuxマシンにログインし下記コマンドを実行した。

    ```terminal
    $ sudo gpasswd -a ookawa sudo
    ```

1. 確認のため再度ユーザ`miriwo`でLinuxマシンにログインし下記コマンドを実行した。

    ```terminal
    $ sudo su
    ```

1. エラーが出なくなったことを確認した。
コーポレートエンジニアのススメ

# コーポレートエンジニアをやってみよう

あなたは今の仕事にやりがいを感じていますか？
人の役にたちたくてエンジニアになったのに、裏方ばかりでちっとも実感が得られない。
そんな気持ちになったことはありませんか？
もしかしたら、そんな方にはコーポレートエンジニアという仕事が向いているのかもしれません。

# コーポレートエンジニアって何？

コーポレートエンジニアは、会社のためのエンジニアです。
たとえば弊社Hameeではネクストエンジンというツールを作っており、ほぼ全員がこのネクストエンジンに関わるエンジニアです。
しかし、コーポレートエンジニアは異質な存在です。
ネクストエンジンを発展させるためではなく、会社を発展させるためのエンジニアです。

たとえば、普通のエンジニアは、お客様や営業さんからの要望、または新しい企画を考えて新しい機能を作ったり、不具合があれば直したり、サポートをしたり、といった働き方です。

しかし、コーポレートエンジニアは、「社内の〇〇さんが困っているからなんとかしてあげる」のが仕事です。

つまり、何か世間に出すプロダクトを作るためのエンジニアではなく、あくまで会社をITで便利にしていきます。

# 仕事の進め方

エンジニア以外の普通の人は、たいてい毎日同じような作業を繰り返しているものです。
同じようなデータ修正だったり、同じようなデータ作成だったり、毎日毎日つまらない作業をやっているものです。
それは仕事ではありません。もはやただの単純作業です。

来る日も来る日もCSVの順番を入れ替えたり、毎日毎日同じような計算を電卓でするのは、まったくクリエイティブではありません。

「それをなくしてしまったらその人の仕事がなくなってしまう」という人がいるかもしれませんが、いざ無くなってみれば、たいていの人はもっと他にやってみたいことがいくらでもあることに気づくものです。

もしかしたらCSVを入れ替える作業がなければもう1件多くの営業先に回れるかもしれない。
もしその退屈な計算がなければ、あたらしいサービスがひらめくかもしれない。
新しいWEBサイトの構想を練る時間ができるかもしれない。

単純作業がなくなった先には、そんな無限の可能性があるものです。

「おかげで残業が無くなって、早く帰れるようになった」と嬉しそうな顔で言われたら、こちらまでうれしい気持ちになります。
みなさんの家族との大切な時間や、プライベートの時間がたくさん確保できるというのは、その人はもちろん、会社にとっても非常に良いことでしょう。

とにかく、いろいろな人の仕事を見て、「クリエイティブでない」と思う場面があれば、積極的に自動化していきます。

# 会社の利益

一般に出さないものを作るので、一見会社の利益に貢献していないように思われるかもしれません。
しかし、もっとも会社の中でコストになるのは人件費です。
コーポレートエンジニアは、この人件費をゴリゴリ削っていきます。
無くなった人件費を単純に減らすと、当たり前のように億単位で経常利益がでます。

100人が毎日やっている作業をゼロにすれば、1年後には1億円以上のコストカットが成立していることになります。

コーポレートエンジニアは、会社にとって非常にコストパフォーマンスが高い存在です。

# 会社全体の士気が上がる

めんどくさい作業、誰もやりたくない作業というのは、仕事をしていれば普通にあるものです。
そして、それが当たり前だと思っています。

しかし、コーポレートエンジニアがいれば、それが当たり前ではなくなります。
そしてその分、その人の能力を最大限に発揮する仕事が出来ます。
そうすればみんな、「ここは良い会社だな」と思います。
自分がやりたい仕事ができるというそんな当たり前のことだけでこんなに喜んでもらえます。

# エンジニアもうれしい

大体の人が「やってほしいけど多分無理だよね？」というスタンスで聞いてくるので、実現すると本当に喜ばれます。
褒められてうれしくない人はいません。
エンジニアのやる気もアップします。

# ぜひやってみてください

何かと面倒くさがられるコーポレートエンジニア。
経営側の人も、エンジニアの人も、「こっちも仕事があるんだ」とか「人の話を聞くなんてめんどくさい」とか「会社の利益にならない」なんて言わずに、ぜひ挑戦してみてください。
良いことしかないですから。
iOS13以降でPush通知が届かなくなってしまったので調査した件について

人生で初めてQiitaに投稿します。
めっちゃ緊張してます。
Qiitaの文字3回うち間違えました。

なお、この記事の元ネタはもともと私が書いていたブログに書いていたものをリライトしたものです。

リライトしているのでこちらの方まだ読みやすいのはわかってますが、それでもほんのちょぴっとでもブログの方を覗いてもらえると嬉しいです。
https://yara-shimizu.com/2019/10/05/ios-ver13/

# iOS13になってPush通知が届かなくなってしまった？？
タイトルの通り、iOS13にPush通知が届かなくなったので調べました。

## 環境
Mac Mojave 10.14.6
xcode 11(おそらく10以下でも発生する)
iOS 13.4.1
Objective-C

## 現象
・iOS12以前は正常にPush通知が送れている
・iOS13以降でのみ通知が届かなくなった

## 原因
これが100%原因かどうかはソースを見ないとなんとも言えないですが、私の場合はトークンを取得する次のコードの「description」が原因でした。

```objc

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //デバイストークン取得後の処理 "<" ">" " "を削除
    NSString *token = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""]
                   stringByReplacingOccurrencesOfString: @" " withString: @""];
}
```

こんな感じでdeviceTokenを取得して、不要な文字列を削除して通知に利用するというような運用でしたが、iOS13以降ではdescriptionの返り値が変更になったようで別の方法を使わないといけないよう。~~このク◯が、、、~~~

|バージョン|返り値|
|---|---|
|iOS12以前|<00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000>|
|iOS13以降|{length = 32, bytes = 0x00000000 00000000 00000000 00000000 … 00000000 00000000 }|


## 解決方法
descriptionがいけないということで、関数を自作して対応をします。
天下のFacebook様も同じ対応をしています。
参考：https://forums.developer.apple.com/thread/117545

```objc

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [self hexadecimalStringFromData:deviceToken];
}

- (NSString *)hexadecimalStringFromData:(NSData *)data {
    NSUInteger dataLength = data.length;
    if (dataLength == 0) {
        return nil;
    }

    const unsigned char *dataBuffer = data.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
    for (int i = 0; i < dataLength; ++i) {
        [hexString appendFormat:@"%02x", dataBuffer[i]];
    }
    return [hexString copy];
}
``` 

## 最後に
初めてQiitaで記事をかきましたが、サイトのデザインがきれいなので中身が私みたいにゴミでもなんだかそれっぽくなりますね。

またxcode等で困った出来事があったらQiitaに書くかもです。

なにか間違い等の指摘がございましたらコメントくださると嬉しいです。

読んでくださってありがとうございました。
macOS CatalinaでApacheにMySQL的なものを入れたけど苦労した

macOS CatalinaでApacheにMySQL的なものを入れようとしたのですがめっちゃ苦労したので、メモとして残しておきます。

# やったこと

[前回、Apacheを入れたとき](https://qiita.com/Ytz_Ichi/items/5a2db7602dd59a826458)と同様、実際は[ここ](https://getgrav.org/blog/macos-catalina-apache-mysql-vhost-apc)を参考にしたので書いてあることはほぼ一緒。

## mariaDBを入れる

参考にしたサイトだと、MySQLの代替でmariaDBなるものを入れていた。
雑に説明すると、RHELとかCentOS、Wikipedia英語版とかでMySQLの代替として採用されているらしい。
詳しく知りたい人は自分で調べてください。

homebrewでmariaDBをインストールする。

```zsh
brew install mariadb
```

起動する。

```zsh
$ brew services start mariadb
```

MySQLサーバーのパスワードを変更する必要があるらしい。
以下のコマンドを入力。

```zsh
$ sudo /usr/local/bin/mysql_secure_installation
```
参考にしたサイトに"You can just press return when prompted for the current root password."と書いてあったので、sudoしたあとにrootのパスワードを求められたときにreturnを叩く。

```
Enter current password for root (enter for none):
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

**…いやなんかエラー出たが？？？？**
調べると、MySQLが起動していないと出るらしい。
多分mariaDBを入れる前にHomeBrewでMySQLを入れたのが良くなかったっぽそう。

というわけで一旦mariaDBもろとも削除して再インストール。

```zsh
$ brew uninstall mysql
$ brew uninstall mariadb
$ brew install mariadb
```

…ダメそう（白目）

もうちょっと調べると、どうやらMySQLのファイルを完全に消しきれてないっぽい。

というわけで完全に抹消するべく以下のコマンドを入力。

```zsh
$ brew uninstall mysql
$ brew uninstall mariadb
$ sudo rm -rf /usr/local/mysql
$ sudo rm -rf /Library/StartupItems/MYSQL
$ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
$ sudo rm -rf /Library/Receipts/mysql-.pkg
$ sudo rm -rf /usr/local/Cellar/mysql*
$ sudo rm -rf /usr/local/bin/mysql*
$ sudo rm -rf /usr/local/var/mysql*
$ sudo rm -rf /usr/local/etc/my.cnf
$ sudo rm -rf /usr/local/share/mysql*
$ sudo rm -rf /usr/local/opt/mysql*
```
リベンジする。

```zsh
$ sudo install mariadb
$ sudo /usr/local/bin/mysql_secure_installation
```
```
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...
```
お、成功した！良かった…
あとはデータベース管理ソフト入れるなりすれば使えるはず…


# あとがき
疲れた。
[](
MySQLちょっと嫌いになりました。
)

# 参考
[macOS 10/15 Catalina Apache Setup: MySQL, Xdebug &amp; More... | Official home of Grav CMS](https://getgrav.org/blog/macos-catalina-apache-mysql-vhost-apc)
[「ERROR! The server quit without updating PID file」となり、MacOSでmysqlにアクセスできない。 - Qiita](https://qiita.com/furafura_nau/items/7d8f5370899df125d459)
【Notch】AE＆C4Dユーザーが作るリアルタイムモーショングラフィックス #05 Deformer編

#Deformer使えるなら3DCG表現割といけるのでは
いつもはデフォーマーみたいな3Dの機能つかいたいときはAEのみでは難しいのでC4Dと連携作業してました。
Notchはデフォーマー標準搭載なので中で完結できそうって思いました。

ノード紹介して実際にやった事例について書きたいと思います。

#Deformerの種類
デフォーマーはかなり豊富に種類あります。
概要と使い方を紹介します。

公式にあるリストに日本語で概要書き込みました。これ見てもらえるとこんな見た目になるよっていうのがわかりやすいかなと思います。
![Defo024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/805605b2-99e4-7d69-9cc1-1f5783da8afe.jpeg)
（画像ソース　公式より許可いただいてます。http://manual.notch.one/0.9.23/en/topic/nodes-deformers ）


その他この記事を書いている「バーション0.9.23」現在では追加デフォーマがいくつかあります。
**・Face Tracking Deformer**・・・Face Trackerノードと併用して表情追跡や変形を加える。
**・MDD Deformer**・・・MDDファイルによる変形　（MDDファイルぐぐりましたけどわかりません。。。なんでしょうこれは）
**・Particle Bone Deformer**・・・公式に説明なし。チャンクに対してパーティクルのアフェクタを使用できます。
**・Morph Controller**・・・公式に説明なし。形状のモーフィングができると思われる。使い方がわからなかった。
**・Water Ripple Deformer**・・・公式に説明なし。Rippleと違い繋いだだけでは何も起こらず。わからないので掘ってみたい。

#使い方
基本は変形したいオブジェクトからデフォーマーへつなぎます。
一部Generate Weightmap Deformerなど別のデフォーマーノードと併用することで機能するものもあります。
![Defo02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/4209d1e9-a4c5-467c-37cd-87924425099a.png)

#事例①
####・NEORTアート展示作品 at渋谷Fab Cafe https://neort.io/art/blpralc3p9fd22fs4ua0

＜水面の光のうねりと広がる波紋表現＞
①Shape3D の「Plane」を作り、HDRI環境マップを設定したマテリアルを貼り付ける。

②Shape3D の「Plane」のSubdivisionXYを上げ、キメの細かい平面にする。

③**「Turbulence Deformer」**を繋いで細かいうねりのような揺らぎを生成。
（この記事書いてて「Ocean Wave Deformer」があること知りました。こっちのほうがよかったかも）

④**「Ripple Deformer」**で真ん中から広がる大きな波紋を生成。

⑤**「Smooth Deformer」**で滑らかにする。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/940206b0-ba53-0695-68c3-1a2202114866.png)
![Defo01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/3646fc03-141f-0092-f7c5-72e4785f4833.png)

#事例②
VJ素材の一部として作ったもの
＜オブジェクトをねじる表現＞
①Shape 3Dの「Plane」に**「Twist Deformer」**をかけてねじる

②「Clone to Mesh」で上記のねじったオブジェクトに対してスフィアのクローンを生成

（作った後思ったのですがこれClonerのグリッドモード×Plain Effectorでもできそうですね。そのほうが制御が楽そう）

![Defo03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/f8d9de72-4aba-4596-5eed-ed75147dd4ad.png)

![Defo04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243114/5f1707a6-17e4-f87e-5aaf-0bf32c23ee62.png)

#次回
Modifier編
https://qiita.com/Shuhei_Maeta/items/dec7bf52bfa7875bf6fe

情報共有はこちらのグループで行っているのでぜひ参加してみてください。
Facebookグループ : https://www.facebook.com/groups/notchusergroupjapan/
Line オープンチャット : https://line.me/ti/g2/kJYmLLsvS2zNfR9PEiknMg

質問等あればお答えしますのでお気軽に
Twitter : https://twitter.com/shu1053
FB : https://www.facebook.com/profile.php?id=100009103327410
【zsh】zshの動作が毎回６秒もかかっていたので.zshrcから犯人を見つけて高速化した

## はじめに
最近やけに`zsh`の動きが遅く、コマンドを入力せずに改行するだけしたら**6秒**もかかっていたので、改善しました。

## この記事が役に立つ方
- zshのモッサリ感ハンパないと感じている方

## この記事のメリット
- zshが高速化する（同じコードがあれば）

## 環境
- macOS Catalina 10.15.1
- zsh: 5.7.1

## 【前提】：ベースにしたファイル
いつから重くなったかを考えてみると、心当たりがありました。

補完機能を強化しようとこちらの記事にあるコードを**コピペ**し、そこに自分の設定を書き加えるよう変更したのですが、明らかにそれからモッサリ感が。

[補完が効き過ぎ感のある zsh の設定を公開してみる。 - Qiita](https://qiita.com/scalper/items/ed83c24f568cbf7f132b)

※こちらの記事のコード自体が悪いわけではなく、自分の環境・設定に合わなかったのだと考えています。

## 【結論】：vcs_infoの設定の一部が犯人
コメントアウトした箇所が原因でした。

ここをコメントアウトすると、コマンド入力なしの改行で比較すると**6秒**→**連打してもストレスなし（多分0.3秒以下）**に改善！

```zsh:~.zshrc
## vcs_info の設定
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git svn hg
zstyle ':vcs_info:*' formats '(%s)[%b] '
zstyle ':vcs_info:*' actionformats '(%s)[%b|%a] '
zstyle ':vcs_info:svn:*' branchformat '%b:r%r'
# precmd () {
#     psvar=()
#     LANG=en_US.UTF-8 vcs_info
#     [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
#
#     [[ -t 1 ]] || return
#     [ $EMACS ] && return
#     case $TERM in
#       *xterm*|rxvt|(dt|k|E)term)
#       print -Pn "\e]2;localhost\a"
#       ;;
#     esac
# }
if is-at-least 4.3.10; then
  zstyle ':vcs_info:git:*' check-for-changes true
  zstyle ':vcs_info:git:*' stagedstr "+"
  zstyle ':vcs_info:git:*' unstagedstr "-"
  zstyle ':vcs_info:git:*' formats '(%s)[%b]%c%u'
  zstyle ':vcs_info:git:*' actionformats '(%s)[%b|%a]%c%u'
fi
# function _update_vcs_info_msg() {
#     psvar=()
#     LANG=en_US.UTF-8 vcs_info
#     [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
# }
# add-zsh-hook precmd _update_vcs_info_msg
zstyle ':vcs_info:bzr:*' use-simple true

function toon {
  echo -n " "
}
```

しかも、`vcs_info`の機能は`powerlevel10k`で搭載していたので最終的にはこの設定全体を削除することで対応完了しました。

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

今回は考えもせず**とりあえずコピペ**してしまったので反省です。
zshが遅いとストレス半端ないので、無駄に機能は追加しすぎないと肝に銘じます:sweat_smile:

時間の都合上、今回はなぜ**６秒**も遅くなったのかを調べるまでは出来ていませんが、また次モッサリしたら調べようと思います:thinking:

## 参考にさせて頂いたサイト（いつもありがとうございます）
- [zshのターミナルにリポジトリの情報を表示してみる · けんごのお屋敷](http://tkengo.github.io/blog/2013/05/12/zsh-vcs-info/)
- [補完が効き過ぎ感のある zsh の設定を公開してみる。 - Qiita](https://qiita.com/scalper/items/ed83c24f568cbf7f132b)
Node.jsのasync/awaitとPromiseを超ざっくり_前編

現在関わっているプロジェクトでNode.jsを使って開発しています。
その過程でハマったこと、今回はasync/await・Promiseについての記事になります。

といってもNode.jsを使ったことのない人もいると思うので簡単にNodeの非同期処理について紹介してから、ハマったポイントについて書きたいと思います。
※すみません、未完成なのでタイトル詐欺になってしまっています。
※100番煎じなので非同期の書き方に関してはあんまり詳しく書きません。
※arrow関数使ってません。説明省くので。
※間違いあれば教えていただければと思います。


##  目次  
1. Node.jsの非同期処理について  
2. 非同期処理の書き方  
2.1 コールバック（callback）関数  
2.2 Promise  　　<font color="Red">←この記事はココまで！</font>  
~~2.3 asycn/await~~    
~~3. Promiseとasycn/awaitが一緒だと思ったらハマった件~~
4. 参考

Nodeを使ったことがあって1～2についてわかってるよって方は~~3まで~~飛ばしてください。


##  1.Node.jsの非同期処理について
Nodeは非同期を多用するという特徴がある。  
非同期処理とは
>よそに処理を依頼したときに、その場で完了を待たない

処理のことらしい。
ここでは詳しい説明は割愛するが、Nodeは単一のスレッドしか持たないため（シングルスレッドアーキテクチャ）、いちいち同期処理をしていては他の処理の実行を妨げてしまう。

例）同期処理の場合

```javascript:example_sync.js
//受け取った数字を出力する（同期）
function printNumSync(num) {
    console.log(num)
}
printNumSync(1)
printNumSync(2)
printNumSync(3)
```
結果

```console:console
1
2
3
```
同期処理の場合は呼び出した順番通りに処理が実行されます。
→前の処理の完了を待ってから次の処理に進む。

・非同期処理の場合
次に同期、非同期、同期処理の順に呼び出してみます。

```javascript:example_async.js
//受け取った数字を出力する（同期）
function printNumSync(num) {
    console.log(num)
}
//受け取った数字を1秒後に出力する（非同期）
function printNumAsync(num) {
    setTimeout(function () {
        console.log(num)
    }, 1000);
}
printNumSync(1)
printNumAsync(2)
printNumSync(3)
```
結果

```console:console
1
3
2
```
先に述べたように非同期処理（例の場合は`setTimeout`が非同期）は、完了を待たずに次の処理へ進むため1の出力後、2つ目の処理の完了前に3が表示されます。

##  2.非同期処理の書き方
非同期処理にもいくつか書き方があります。
##  2.1.コールバック関数
「コールバック関数」とはわかりやすく言えば `終わったらコレやっといて` の<font color="Red">コレ</font>に当たる部分。全然わかりやすくないですね。はい。
非同期処理には**処理の完了を待たない**という性質がありました。では非同期処理が終わったら**次に何をすればいいのか。**そんな悩みにこたえるのがコールバック関数。
非同期処理にコールバック関数を渡す[^1]ことで、非同期処理の完了後にコールバック関数が実行される。  

[^1]: Node（というかECMAScript）では関数はオブジェクトとみなされるため、変数に入れることができます。

実は上の非同期の例でも使われていますが`setTimeout`を見てみましょう。

```javascript:setTimeout
//1秒後に「callbackの中です」と表示
    setTimeout(function () {
        console.log('callbackの中です')
    }, 1000);

//↓↓わかりやすくするとこうなる

//callbackFuncに関数を格納
var callbackFunc = function () {
    console.log('callbackの中です')
}
//「setTimeout」が終わったら「callbackFunc」をやっといて
//→ ≒「1秒待つ」が終わったら「callbackFunc」をやっといて
setTimeout(callbackFunc, 1000);
```


##  2.2.Promise
以下Node.jsデザインパターンより引用
>プロミスは簡単に言えば、「非同期処理の結果を表現するオブジェクト」です。~中略~
プロミスは完了される（fulfilled、成功）か棄却される（rejected、失敗）のいずれかで、このいずれかが起きることは保証されます。完了されてから後で棄却されたり、複数の結果が起きることはありません。

ようは非同期処理が成功したか、失敗したかを扱うオブジェクト。
例）使い方

```javascript:example_promise.js
var fs = require('fs').promises;//ライブラリ読み込み
//1.ファイル読み込み（Promiseを返却する）
fs.readFile('./work.txt')
.then(function (content) {//2.ファイル読み込みが完了したら実行される
    console.log(content.toString())
})
.catch(function (error){//2.ファイル読み込みが失敗したら実行される
    console.log(error)
});
```

時間になってしまったので続きは後日書きます。

##  4.参考
[Node.js 非同期処理・超入門 -- Promiseとasync/await](https://qiita.com/ef81sp/items/29b7b91a3f3e77cf2233)
Node.jsデザインパターン
blueqatで量子の重ね合わせ

## この記事に関して
ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は[公式のチュートリアル](https://github.com/Blueqat/Blueqat-tutorials/tree/master/tutorial-ja)を元に作成しています。
今回は量子の重ね合わせを実装します。

## 回路の作成
今回はHゲート(hadamard gate)を用います。
Hゲートを施すと量子ビットは以下のように変換されます。

``` math
\left|0\right> → \frac{1}{\sqrt2}\left|0\right>+\frac{1}{\sqrt2}\left|1\right>,
\left|1\right> → \frac{1}{\sqrt2}\left|0\right>-\frac{1}{\sqrt2}\left|1\right>
```
この $\left|0\right>$ と $\left|1\right>$ が混ざっている状態を重ね合わせ状態と言います。
上の状態では計算上 0, 1 がそれぞれ50%の確率で観測されることがわかります。

$H\left|0\right>$ のことを +状態ともいい、$\left|+\right>$ と表します。
また $H\left|1\right>$ のことを -状態ともいい、$\left|-\right>$ と言います。

#### 実装 1
上の状態を実際に実装してみます。$H\left|0\right>=\left|+\right>$ を測定して見ます。
Hゲートは回路に`.h[a]`をつけるとできます。(`a`はHゲートを施すビットの位置)

普通に値を観測する場合

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().h[0]
c.m[:].run(shots=1000)

結果
Counter({'0': 517, '1': 483})
```
完璧ではないですが 0 と 1 がそれぞれ約50%の確率で取れていることがわかります。

ベクトルを観測する場合

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().h[0]
c.run()

結果
array([0.70710678+0.j, 0.70710678+0.j])
```
値がそれぞれ $\frac{1}{\sqrt2}$ よりきちんと取れました。

#### 実装 2
次に $H\left|1\right>=\left|-\right>$ を測定してみます。
計算上では観測する確率は同じはずです。

普通に値を観測する場合

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().x[0].h[0]
c.m[:].run(shots=1000)

結果
Counter({'0': 527, '1': 473})
```
$\left|+\right>$ と同じく、約50%の確率で取れていることがわかります。

ベクトルを観測する場合

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().x[0].h[0]
c.run()

結果
array([ 0.70710678+0.j, -0.70710678+0.j])
```
$\left|1\right>$ の係数が - できちんと取れました。

## まとめ
今回はblueqatを用いて量子の重ね合わせを実装しました。
次回は量子もつれ(entanglement)を実装してみます。
code-server ローカル環境篇(4) DBなども含めたMVC環境を用意してみよう (1)

これは、2019年 code-server に Advent Calender の 第4日目の記事です。今回も、code-server って何だろう?と言う事を解説していきます。


(1) [code-server って何?](https://qiita.com/kyorohiro/items/35bab591cd4a6b975c80)
(2) [Dockerで独自のcode-server 環境を作って見る](https://qiita.com/kyorohiro/items/d991f6fbf77a425525c5)
(3) [VSCode の Plugin を 利用してみる](https://qiita.com/kyorohiro/items/11a13d32c8748f3d7002)
(4) [DBなども含めたMVC環境を用意してみよう (1)](https://qiita.com/kyorohiro/items/4ed279dd91e39321ed20)
(5) [DBなども含めたMVC環境を用意してみよう (2)](https://qiita.com/kyorohiro/items/94c75a13ddccc5f39d85)
(6) [DBなども含めたMVC環境を用意してみよう (3)](https://qiita.com/kyorohiro/items/71a8b6ce3cbb9b36019a)
(7) [DBなども含めたMVC環境を用意してみよう (4)](https://qiita.com/kyorohiro/items/106ebb7003072a8dc989)
(8) [DBなども含めたMVC環境を用意してみよう (5)](https://qiita.com/kyorohiro/items/a019e4ab6dcda55896e0)
(9) [DBなども含めたMVC環境を用意してみよう (6)](https://qiita.com/kyorohiro/items/287364f03ed7a88f714e)
(10) [おまけ](https://qiita.com/kyorohiro/items/f96d27bba9fb23c0a097)


(NEXT->) [オンライン環境篇 1日目 作業環境を整備する](https://qiita.com/kyorohiro/items/603d6ee693fc2300079e)

(..) ローカルで、DBなどの環境も含めて構築するには
(..) オンライン上に置くには?
(..) K8Sなどの最近の流行りの環境と連携するには?
(..) Code-Serverを改造して、より良くしたい



今回から2-3回に渡って、ローカルで動作する web framework の開発環境を作成していきます。

docker-compose を利用して、db、phpmyadmin、flask を利用した開発環境を構築してみましょう!!


# 今回の何?
### チームでの開発環境を構築するコストを無くす事ができる
code-server の 開発元である Coder でも解説されていますが、
https://coder.com/docs/introduction

チームでの開発環境を構築するコストを無くす事が、code-server で 実現できます。
一度、環境を構築して、イメージを固めることで、2度と開発環境を構築する必要がなくなります。


# Docker-Composeで利用してみよう

前回作成したPythonの環境を、docker-compose から呼び出すようにして呼び出してみます。

```yml:docker-compose.yml
version: '3'
services: 
  app:
    build: ./app
    ports: 
      - 8443:8443
      - 8080:8080
    volumes:
      - ./app:/works/app
    command: /works/code-server --allow-http --auth none --port 8443 /works/app
```

以下のように配置しています。

```bash
$ find . -type f
.
./app
./app/Dockerfile
./app/main.py
./docker-compose.yml

```

docker-compose.yml は、前回の呼び出しコマンドとほとんど同じですね!!

https://docs.docker.com/compose/compose-file/

などを、参考にすると良いでしょう。

# 実行してみよう

```bash
$ docker-compose build
$ docker-compose up -d

```
とする事で、code-server を 起動 できます。

そして、
ブラウザーで　http://127.0.0.1:8443/ にアクセスすると、
<img width="1246" alt="Screen Shot 2019-12-03 at 5.39.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/811dc6cb-591b-4a71-e550-4c0e131504a1.png">


VSCodeを開く事ができます

# 次回

flask という python の web framework の 環境を作成してみます

# PS

## ソース
https://github.com/kyorohiro/advent-2019-code-server
新歓期にやるべき5つのこと

# はじめに
新歓時期、色んなサークルが1人でも多くの新入生を入会させようと奮闘します。勿論、学園祭運営委員も例外ではありません。

この記事では、学園祭運営委員、特にプログラマーと呼ばれる立場の人が新歓時期にするべきこと意識するべきことを5つ紹介します！
**プログラマーではない運営委員の方も対象読者**としていますので、是非ご一読ください。

※
ここに記すことは全て筆者の個人的な見解です。
これを実践することで入会者が倍増するとかそういう話はしてないです。

# やること意識すること5つ
1. 運営体験コンテンツの準備
2. 新歓情報の共有と広報
3. アピールポイント整理
4. 新入生のやりたいことを聞く
5. 入会後にやることの共有

(最後に筆者の新歓への思いを書き並べました)

# 新歓前
この時期は2つあります。

## 運営体験コンテンツ準備

### 運営体験の目的

- 新入生に学園祭運営について深く知ってもらう
- 入会後の自分をイメージしてもらう

### プログラマー体験コンテンツ
#### 作ったもの
Web版福笑い

#### 概要
HTMLとCSSを用いて、マスコットキャラクターの[矢口くん](https://circle.rikoten.com/php/pages/yaguchi.php)のパーツを揃えるゲームをつくりました。
新入生にCSSの`position`関連の`top`や`left`の値を変えてもらって、指定した値でブラウザ上で指定のオブジェクト動く体験をしてもらいました。

プログラミングの知識がほぼ0であるので、**文字を打つだったり数値を変えるだけの体験内容**のほうが気軽に楽しんでもらえます！

## 新歓情報の共有と広報
ご飯会やレク等新入生に**イベントの存在を知ってもらうための広報が必要不可欠**です。

### 情報の共有は早く正確に
新歓期、ご飯会の申し込みが殺到すると人数超過で申し込みを締め切ることになります。
このとき、新歓担当とWeb担当の連携が重要になってきます。
**常に新入生に最新の情報を**届けるようにしてください！

### Webサイトによる広報
理工展は**新歓専用のサイト(新歓サイト)を設置**しています。
新歓サイトに最低限載せるべき内容は以下の通りです。

- イベントの情報(ご飯会やレク等)
- イベントの申し込みフォームor連絡先
- 普段の運営委員の活動の様子
- 学園祭に運営として何をするか

理工展では、来場者向けと新入生向けでURLを分けています。
来場者向け→ https://rikoten.com
新入生向け→ https://circle.rikoten.com


# 新歓当日
待ちに待った新歓当日、いよいよ新入生とのご対面です。この時期はやるべきことが2つあります。

## アピールポイント整理
新入生と話をすることになった場合、運営の良さをアピールすることになります。
このアピールポイントは運営委員全員が同じである必要はなく、**活動中に楽しさややりがいを感じた瞬間を、一人ひとりが個別に用意**しておけばよいです。

### 筆者が新入生にしたアピール

- 自分がやりたいと思ったことは比較的実行しやすい環境が揃っている
- Webサイトが世界中に公開されているのを知った時、スケールの壮大さに感動を覚えた
- 参加団体と感動を共有できる

## 新入生のやりたいことを聞く
上で学園祭運営の良さをアピールをすると書きましたが、それを伝えると同時に**新入生が大学で何を頑張りたいかもきちんと聞いておく必要**があります。
学園の運営では、**やりたいことはなんでもできる**と言っても過言ではありません。
新入生のやりたいことをきちんと聞き、**学園祭運営においてどの部分で貢献できるか新入生に伝えると興味を持ってもらえる**のではないでしょうか。

(もし選考がある運営委員の場合、｢新入生のやりたいこと｣はかなり参考になると思います。)

# 新歓終盤
入会希望者が続々と現れ始めるこの時期、意外と忘れがちなことがあります。
それが**入会後に新入生とどう接するか**です

## 入会後にやることの共有
「入会したのにチーム分けの話合いや雑用ばっかでつまらない...。運営っぽいことまだしてないな...。」
こう思われたら最後、新入生からしたら不安で仕方ありません。最悪の場合は辞めてしまいます。

せっかく入会してくれたのにこれでは新入生に失礼です。
入会してくれた後に**新入生とどう関わるか、仕事内容をどう教えるか、上級生間で共有させておく必要**があります。

### 理工展Web班独自の教育カリキュラム
入会してすぐにWeb制作の面白さに触れてほしかったので、HTML&CSSの基礎をやりました。
この独自の教育カリキュラムについてはまた別の記事にでも書こうかなと思っています。

### 夏を目途に目標を立てる
やる気の継続には目標が必要不可欠です。「夏までに〇〇ができるようになる」を新入生と共有しておくとよいでしょう。
夏に辞める人も一定数いるので、そういった人をかなり減らせます。

例

- 夏までに自己紹介ページを作る！
- 夏までにオブジェクト指向を他人に説明できるようになる！

### 長期的な目標も立てる
先ほどの**新入生のやりたいことの実現をサポートをするのも上級生の役目**です。

例

- 自分だけのサイトを作りたい
- プログラミングのバイトをして将来はIT企業に努めたい

2つめはレアケースだと思いますが、**目標に近づけると思って入会してくれた新入生**を手放すのは新入生本人に失礼ですし、運営委員にとって損害です。
新入生と本気で向き合う心持ちが必要です！

# 筆者の新歓への思い
学園祭を作り上げる喜びを一人でも多くの人に感じてほしい。

最後の活動を終えて、自分の学園祭ライフを振り返ったときに「なぜ自分は運営サークルに入ったのだろう...」と考えたことがありました。
割と時間を使って考えた結果、答えは**雰囲気が良かったから**でした(笑)

ただ、サークルを探している時期に「プログラミングをやってみたい」という思いがありました。
プログラミングは他のサークルでもやっているようでしたが、**理工展の雰囲気が良かったのでここに決めました**。

この記事で触れたことは全て**新入生に雰囲気を伝える**の言葉に集約することができます。

新歓方法に迷走している方がこの記事によって方向性をすこしでも見出していただけたのなら、こんな嬉しいことはないです。

最後までお読みいただきありがとうございました！
標準ライブラリを漁ると思わぬソートアルゴリズムが出てくる

# はじめに

データ構造とアルゴリズムのアドベントカレンダーということで、ちょっと珍しいと思ったソートアルゴリズムの実装を調べたので宣伝半分に書き残したいと思います。
（他のアルゴリズムが非常に高度なものばかりなので、書いてて不安がいっぱいです）


日頃主にD言語でお手軽ツールを書いたりしているのですが、今回のお題はD言語の標準ライブラリにある、その名も `completeSort` という関数の内部で使われているアルゴリズムです。

リファレンス : https://dlang.org/phobos/std_algorithm_sorting.html#completeSort
ソース : https://github.com/dlang/phobos/blob/master/std/algorithm/sorting.d#L115

ちなみに作者はリファレンスにもある通り、C++の大家で計算機科学の論文も多く執筆している Andrei Alexandrescu 氏です。

# 概要
これがどんなソートアルゴリズムか先に言ってしまうと、「データの先頭部分がソート済みという条件下で、残りの部分を1つずつ前半に対する二分探索で挿入していく」という動きをするソートアルゴリズムです。

雑に言えば、二分探索有りの挿入ソートをちょっと進めたところから再開する、という感じでしょうか。

前提となるデータを形式的に書くと以下のようになります。

- 要素数 $n$ で $[x_0, x_1, ..., x_{n-1}]$ というデータをソートする
- このデータのうち、 $0 < m < n$ である $m$ に対して $[x_0, x_1, ..., x_m]$ がソート済みとする
    - $[x_{m+1}, ..., x_{n-1}]$ の値は不問（$[x_0, ..., x_m]$ の値より大きくても小さくても良い）

これに対してソートの平均計算量が $\mathcal{O}(m + (n - m) * log (n - m))$ 、最悪計算量は $\mathcal{O}(n * log(n))$ となります。（リファレンスより）（なんか違う気もしている）

# 良いところ
何といっても、**「データの大部分がソート済みの場合（ $n-m$ が小さい場合）に計算量がとても少ない」**に尽きます。
状況次第では通常のクイックソートやイントロソートより速い場合が多いです。

# これが活きるのはどんな状況か？ 

私は遺伝的アルゴリズムの実装で使いました。

遺伝的アルゴリズムの詳細は世の公開資料にお任せしますが、ざっくりいうと生物の進化や遺伝の過程を模倣して、以下のステップを繰り返し、たくさんの個体からスコアの高い個体を作り出す、というものです。

1. たくさんの個体を用意して、それぞれを評価してスコアを付ける
2. 評価した個体を混ぜたりして新しい個体を一定数作る（交叉・変異）
3. 作った個体も評価してスコアを付ける
4. 元の個体と作った個体の中から次の世代の一覧を作って2に戻る（選択）

この4で次の世代を作るときに一度スコア順にソートするので、「元々ある現世代の個体一覧は前ステップでソート済み」という条件から、うまいことするとこのアルゴリズムがジャストフィットします。

ちなみに手元では、現世代の数を $N$ 、新世代の数を $M$ としたとき、 $M = 2 * N$ くらいで実験していました。ざっくり3分の1がソート済みということになります。

 $N=100,1000,10000,100000$ くらいで色々個体数を変えて実験しましたが、標準のソート（イントロソート）と比べて26%ほど高速化されたのでやったぜ、という感じです。

似たようなケースに対して、ソートが高速化できるような例をご存知の方がいればぜひ教えてください！

# プログラム例
実際この例をD言語で書いてみると以下のような感じです。
大体C++とJavaとC#を足して3で割った感じだと思って見てみてください。

オンライン実行例 : https://run.dlang.io/is/JwBz5K

```d:ソース
import std.stdio;
import std.algorithm;
import std.range;

// 先頭3要素はソート済みの想定
int[] a = [1, 2, 3, 5, 0, 10, -3, 6, 4];

completeSort(a[0 .. 3].assumeSorted(), a[3 .. $]);
writeln(a);
```

```d:出力結果
[-3, 0, 1, 2, 3, 4, 5, 6, 10]
```

# まとめ
というわけで、いつも使っている言語でも標準ライブラリを漁ってみると思わぬアルゴリズムに出会うことがある、というお話の記録でした。

みなさんもぜひ日ごろ使っている言語の標準ライブラリを眺めてみたりして、身近にある面白いアルゴリズムを探してみてください！
PowerAppsからSkype通話へ飛ばす

#はじめに
前回の躓き編に続き、実装した箇所を別記事にしたかった。
今回は、PowerAppsから特定の人のSkype通話まで連携してみます。

- 躓き編<br>
https://qiita.com/pefume/items/e00e3167765bd2f7f115
- Office365のプロフィール写真をPowerAppsに表示する<br>
https://qiita.com/pefume/items/85566ae188f6cce051f7

#実装方法
```
Launch("skype: 通話する相手のSkypeID ?call")
```
例）SkypeIDがXXXXXXなら

```
Launch("skype:XXXXXX?call")
```


ボタン等のインターフェースを用意して、Launch関数を使用するだけ。
下図ではボタンを押した時(OnSelect) をトリガーに選んでいます。
![WS000313.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223202/865f210c-469b-1768-6805-514c2d665c52.png)
パソコンのSkype通話画面が表示されました。
スマホならSkypeのアプリを入れていればちゃんと連携されます。
![WS000315.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223202/35aa8dad-4116-23dd-dcf0-26041f829fcf.png)

## 補足：チャット通話を開くなら
```
Launch("skype:XXXXXX?chat")
```
例）SkypeIDがXXXXXXなら

```
Launch("skype:XXXXXX?chat")
```
AWS Lambda + DynamoDB + SES で作るServerlessメール配信機能


今までは大量にメールを配信するシステムをつくるのは簡単なことではなかた。
ですが、AWSが提供している複数のサービスを組み合わせることで大量のメールを配信する機能も簡単に作れるようになりましたね。いろいろなユーズケースによって、様々設計方法があるかと思いますが今回はAWS Lambda ＋ SQS + DynamoDB ＋ S３の組み合わせでつくるメール配信機能を設計してみました。

# 作成したい機能
テンプレートで作成したメールマガジンデータファイルをS3にアップして、おなじく対象のユーザリストをcsv形式のファイルをアップすると、配信希望の時間になったら大量のユーザに対してメールを配信する。配信したメールの配信履歴を6月間保存してそれ以前の配信履歴を削除する。

# 設計図
### パタン１：事前準備しないで送信
![plantuml(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120301/82b15e31-0780-650e-cd4f-fa82297f3455.png)


### パタン２：事前に送信対象を準備してより早く送信する
![plantuml(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120301/fcf0dd95-7f9b-9071-804f-f70e40c3a7bd.png)


# 設計パタンの紹介
今回は簡単なServerless実装を考えた結果、上のような図になりました。また２パタンを準備していますが、パタン１はそれほど件数が多くなくて、データ準備から配信まで一つのSchedule Eventにて実装しているパタンです。
パタン２は配信データ件数が大量の場合、より早く多くのユーザへメールを配信するために、配信時間になる前に配信するデータを準備して置きます。配信時間になったらそのデータを送信するような設計になります。そのため、実行処理が２つのEventにて処理する想定です。

### パタン１：
1. Webのフロントエントで配信するメール文面ファイルと対象のメールアドレスを含むユーザリストファイルをS3へアップロードします。今回はVue.jsにてFrontendを準備する予定です。Vue.js +AWS Amplify をつかってFrontendからS3へ直接ファイルをアップします。
- ファイルがアップロードできたらそれらのファイル名、配信日、S3のファイルPathなどのMetadataをDynamoDBのmagazine Tableに記録しています。この登録の処理はAWS AppSyncを利用して実施します。
- 配信時間になったらCloudWatch EventによってScheduleされたEventが発行され、PrepareSendListFunctionが実行されます。
- PrepareSendListFunctionでMagazine Tableから該当のレコードをQueryします。
- Query結果で配信対象が存在したらそのレコードにあるs３のPathからメールの文面情報と、ユーザリストを取得します。
- MagazineTableのステタスを処理済みに更新します。
- ユーザごとの配信情報を作成してmagazineDat TableにInsertします。
- magazineDat Tableに登録されたらProcessMailFunctionをTriggerするようにDynamaoDbStreamを設定します。
- ProcessMailFunctionでメールをSESへ登録行います。
- SESがユーザへメール送信します。
- SESが受け取ったメール情報を各ユーザへ送ります。


### パタン２：
1. Webのフロントエントで配信するメール文面ファイルと対象のメールアドレスを含むユーザリストファイルをS3へアップロードします。今回はVue.jsにてFrontendを準備する予定です。Vue.js + AWS Amplify をつかってFrontendからS3へ直接ファイルをアップします。
- ファイルがアップロードできたらそれらのファイル名、配信日、S3のファイルPathなどのMetadataをDynamoDBのmagazine Tableに記録しています。この登録の処理はAWS AppSyncを利用して実施します。
- 配信時間になる前（30分前を想定します）CloudWatch Event（ScheduleEventToQueue)によってScheduleされたEventがTriggerされ、PrepareSendListFunctionが実行されます。
- PrepareSendListFunctionでMagazine Tableから該当のレコードがあるかをQueryします。
- Query結果で配信対象が存在したらそのレコードにあるs３のPathからメールの文面情報と、ユーザリストを取得します。
- ユーザごとの配信情報を作成してmagazineDat TableにInsertします。
- MagazineTableのステタスを処理済みに更新します。
- 配信時間になったらCloudWatch Event（ScheduleEventToSend)によってScheduleされたEventがTriggerされ、CheckSendListFunctionが実行されます。
- CheckSendListFunctionでMagazineDat Tableから配信必要なレコードがあるかをQueryします。
- 該当のレーコドがあったらSQS(TriggerMail)に登録します。
- SQSにqueueが登録されたらProcessMailFunctionをTriggerするようSQS Queueの設定します。
- ProcessMailFunctionでメールをSESへ登録行います。
- SESへメール登録成功したらMagazineDat TableのメールステータスをSentにupdateします。
- SESが受け取ったメール情報を各ユーザへ送ります。


# おわりに
コードの実装はこれからになりますが、設計図を考えてみたら実装が難しくないですね。また実装はしてないですが、今度実装したらその内容を投稿します。
入社してCSS記述で指摘されたこと🌟

#**入社してCSS記述で指摘されたこと🌟**

##はじめに

この記事は、 CAMエンジニア Advent Calendar 2019 **5日目**の記事です。

記事一覧はこちらから↓
https://qiita.com/advent-calendar/2019/cam-inc

昨日は```id:gasheeee```さんの [ブラウザレンダリング入門](https://qiita.com/gasheeee/items/267f11314c161392a871) でした。
ブラウザレンダリングについてて書かれてあるので「レンダリングがいまいちパッとしてないなあ〜」と思う方は是非見てみてください！！

この記事では自分```id:youkouJB```が半年間フロントエンドの職種で業務を行う中でトレーナーさんから指摘されたcssの記述について書いていきたいと思います。


##1. 親要素に影響をもたらす子要素のmarginはNG！

まず一つ目にmarginの当て方について指摘された内容を書いていきます。

自分が指摘を受けたのはcomponentの中のmarginが外のcomponentに影響するからおかしいというもので、、、

簡単な例をあげると、

```index.html

<div class="box"></div>
<div class="box">
  <div class="box__item"></div>
</div>
```
上記のようなhtmlがあり、
```box``` を一つの親要素のcomponent、その中の```box__item``` を子要素のcomponentと仮定します。

その中で、boxとboxにmarginを持たせたいと思い、下記のようなcssを書いてみます。

```index.css

.box {
  height: 200px;
  background-color: #ccc;
}

.box__item {
  margin-top: 40px;
  height: 100px;
  background-color: #000;
}
```
実際に表示上では、boxとboxの間にmarginを持たせることができていますが、

```box__item``` (子要素)にmarginを持たせてしまっているため、そのcomponentがいらなくなり削除してしまうと、完全にmarginがなくなってしまい表示に影響が出てしまいます。
<img width="289" alt="sample1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533107/38aba4a5-c360-17d4-ef27-48809ecd39a2.png">    <img width="289" alt="sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533107/d2bdf3de-34f2-562f-cc17-06f1cf56fab9.png">
そのため、親要素に影響が出ないように子要素のcss記述をしなければいけないというものでした。

サービスの中ではいくつかこのようなスタイルの当て方になっているものもあったので、見つけたら直せるようにしていきたいと思います。

##2. BEMのmodifierについて

次にBEM（block,element,modifire）について指摘を受けた内容について書いていきます。

BEMは、

- block:　一つのまとまり、親要素

- element:　blockの一属性である子要素

- modifier:　状態変化を表現する要素

に分けて考える再利用可能なコンポーネントとコード共有を作成するのに役立つ記述方法です。

もっと詳しくBEMについて気になる方は[こちら](https://en.bem.info/methodology/quick-start/)を見ていただければと思います。（公式）



今回指摘されたのは　modifierについてで、
実際に指摘された記述がこちらで、

```index.css
.service__subTitle--white {
  margin-top: 60px;
  color: white;
}

.service__subTitle--blue {
  margin-top: 40px;
  color: blue;
}
```
黒色のサブタイトルの他に白色のサブタイトル、青色のサブタイトルを追加したいと思いこのように記述しました。

しかし、このコードだと```--white```と```--blue```っという拡張classがmargin-topを持ってしまっており、もし別に白いサブタイトルや青いサブタイトルが出てきてしまったらこのclassが再利用できなくなってしまいます。

自分はclass名を変更することで対応しましたが、そのまま突っ走ってしまうと、いずれclassが増えたときや必要じゃなくなった際にゴジャゴチャになってしまいかねないので、気をつけなければいけないと思いました。。。



## 最後に

いかがだったでしょうか？？
今回は入社してCSS記述で指摘された内容について書いていきました。
記事を書くにあたり、自分自身復習ができてよかったと思っております。
また、Qiitaに記事を書くことが初めてだったので至らぬところがあると思いますが、最後まで見ていただきありがとうございました！

「これは間違っている！」などありましたらコメント等でご指摘のほどよろしくお願い致します!


次回は```id:tomomi_bro```さんの**cssアニメーションについて**です！
お楽しみに！！
プロキシ環境下でUnity EditorのAsset storeにサインインできなかったのでUnity Hubを使用しないで問題回避した件

## 前略
会社のプロキシのせいでUnityがまともに動かったので、その対策を書きます。

## 環境
- Unity: 2019.2.14f1
- Unity Hub: 2.2.1

## 手順
UnityはUnity Hubからではなく、単体でインストールします。

[こちら](https://unity3d.com/jp/get-unity/download/archive)の「ダウンロード」-「Unityインストーラー」から「UnityDownloadAssistant-2019.2.14f1.exe」をダウンロードし、インストールします。

Fiddlerを導入します。インストール手順は[こちら](https://qiita.com/Nuits/items/1bd84b45b0b092527d8d)に従いました。プロキシの設定は[こちら](http://segursegur.hatenablog.com/entry/2016/02/04/132048)に従いました。

Fiddlerを導入すると、Unity EditorからAsset storeにアクセスできます。Fiddlerを使用しているので環境変数の設定は不要でした。しかしUnity Hubは通信エラーになります。Fiddlerのログを見ると407エラーが出ていることがわかります。Unity Hubが使えないので、Asset storeにサインインできません。

Unity Hubはアンインストールしておきます。
Unity EditorでAsset storeを開き、右上の「Sing In」ボタンをクリックします。「Create a Unity account」をクリックし、遷移先の画面で「Already have a Unity ID?」をクリックします。サインイン画面に飛ぶのでサインインします。これで認証が通り、Asset storeを使用できます。

## 草々
Unityの中の人、プロキシ環境下でも使えるようにしてください。ｵﾅｼｬｯｽ。
Laravel コントローラーからビューを表示

## ビューの作成
`resources/views`にindex.blade.phpファイルを作成する。
書き方に関しては下記参照
https://blog.hiroyuki90.com/articles/laravel-blade/

```
//変数を展開する場合
<h1>{{ $hello }}</h1>
```

## コントローラーの作成
`app/Http/Controllers`にコントローラーを作成する。

```HomeControlller.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;

class HomeController extends Controller
{
	public function index()
	{
		$hello = 'Hello World';
		return view('index', ['hello' => $hello]);
		//1つ目の引数にディレクトリとファイル名指定
		//2つ目の引数でビューに$hello変数を渡す
	}
}
```
viewヘルパを使用する際は**`use Illuminate\Support\Facades\View;`**を記載しないとエラーが出てしまう。
`view`ヘルパの中で`resources/views`にサブディレクトリを作成する際はドット記法を使い記述する。

```HomeController.php

return view('admin.index', ['hello' => $hello]);
```
1つ目の引数の`index`の部分がblade.phpのファイル名
2つ目の引数の`hello`の部分がblade.phpファイルの中の変数を指定
`$hello`がビューに渡す変数

`compact`関数もしくは`with`メソッドで渡すことも可能
> `compact`関数
変数名とその値から配列を作成する


```HomeController.php

$hello = 'Hello World';
return view('index', compact('hello'));
//返り値　array(1) { ["hello"]=> string(11) "Hello World" }

//もしくは
return view('index')->with('hello',$hello);
```
IISでWebサーバ構築時に不具合多発...

# はじめに
問題＆解決策がうまく書けていない...
　※他にも問題と対処があったような...(思い出せたら追記)

# 問題一覧
４. ERR_UNSAFE_PORT エラーが発生しページが表示できない
３. IISのサイト表示時に「HTTP エラー 401.3 – Unauthorized」
２. IISのサイト表示時に「HTTP エラー 500.19 – Internal Server Error」
１. IPアドレスでサイトにアクセスしようとして失敗(1台だけ...ローカルホストでもだめって...)

## ４. ERR_UNSAFE_PORT エラーが発生しページが表示できない
参考サイトに記載されているが、ブラウザ毎に特定バージョンからポートブロックされている模様
　★対応としては、Webサイト側のポート番号を変更して解決！！
※Edgeだけなぜ駄目だったんだろうと思っていたのですが、納得...
　2021年5月25日にリリースされた、Google Chorme 91
　2021年5月27日にリリースされた、Microsoft Edge 91
　　ポート10080がブロックされる動作に変更
※Webブラウザの起動ショートカットを作成し、--explicitly-allowed-ports=(ポート番号) オプションを追加することで、指定したポート番号のブロックを解除可能
　★一旦試す場合はこれだな...

【参考サイト】
◆Webブラウザでポート 10080 のWebサイトにアクセスすると、ERR_UNSAFE_PORT エラーが発生しページが表示できない | iPentec
　https://www.ipentec.com/document/software-google-chrome-microsoft-edge-error-err-unsafe-port-accessing-on-port-10080


## ３. IISのサイト表示時に「HTTP エラー 401.3 – Unauthorized」
　IISの仮想ディレクトリとして、ある物理パスを追加した後、配下のファイルにアクセスしようとしたら表題のエラーが発生
　　★参考サイトの対応をしたら解決!!
　　　※具体的には、ドメイン認証済みのユーザー「Authenticated User」を追加して解決

【参考サイト】
　◆IIS でHTTP 401.3 Unauthorized エラーコード 0x80070005 の解決方法 | urashita.com 浦下.com (ウラシタドットコム)
　　https://urashita.com/archives/26018
　◆IISのサイトでHTTPエラー401.3 Unauthorized
　　https://tex2e.github.io/blog/windows/iis-401-3-unauthorized
　　　※エラーの原因として一番可能性のあるのは IIS がファイルへのアクセス許可がないことです。 そこで、アクセスしたい対象のフォルダで、プロパティ→セキュリティ→編集→追加で「IUSR」を選択します。


## ２. IISのサイト表示時に「HTTP エラー 500.19 – Internal Server Error」
　※参考サイトや対応すべき作業は記載したが、これで解決したかは思い出せない...

【参考サイト】
　◆IIS　で　エラー コード 0x80070021 が発生した場合の対処法
　　https://ips.nekotype.com/4200/
　　　※今回の原因はまさにこれっぽい...
　◆IIS の構成のバックアップ
　　https://www.keicode.com/iis/iis-backup-config.php

```config:applicationHost.config
※<C:\Windows\System32\inetsrv\config>
変更前：＜section name=”modules” allowDefinition=”MachineToApplication” overrideModeDefault=”Deny” /＞
変更後：＜section name=”modules” allowDefinition=”MachineToApplication” overrideModeDefault=”Allow” /＞
```
```sh:iisbackup.bat
REM 構成ファイルのバックアップ
%systemroot%\system32\inetsrv\appcmd add backup

REM バックアップのリスト
%systemroot%\system32\inetsrv\appcmd list backup

REM バックアップのリストア
%systemroot%\system32\inetsrv\appcmd restore backup "CFGHISTORY_0000000147"
```

## １. IPアドレスでサイトにアクセスしようとして失敗(1台だけ...ローカルホストでもだめって...)
　※参考サイトや対応すべき作業は記載したが、これで解決したかは思い出せない...

【参考サイト】
　◆IIS Express のWebサイトに他のホストからアクセスできるようにする - ASP.NETアプリケーションのデバッグ時に他のホストからのアクセスをする
　　https://www.ipentec.com/document/windows-iis-express-accept-outer-host-access
　◆IIS Expressに外から接続する
　　https://qiita.com/d_k_morimoto/items/66e19c0d5721b05495a7
　　　※ポイントは以下の３つか...
　　　　(1) applicationhost.config の修正 
　　　　(2) ACL(Access Control List)の設定
　　　　(3) ファイアウォールのポート解放
UTF-8 テキストファイルを BOM 付へ変換（シェルスクリプト）

こんにちは。
UTF-8 テキストファイルを BOM 付へ変換しました。シェルスクリプト（および他方法）を用いました。なお、CSV ファイルを例としています。

#### シェルスクリプト
実行例[^1]、および入出力ファイル確認は、

[^1]: 参考：「[bashでもUTF-8 with BOMなファイルを作りたい](https://qiita.com/yumetodo/items/38e17f6f5a8ef9860f5b#_reference-245970493b3df0034203)」、「[UTF-8 な CSV を Excel が読めるように先頭 BOM をつけるシェルスクリプト](https://qiita.com/kitsuyui/items/6a963085b2fed496fa62)」。

```console
$ ./bom.sh a_utf8.csv > a_utf8_bom.csv
$
$ file a_utf8.csv a_utf8_bom.csv
a_utf8.csv:     UTF-8 Unicode text
a_utf8_bom.csv: UTF-8 Unicode (with BOM) text
```

ソース
```bom.sh 
#!/bin/sh
printf '\357\273\277'
cat "$@"
```

#### nkf コマンド利用
nkf コマンドを利用する方法は[^2]、

```console
$ nkf --oc=UTF-8-BOM a_utf8.csv > a_utf8_bom.csv
$ nkf --guess a_utf8.csv a_utf8_bom.csv
a_utf8.csv: UTF-8 (LF)
a_utf8_bom.csv: UTF-8 (BOM) (LF)
```

[^2]: 参考：[【メモ】コマンドでのBOMの追加・削除・確認](https://qiita.com/tamanugi/items/63fe5cf8e709565777a5)

#### PowerShell 利用
PowerShell 利用の場合は[^3]、

```
PS> get-content -encoding:utf8 a_utf8.csv | out-file -encoding:utf8 a_utf8_bom.csv
PS> nkf --guess a_utf8.csv a_utf8_bom.csv
a_utf8.csv: UTF-8 (LF)
a_utf8_bom.csv: UTF-8 (BOM) (CRLF)
```

[^3]: 参考：「[Powershellでファイルの文字コードを変換](https://qiita.com/tworks55/items/b7884c4bb6ec84e73e57)」。「[【最新版】シフトJIS を UTF-8 に変換するバッチ](https://www.shegolab.jp/entry/windows-conv-text-utf8-v3#shegolab-utf8-bom)」

#### Microsoft 製品における UTF-8（BOM無）のサポート状況（参考情報）
なお、Microsoft 製品において、UTF-8（BOM無）テキストファイルのサポート状況は：

- Excelは、UTF-8（BOM無）の CSV ファイル読み込みには未対応（2024年現在）[^4]
- Windows OS のテキストファイルの内容（全文）検索は、UTF-8（BOM無）には未対応（2023年現在）
- Visual Studio は対応済み（2017年以降）
- Notepad（メモ帳）は対応済み（2018年以降）
- PowerShell スクリプト（ps1）は不明[^5]

[^4]: したがって Excel が抱えている問題として、読み込みには、BOM 付き UTF-8 の CSV ファイルが必要となります。他の対処法としては、CSV ファイル中での非 ASCII 文字の利用を止めるか、または文字コードを Shift JIS へ変換する対処法もあります。
[^5]: 参考：「[SJISと決別し、デフォルトでBOMなしUTF-8を扱えるようにするPowerShell設定](https://qiita.com/e4rfx/items/243a19d7853a2a585422)」
ActiveSupport 無しで beginning_of_day


# お題

時刻（日時）を表すデータがあって，その時刻を含む日の開始の瞬間（0 時）をどうやって得るか。

Rails なら ActiveSupport の `beginning_of_day` を使えばよい。

たとえば今日の始まりであれば

```rb
require "active_support/time"

t = Time.now

p t.beginning_of_day # => 2019-12-04 00:00:00 +0900
```

といった具合。
この例のように，Rails じゃなくても `active_support/time` を `require` すれば使える。

素の Ruby ではどうする？

# 答え

```rb
require "date"

t = Time.now

p t.to_date.to_time # => 2019-12-04 00:00:00 +0900

```

Date 化すると時・分・秒の情報が消え，それを Time 化すると，0 時 0 分 0 秒ということになるみたい。

なお，上の例は Time オブジェクトが最初に与えられていたが，「今日の始まり」であれば `Date.today` から出発してもよい：

```rb
require "date"

p Date.today.to_time # => 2019-12-04 00:00:00 +0900
```

# 感想

小ネタ感がハンパない。

こんなの既出だろうと思ったけど，類似の記事が見つけられなかった。