OmniAICreator/Qiita-1.07M huggingface dataset:
AWS認定 ソリューションアーキテクトアソシエイト 合格記録

年末に [AWS認定 ソリューションアーキテクトアソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/) を受験し、合格しました:tada:
以下、当日や勉強法の記録です。

# 結果

受験者スコア: 852 でした。
試験結果は、100 から 1000 の間の値で、合格に必要な最低スコアは 720 なので、まぁ普通?ぐらいの点数でした。

# 試験当日の感想

試験当日は渋谷のテストセンターで受けました。
本人確認は免許証と保険証でよかったです。入って同意書にサインして、写真とって入室して試験開始と言う流れでした。
A4ぐらいのホワイトボードとペンを渡され、それを試験中にメモがわりに使いました。消せないのでいっぱいになったら担当者を呼ぶ必要があります。（呼びませんでしたが）

試験自体は130分と長丁場ですが、試験時間は40分ぐらい余ったので、相当急いで回答しないといけないわけではなかったです。

# 事前知識

現職では全くAWSを触る機会がないのですが、前職ではAWSで以下のようなことをやっていたため、ある程度知識はある状態でした。

- API Gateway、Lambdaを使ったWebAPI開発
- CloudFrontを使った静的コンテンツ配信
- AWS Organizationsで社内のAWSアカウント管理、IAMでのユーザ管理

ゼロベースじゃないので、AWS触ったことない人にはあまり参考にならないと感じるかもしれませんが、実務でやったことが直接試験の役に立った感じはなかったです。

# 学習方法

[黒本](https://www.amazon.co.jp/dp/4295005495/ref=cm_sw_r_tw_dp_U_x_2Q1FDbYY6VFFE)を3周しました。1回目はざっとよんで、2周目、3周目に疑問に思ったところなどは少し詳しく調べるといった感じです。

また、AWS公式の模擬試験の問題を解きました。模擬試験には回答がないので、まず全問題をキャプチャしてから解き、あとで自分で回答を作りました。
Googleスライドにキャプチャを貼り付けて、コメントに回答を載せていつでも見返せるようにしました。

平日は通勤のバスの中で黒本を読んで(片道15分ぐらい)、土日に弱いところを公式のサービスページやクラスメソッドの記事で学習しました。ざっくりと学習期間としては1ヶ月ほどで、平均すると1日1時間、トータル30時間ぐらいだったかと。

## やっといてよかったこと

### 模擬試験を早めに解いたこと

模擬試験は結構大事だったのかなと思っていて、**模擬試験に似たような問題が本番でも出ました**。模擬試験でまずどんな問題が出るのか、できるだけ早い段階で確認したのが良かったと思います。

問題の形式が、 「あなたは組織のシステム担当者です。要件に対して最適なAWSの利用方法を選択肢から選んでください。」という感じで、黒本の章末の問題とは違っていたので、戸惑わずに済みました。

## やっとけばよかったこと

### サービスの比較が不十分だった

こっちにこの機能あったっけ？みたいな煩わしい問題が出たので、**似たような機能は比較するように勉強**していた方がよかったなと思いました。
実際のサービスでもアーキテクチャを検討する上で、機能の比較はよくすると思いますので、実務にも効いてきそうです。


# まとめ

合格したからといって、実務ですぐ生かせるとは限らないですが、AWSの基本サービスや基本構成、設計におけるベストプラクティスが体系的に学習でき、偏った知識を広げられたかなと思います :+1:

次はプロフェッショナルを受けようとしてるので、その記事も別で書きたいと思います。
Django 3.0.2 models.pyをモデルクラス毎にファイル分割する

startappコマンドで初期に作成されるmodels.pyをモデルのクラス毎にファイル分割する。
前回やったときと\_\_init\_\_.pyが違ったような感じがしたのでメモ (気のせいかもしれない)

#バージョン
Python 3.7.6
Django 3.0.2

#手順
1.startappコマンドで作成したディレクトリ内にmodelsディレクトリを作成する。
2.作成したmodelsディレクトリ内に\_\_init\_\_.pyを作成する。

```models/__init__.py
# from topic で読み込めていたはず、.topicに変更して.を明示しないとダメ
from .topic import Topic
# from アプリ名.models.topic import Topic　(こっちも可)
```

3.作成したmodelsディレクトリ内にモデル名.pyを作成する。

```models/topic.py
# こっちは普段通りなので適当
from django.db import models

class Topic(models.Model):
    topic_id = models.AutoField(primary_key=True,)
    class Meta:
        indexes = [
            models.Index(fields=['topic_id'], name='topic_topic_id_index'),
        ]
    def __str__(self):
```

#エラー内容
\_\_init\_\_.pyの記述をミスした場合のエラーメッセージ

```models/__init__.py
from topic import Topic
```
```powershell
python manage.py makemigrations
# 省略
ModuleNotFoundError: No module named 'topic'
```
クラウドプロバイダ3社の印象

# クラウドプロバイダ3社の印象

クラウド技術の習得を目標に、クラウドの大手3社のサービスを軽く触ってみた感触をまとめてみた。あくまで表面をなぞっただけの個人的な印象です。

## 共通点
* 地球規模のインフラでコンピューティング、ネットワーク、ストレージ機能を提供
* IaaSで仮想マシンをオンデマンドで利用できる。
  * Amazon　EC2
  * Azure VM
  * Google Compute Engine。
* ほぼ無制限に利用できる分散ストレージがある。可用性も高い。
  * Amazon S3
  * Azure Blob Storage
  * Google Cloud Storge
* 従量課金方式がある

## それぞれの特徴
### AWS
* IaaSのマーケットリーダー。幅広いサービスを取り揃えている
* AWSのサービスはオープンソースの技術に基づいて提供されているものが多い
* セキュリティ面は堅実だが、構築する時は複雑になりがち（？）

### Microsoft Azure
* Microsoftのテクノロジーをクラウドで使えるのが魅力
* IaaSよりもPaaS（Web中心で）サービスを拡大
* Microsoft ♡ OSS
* AWSのシェアに追いつこうと結構努力している

### GCP
* デベロッパー向け（？）
* Googleの潤沢なリソースを享受できるサービスがある（Google Cloud Load Balancing、Cloud Bigtable)
* Lift and Shiftで従来のシステムを運用していくケースよりもCloud Nativeなシステム開発に向いてる気がする

## 感想
全体的に今はAWSが一番成熟している印象を得た。今のクラウド市場はMicrosoft、Google 、Amazonがほぼ占めているため、今後クラウドを導入する場合は、この3社の中から選ぶことになりそう。良く似たサービスが3社にそれぞれあるので、AWS、GCP、Azureのどれを使うかは機能面の充実度で簡単に評価できないと思った。それよりも置かれたバックグラウンドの状況が決め手になることが多そう。（マイクロソフトの製品をメインに使っているか？システムを運用するチームがあるか？デベロッパー中心の会社か？）
cdコマンドよりも便利なpushdコマンドを使って一瞬で元のディレクトリに戻ろう


cdコマンドでディレクトリ移動をして、元にいたディレクトリに戻りたいとき、`` cd ../hoge`` みたいに入力するのがそろそろ面倒くさい...
そんなときに、pushdコマンドとpopdコマンドをセットで知っていると一瞬で元にいたディレクトリに戻れて便利です。

# pushdコマンドでディレクトリ移動
ディレクトリ`` ~/user/dir1`` からディレクトリ`` ~/user/dir2`` へ移動したい場合、``pushd``コマンドは``cd``コマンドと同様に使用します。

```
~/user/dir1$ pushd ~/user/dir2
~/user/dir2 ~/user/dir1
```
ディレクトリ`` ~/user/dir2`` に移動しました。

```
~/user/dir2$
```
ここまでは``cd``コマンドと同じです。 
では、元にいたディレクトリ`` ~/user/dir1`` に戻るために、``popd``コマンドを使用します。

# popdコマンドで元にいたディレクトリへ
ただ``popd``を打つだけです。

```
~/user/dir2$ popd
~/user/dir1
```
一瞬でディレクトリ`` ~/user/dir1`` に戻ってきました。

```
~/user/dir1$
```

# 注意
pushdコマンドとpopdコマンドは、主にコマンドライン上やbush限定環境で使用されるコマンドのため、FreeBSDやSolairsでは使用できません。

# おわりに
ずっとディレクトリ移動はcdコマンドを使ってきたので、ついついcdコマンドを使ってしまいがちになりますが、これからはpushdコマンドに切り替えていこうと思います。
Blenderのホームページが開かない問題2020.1.31

2020年1月31日
blenderのHPが攻撃を受けて接続できない状態になっている模様です。

blender2.81にしてから保存して終了する際に画面が真っ黒になって
おかしかったり、背景画像を追加しようとしても画面が真っ暗になるし。

もう少し待ってからアクセスすることにします。
VuePressのブログテーマ（@vuepress/theme-blog）を使ってみた


[VuePress](https://vuepress.vuejs.org/)はデフォルトだとドキュメント向けですが、ブログ向けのテーマがあるようなので使ってみました。
[@vuepress/theme-blog](https://vuepress-theme-blog.ulivz.com/)（ブログ用テーマ）
## VuePress（@vuepress/theme-blog）をインストール
```
yarn add vuepress @vuepress/theme-blog -D
```
上記コマンドでインストール。
インストールが完了するとpackage.jsonが作られるので、修正します。

![vuepress_blog1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/617b795f-1a84-80d9-695b-efd657a1f770.png)

```js:package.json
{
  "devDependencies": {
    "@vuepress/theme-blog": "^2.0.3",
    "vuepress": "^1.2.0"
  },
  "scripts": {
    "dev": "vuepress dev blog",
    "build": "vuepress build blog"
  }
}
```
続いてblogディレクトリを作成します。
作成後、ビルドすると.vuepressディレクトリが生成されます。

```terminal
mkdir blog

yarn build
#or
npm run build
```
## @vuepress/theme-blogのディレクトリ構成

@vuepress/theme-blogの推奨のディレクトリ構成は下記のようになります。

```
├── blog
│   ├── _posts
│   │   ├── 2019-12-17-travel.md #example
│   │   ├── 2019-12-26-lunch.md #example
│   │   └── 2020-1-6-study.md #example
│   └── .vuepress
│       ├── `components`
│       ├── `public` 
│       ├── `styles` 
│       │   ├── index.styl
│       │   └── palette.styl
│       ├── config.js
│       └── `enhanceApp.js` 
└── package.json
```
各ブログ記事は_postsディレクトリに作っていきます。
ブログの設定はconfig.jsでおこなうのでconfig.jsを作成します。

```js:config.js
module.exports = {
    title: 'VuePress Blog demonstration', 
    description: 'VuePress Blog demonstration',
    theme: '@vuepress/theme-blog',
    locales: {
        '/': {
          lang: 'ja'
        }
      },
    themeConfig: {
        dateFormat: 'YYYY-MM-DD',
        nav: [
            { text: 'Blog', link: '/' },
            { text: 'Tags', link: '/tag/' },
          ],
        footer: {
            copyright: [
              {
                text: 'Privacy Policy',
                link: '',
              },
              {
                text: 'Contact',
                link: '',
              },
            ],
        },
    }
}
```

今回は上記のように設定しました。
ブログ記事も何件か入れていきます。
![vuepress_posts.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/27aa5e27-5531-be52-de0c-5f3de91a1dd8.png)

```terminal
yarn dev
#or
npm run dev
```
上記コマンドでサーバーを起動し確認してみます。

![vuepress_blog_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/bef372b6-d46c-4930-c4f6-4f57c17fd780.png)

ブログっぽく一覧表示されています。

##ブログ用の機能が簡単に作れる

@vuepress/theme-blogは、タグ分けもデフォルトでやってくれるのでとても便利です。
/tag/ディレクトリにタグ一覧も生成されます。ブログには必須機能なので良いですね。

![all_tag.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/3371b68e-0e16-aebe-27dd-29813ac2f4a5.png)
![vuepress_tag.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559347/9a653319-666b-22a9-b14a-ada4c649e946.png)


各ページのタグ設定などは、mdファイルのfrontmatterで可能です。

```md
---
title: タイトル
date: 2019-01-01
author: 名前
location: Japan
tags: 
  - 日記
  - 旅行
---

本文
```

## 最後に
[@vuepress/theme-blog](https://vuepress-theme-blog.ulivz.com/)を使うとVuePressでも簡単にブログを作れちゃいますね。

@vuepress/theme-blogは公式のブログ用テーマですが、コミュニティのテーマも結構あるみたいです。
下記でコミュニティテーマの一覧が見れます。
[https://github.com/vuepressjs/awesome-vuepress](https://github.com/vuepressjs/awesome-vuepress#official-themes)
Raspberry PiでUARTの有効化＋シリアル通信

Raspberry Piでシリアル通信を使う機会があったので、疎通までのやり方を備忘録として載せておきます。

# 環境
- Raspberry Pi 3 Model B+
- Raspbian Buster
- Python 2.7.16

# Raspberry Piのセットアップ
デフォルトだとRaspberry Piはシリアルポートが無効になっているので、設定を変更します。
LXTerminalを開き、コマンドを入力します。

```bash
pi@raspberrypi:~ $ sudo raspi-config
```
次のような画面になるので、「5 Interfacing Options」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/bdd4cb8a-2395-1465-24fa-0f339330b8fc.png)
次に、「P6 Serial」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/718f1c5e-69f5-2a18-a218-8e16f3b951aa.png)
「いいえ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/c5bea475-52b4-d3a2-29ac-56ec6d91b696.png)
「はい」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/c8c02c52-cec3-a93d-7fe8-6a17f8e87b8f.png)
するとこのような画面になり、シリアルポートが有効になります。
そのままraspi-configを終了すると、再起動するかどうかの選択を求められるので、再起動しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/69935b4f-10e0-2794-e071-becff0d87a7a.png)
再起動後、下記のコマンドを入力すると、/dev/配下に有効化したシリアルポートttyS0が表示されます。

```bash
pi@raspberrypi:~ $ ls -l /dev/ttyS*
```


# Raspberry Piの配線
Raspberry Piの8番ピン(GPIO14)と10番ピン(GPIO15)がUARTピンになっているので、
ワイヤージャンパでショートさせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/2b18d2cc-70de-fc75-ef32-b3e2aca7a9b5.png)

# 実装
pyserialライブラリを使用して疎通確認をします。

```python:serialTest.py
import serial

# 通信確立
ser = serial.Serial('/dev/ttyS0', '9600', timeout=0.1)
# データ送受信
ser.write('Hello, World!')
print(repr(ser.readline()))
ser.close()
```

ファイルを保存した後、LXTerminalでファイルが保存されているディレクトリに移動して実行します。
成功すると、送信したメッセージが表示されます。

```bash
pi@raspberrypi:~/work $ python setialTest.py
Hello World!
```

# まとめ
Raspberry Piをあまり触った経験が無かったため、
シリアル通信がデフォルトでOFFになっていることを知りませんでした。
センサーやArduinoに繋げたりと、様々なことに使っていければと思います。
JavaでPDFファイルの文字列を読み取る

# 概要
PDFファイルから文字列を抽出する。

※PDFファイル内の画像データは本件では扱わない

# 実行環境
OS: Windows 7
言語: Java

# Javaの準備
mavenプロジェクトを作成し、pom.xmlに以下を追加

```
<dependency>
	<groupId>org.apache.pdfbox</groupId>
	<artifactId>pdfbox</artifactId>
	<version>2.0.8</version>
</dependency>
```

# 実装

```
try {
    File file = new File("test.pdf");
    PDDocument document = PDDocument.load(file);

    //　文字列のみ抽出
    PDFTextStripper pdfStripper = new PDFTextStripper();

    // 見た目通り(左上から右下にかけて）の順番で文字列を読み取る設定
    pdfStripper.setSortByPosition(true);
    // pdfからテキスト抽出
    text = pdfStripper.getText(document);

    document.close();

} catch (Exception e) {
    e.printStackTrace();
}
```

出力した文字列は、ページ番号や空白（半角スペース、全角スペース、タブ）等が含まれるため、一度クレンジング処理をかけると解析が楽になる

※縦書きのPDFはこの方法では上手く行かない
CDataを使ってkintoneをRDBのように扱う

え？kintoneってテーブル（アプリ）結合できないの？あかんやん。
他のツール使ってもいいからなんとかできないの？
という方向けの記事です。

# やること
kintoneの2つのアプリ情報をまとめて一覧表示します。（標準機能ではできない）

今回は[CData Excel Add-in for kintone](https://www.cdata.com/jp/drivers/kintone/excel/)を使います。
CData Excel Add-in for kintoneの詳細については以下の記事を参考にしてください。
[CData Software ハンズオン（Excelからkintoneのデータを取得&登録）](https://qiita.com/kuwazzy/items/ce82227db6876832eddf)

# 前提
案件管理アプリと活動履歴アプリがあり、案件と活動は1:Nで紐づきます。

- 案件管理アプリの構成
  - 顧客名
  - 案件名
  - 費用
- 活動履歴アプリの構成
  - 活動日（活動数=レコード数が取りたいので、今回の例では何でも良い）

このとき顧客ごとの案件名、費用、活動数、コスパ（費用/活動数）を一覧にします。

# kintoneの準備
まずはアプリストアの営業支援パックをインストールします。
3つアプリがインストールされますが、利用するのは案件管理と活動履歴の2つです。
案件管理には10レコード、活動履歴には20レコードが登録されています。
![cdata1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102790/962e5658-70aa-1eb8-57f5-3392ccb05bb3.png)
![cdata2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102790/424d234b-d557-bca7-5af0-8e970af2f3d9.png)


# CData Excel Add-in for kintoneの準備
以下の記事を参考にCData Excel Add-inをインストールして、接続設定まで完了させてください。
[CData Software ハンズオン（Excelからkintoneのデータを取得&登録）](https://qiita.com/kuwazzy/items/ce82227db6876832eddf)

# 実行
さっそく実行しましょう。
Excelアプリケーションを起動して、空白のブックを開きます。
リボンのCDATAタブを選択し、「取得元Kintone」アイコンをクリックします。
クエリーに以下のSQLを貼り付けて、OKをクリックすると・・・

```sql
SELECT
  matter.顧客名, matter.案件名, matter.合計費用,
  activity.活動数, ROUND(matter.合計費用/activity.活動数) AS コスパ
FROM [CData].[Kintone].[案件管理（営業支援パック）] AS matter
  INNER JOIN (
    SELECT
      顧客名, 案件名, COUNT(*) AS 活動数
    FROM [CData].[Kintone].[活動履歴（営業支援パック）]
    GROUP BY 顧客名, 案件名) AS activity
  ON matter.顧客名 = activity.顧客名 AND matter.案件名 = activity.案件名
  ORDER BY コスパ DESC
```
※過去に営業支援パックをインストールしていた方はアプリ名を変更する必要があるかもしれません。
　アプリ名は「取得元Kintone」アイコンクリック後のテーブル項目を参考にしてください。

できました！
貼り付けたSQLはテーブル名だけが特殊ですが、他は通常のSQLです。これはすごい。
![cdata3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102790/ff7fce08-a591-59f1-9c8b-cc10401a235e.png)
案件管理アプリの情報をベースに、活動履歴アプリの活動数（レコード数）、コスパ（費用/活動数）を表示しています。


# まとめ
CDataを使えばRDBとしてkintoneを扱えるので2つ以上のアプリを結合することも可能です。
今回はわかりやすいように2つで紹介してみました。
AmazonSNS モバイルプッシュ通知の証明書の期限迫るを CodeBuild で Slack 通知する

# 背景

iOS向けのプッシュ通知にAmazon SNSを使うと、Apple証明書をセットする必要があり、有効期限が来たら差し替える必要があります。

Amazon SNSは、有効期限が迫ったらメール通知など仕組みが無いので、自前で構築する必要があります。これまでは以下を元にした仕組みで、特定のEC2サーバーに証明書を転がして、crontabでチェックしていました。めんどうくさい。

* [iOSプッシュ通知用SSL証明書の有効期限をシェルスクリプトで監視する。](https://qiita.com/sand_bash/items/4f35fbcdeca6e1d9c423)

根本的には、証明書の差し替え不要なプッシュ通知に移行するのが対策になるのですが、シュッとできるものでもなく、しばらく付き合う必要があるので、せめて楽できるようにしたいなと。

# 現物

よくよく調べると、AmazonSNSが証明書の期日を知っており、AWS CLIで取れることがわかりました。そしたらopensslコマンドで云々とかcrontabとか廃止できますよ。

* コンテナイメージは `python:3.8-buster` を利用しています。
* slack通知は、python製の `slack-cli` というものが存在し、インストールも利用も簡単なので使います。
    * https://pypi.org/project/slack-cli/
    * slack-cli用のSlackトークンは、Slackで発行したものを、AWS Parameter Storeに入れておきます。
* EXPIRE_DATEは、期日の1ヶ月前には通知が欲しいので、このようにしています。使途に応じて調整してください。
* CodeBuildビルドプロジェクトに、AmazonSNS の Read 権限が必要です。そんな細かく制御する要件は無かったので、IAM で `AmazonSNSReadOnlyAccess` を付けています。
* このジョブを、毎日1回、動かします。

```yaml
version: 0.2

env:
  variables:
    SLACK_CHANNEL_NAME: "notification_test"
  parameter-store:
    SLACKBOT_API_TOKEN: "slackbot-api-token"
  exported-variables:
    - EXPIRE_DATE

phases:
  install:
    commands:
      - echo "dash dash/sh boolean false" | debconf-set-selections
      - DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash
      - apt update
      - apt install -y unzip jq
      - pip install --upgrade --quiet pip
      - pip install --quiet awscli slack-cli
      - aws --version
      - slack-cli --help
  
  build:
    commands:
      - EXPIRE_DATE=$(date --date 'next month' '+%Y-%m-%d')
      - |
        aws sns list-platform-applications \
        | jq -cr '.[][]  | select(.Attributes.AppleCertificateExpirationDate) | (.Attributes.AppleCertificateExpirationDate | .[:10]) as $yyyymmdd | select($yyyymmdd <= "'${EXPIRE_DATE}'") | [ $yyyymmdd, .PlatformApplicationArn ] | @csv'\
        | sort \
        | tee expire.log
      - cat expire.log | slack-cli -t ${SLACKBOT_API_TOKEN} -d "${SLACK_CHANNEL_NAME}"
```

# 参考

* https://docs.aws.amazon.com/cli/latest/reference/sns/list-platform-applications.html
* https://pypi.org/project/slack-cli/
* [いますぐ使うCodeBuild](https://qiita.com/sasasin/items/6e5f7001cba350851d49)
* [iOSプッシュ通知用SSL証明書の有効期限をシェルスクリプトで監視する。](https://qiita.com/sand_bash/items/4f35fbcdeca6e1d9c423)
情報処理学会情報規格調査会の審議に参加するには

情報処理学会情報規格調査会
https://www.itscj.ipsj.or.jp/

は、ISO/IEC JTC1で審議するSC, WG等の日本を代表する会です。


賛助会員制度があります。
https://www.itscj.ipsj.or.jp/katsudo/katsudo_02.html

賛助会員はどこかの審議するSC, WGの国内対応委員会の委員になっていただくことがあります。


会議日程
https://www.itscj.ipsj.or.jp/hyojunka/hyojunka_03.html

会員以外に委員になっていただく可能性があるのは、学術機関、官公庁（公的試験研究機関）などの中立委員と、
消費者などの当事者のほか、他の規格の審議機関との連絡係(liaison)は、相手の組織の一員であれば、
情報処理学会情報規格調査会に参加していただくことがあります。

国際規格の審議だけでなく、一部のJIS化の委員会を開催することがあります。

この場合には、JISの内容によって、その審議する対象の第一者、第二者、第三者の方の均衡から、
賛助会員以外の組織の方に委員をお願いする可能性はあるかもしれません。

規格賛助員、規格準賛助員への加入方法
https://www.itscj.ipsj.or.jp/katsudo/katsudo_01.html
【Go言語】インストールからHello worldまで

今更感ですが、Go言語を習得しようと思い立ったので、自学習にアウトプットしていおきます。
ちなみに、開発環境は「Mac」です。

# Go言語とは
３行で説明すると

* ２００９年Googleが作ったプログラム言語
* 親はC言語、静的型付けのコンパイル言語
* フリーかつオープンソース

# 対応OS

* Linux / FreeBSD
* Mac OS X
* Windows

※2020/01時点

# Go言語のインストール

## インストール
```
brew install go
```

## インストールした場所の確認

```
which go
```

## インストールしたバージョンの確認

```
go version
```

# Hello worldを表示するプログラムの実装

## ファイルを作成

```
touch hello_world.go
```

## ファイルを編集

```
vim hello_world.go
```

```
package main

import "fmt"

func main() {
  fmt.Printf("Hello World\n")
}
```

FYI. [fmt パッケージ - golang.jp](http://golang.jp/pkg/fmt)
> fmtパッケージは、フォーマットI/Oを実装しており、C言語のprintfおよびscanfと似た関数を持ちます。フォーマットの「書式」はC言語から派生していますが、より単純化されています。


# プログラムをビルドする

```
go build hello_world.go
```

# 直接プログラムファイルを実行

```
go run hello_world.go
```

# コンパイルしたファイルを実行

```
hello_world
```
64bit Linuxに、32bit用のJava 1.4をインストールする

# はじめに

本稿の筆者は、一般企業でJava/.NET向けの自社プロダクトを開発しています。
Enterprise向けとなると、Java1.4への対応もいまだに求められる状況で、Java1.4での開発環境構築を
行わないと自社製品の開発ができません。

で、WindowsのJava1.4向けのインストーラは、代々受け継がれてきたものがある＆32bit版でも、
Windows上ではちゃんと動いている（ように見える）のですが、Linux版ではそうはいかず、
いろいろな記事を見回ってみたものの、すべての情報がまとめられた環境はなかったので、
だれか困っている人の助けになればと思い執筆しました。（そんな人いないか・・・？）

## TL;DR

* Oracleの[Java Archive ダウンロードサイト](https://www.oracle.com/java/technologies/java-archive-javase-v14-downloads.html)から、バイナリを取得
* ld-linux.so.2をインストール
* バイナリを実行し、ライセンスを読み、agreeするとインストールが始まる
* JAVA_HOMEとか設定して、あとはいつも通り使うだけ。

## 実行環境

試行錯誤で環境が汚れるのがいやなので、Dockerを使います。

* OS: CentOS 7.7.1908 (Docker on CentOS on VirtualBox）
* docker version: 19.03.5

## 失敗編

### 準備するもの

Oracleの[Java Archive ダウンロードサイト](https://www.oracle.com/java/technologies/java-archive-javase-v14-downloads.html)から、バイナリを取得します。

* j2sdk-1_4_2_19-linux-i586.bin

### インストール手順

* バイナリを、任意のフォルダに展開します。

```bash
$ mkdir /usr/local/java/
$ unzip j2sdk-1_4_2_19-linux-i586.bin -d /usr/local/java/
```

※デフォルトのCentOSイメージの場合、unzipコマンドが入ってないと思うので、インストールしてください。

* 定番の`JAVA_HOME`を設定します

```bash
$ export JAVA_HOME=/usr/local/java/j2sdk1.4.2_19
# ついでにPATHも指定します
$ export PATH=${PATH}:${JAVA_HOME}/bin
```

### さて、実行してみましょう！

```bash
$ java -version
$ bash: /usr/local/java/j2sdk1.4.2_19/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
```

あれあれ・・・？

#### エラーの原因（/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory）

32bit向けにビルドされたバイナリを実行するために必要な、glibcの互換ライブラリらしいです。
これがないと、64bit Linuxでは動かない。

#### glibcをインストールします

```bash
$ yum install -y ld-linux.so.2
```

### さて、実行してみましょう！（２回目）

```bash
$ java -version
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object
```

~~はいクソー~~

#### エラーの原因（java/lang/NoClassDefFoundError: java/lang/Object）

`${JAVA_HOME$}/lib/rt.jar`がない、もしくはその中に`java/lang/Object.class`がないのが原因っぽいのですが、
なんとダウンロードしてきたバイナリの中に、rt.jarが含まれていません。。。

```bash
$ cd ${JAVA_HOME}/lib
$ ls -al | grep rt.jar -c
0
```

いろいろな情報を読み漁りましたが、いい感じの方法は見つかりませんでした。

## 成功編

```bash
$ mkdir /usr/local/java/
# /tmpにバイナリをおいてます
$ chmod +x /tmp/j2sdk-1_4_2_19-linux-i586.bin
$ cd /usr/local/java/
# バイナリを実行
$ /tmp/j2sdk-1_4_2_19-linux-i586.bin
　・
　・
　・
　ライセンスが長々と続く
　・
　・
  Do you agree to the above license terms? [yes or no]
  # この文章が出たら、ライセンス規約に同意できる場合のみyesを入力してenterでインストールが始まる。
# JAVA_HOMEを設定
$ export JAVA_HOME=/usr/local/java/j2sdk1.4.2_19
# ついでにPATHも指定します
$ export PATH=${PATH}:${JAVA_HOME}/bin
```

無事、実行できるようになりました。

```bash
$ java -version
java version "1.4.2_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)
Java HotSpot(TM) Client VM (build 1.4.2_19-b04, mixed mode)
```

念のため、ビルド～実行までを試してみましょう。

```java:Hello.java
public class Hello {
        public static void main(String[] args) {
                System.out.println("Hello, World");
        }
}
```

親の顔より見たHello, World・・・

```bash
$ javac Hello.java
$ java Hello
Hello, World
```

なんとかなったんじゃないでしょうか

## 感想

最近のJavaは、バイナリをインストールしてきてPATHさえ通せば使える感じなので、こなれたやり方でやろうとしたら失敗した感じです。。。
バイナリインストールは楽でいいですね！

~~インストールした後実行ファイル（JAVA_HOME）を別環境にもっていくと、ld-linux.so.2さえあれば動くぞ・・・！~~
間違えて違うブランチでプッシュした場合

# 間違えて違うブランチでプッシュした場合


既にプルリクエストしているブランチにいて、
間違えてpushしたら焦ったので、メモとして残します。

###gitでlogの確認

```git log --oneline```
抜けるときは 'q'を押下

###最後のプッシュを削除する場合

```git reset --soft HEAD^```

softとhardとあるが
soft 修正したソースは残る
hard 修正したソースは消える

検索するとhardがヒットするのが多かったので備忘録として

###最新のプルリクエストの変更
```git reset HEAD .```

###修正したソースを退避
```git stash save -u <任意の名前>```

###間違えてプッシュした前の状態でプッシュ
```git push -f origin HEAD```

###スタッシュしたソースの確認
```git stash list```

これは操作：スタッシュしたソースを戻したいブランチに移動

修正したソースをブランチにマージ（コンフクリト起きた場合はやったことないので知りません）
```git stash pop```
これで、スタッシュしたソースがマージされる。

あとは今まで通りコミットしてプッシュしてね。

教えてもらいながらしたので、ご指摘あればお願いします。
aws-cliでアクセスしているユーザ情報を確認する

# aws-cliでアクセスしているユーザ情報を確認する

どのアカウントでログインしているかコマンドで確認する

下記のようにクレデンシャルファイルではアクセスキーとシークレットキーはわかるがこれが何かはわかりにくい

~/.aws/credentials

``````
[default]
aws_access_key_id=XXXXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
``````

そこで`aws sts get-caller-identity`を実行すればarnなどの情報から判別することができる

```
> aws sts get-caller-identity
{
    "UserId": "XXXXXXXXXXXX",
    "Account": "1234567890",
    "Arn": "arn:aws:iam::1234567890:user/user-name-1"
}
```
WRF > NOAA OI SST データの日時について > ファイル名、Nominal time、start time, stop time

### 日時

- [2020-01-15 WRF > NCEP SST Analysisデータ終了後のSSTデータの選択 > OI SSTデータの使用](https://qiita.com/7of9/items/39ae638926341b73c769)

WRFのWPSで使うSSTとしてOI SSTを検討している。
OI SSTにはいくつかの「日時」がある。

- A. ファイル名
    - 例: 20200111120000-NCEI-L4_GHRSST-SSTblend-AVHRR_OI-GLOB-v02.0-fv02.0.nc
    - 2020年1月11日12:00:00
- B. Nominal time
    - 2020年1月11日00:00:00
- C. start time
    - 2020年1月11日00:00:00
- D. stop time
    - 2020年1月12日00:00:00

CとDについては理解できる。
AとBの定義が不明であった。


### メール質問への回答 (概略)

NOAAにメール質問をして、主に以下の回答を得た。

- ファイル名は「中間の日時」にしている
- Nominal timeは１日の異なる時刻のデータすべてに同じ日時を付けている

OI SSTは１日１個のデータであり、１日に4個などとなることはないが、Nominal timeは0時の日時が入るようにしているようだ。
pythonで複数行あるときの文字列の書き方

#はじめに
競プロで一括でinputしてやろうと思って

#方法

```python
multi_line = """ 
いええええええええええええええ
えええええええええええええええ
えええええええええええええええ
えええええええええええええええ
えええええええええええええええ
えええええええええええええええ
えええええええええええええええ
えええええええええええええええ
えええええええええええええええ
ええええええええええええええい
"""
```
tmuxの表示が崩れる

# 環境
ubuntu 16.04
tmux 2.1 

# 流れ
windowsのsshで複数マシンから同時接続してからtmuxの表示が崩れるようになった。
出力がターミナルの末端まで来ると、その後中間行から出力され正確な表示ができず。
sttyの再設定なども試したが改善が見られなかった。

# 解決方法
[ここの記事](https://qiita.com/ymizushi/items/43a3b3cb3f1e06a295f4)を参考にtmuxを最新のバージョンに入れ替えたところ直りました。
感謝
課題((public) Carクラスの作成)




class Car {
	
	int num;
	double gas;
	
	void show() {
		System.out.println("車のナンバーは" + num + "です。");
		System.out.println("ガソリンの量は" + gas + "です。");
	}
	
	void setNumGas(int n, double g) {
		num = n;
		gas = g;
		System.out.println("車のナンバーを" + num + "にガソリン量を"
					+ gas + "にしました。");
	}
	
	void charge(double fuel){
		//fuel = gas;
		fuel += gas;
		System.out.println("ガソリン量を" + fuel + "にしました。");
	}
}

class publicCarClass {
	public static void main(String[] args) {
		
		Car car1 = new Car();
		
		int number = 1234;
		double gasoline = 20.5;
		
		car1.setNumGas(number, gasoline);
		
		double kyuyu = 10.0;
		car1.charge(kyuyu);
	}
}
azure data lake gen2 ファイル操作方法いろいろ

# はじめに

自分用の資料のリンク
azure data lake gen2 はファイルのアップロード方法が複数ある。

# hdfs cmd

hadoop 3.2.1からazure data lake gen2をサポート

https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-use-hdfs-data-lake-storage
https://hadoop.apache.org/docs/current/
https://iwasakims.github.io/trunk/hadoop-project/hadoop-azure/abfs.html

## 認証方式

- access key
- managed identity

sas tokenは使えない

# azcopy

`azcopy cp`コマンドでローカルからdata lake gen2にアップロードできる。
ローカルからdata lake gen2からのアップロードはネイティブapiだが、data lake gen2からdata lake gen2へのコピーはblobのapiを使う。

https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azcopy-v10

### 認証方式

- sas token
- managed identity

access keyは使えない

# python SDK

## azure-storage-file-datalake 
というモジュールがあるが、まだプレビュー段階（2020年1月段階)

https://pypi.org/project/azure-storage-file-datalake/
https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-directory-file-acl-python

### 認証方式

- sas token
- access key
- managed identity

## azure-storage-blob

こちらはプレビューではないが、data lake gen2のapiではなく、blobのapiを使う。

https://pypi.org/project/azure-storage-blob/
https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-python

### 認証方式

- sas token
- access key
- managed identity
docker-composeコマンドが失敗する【docker for windows】

## 環境
![コメント 2020-01-31 115847.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293810/a9edc620-2145-794a-737e-34c939324b43.jpeg)


## エラー内容
```
PS C:\workspace\新しいフォルダー> docker-compose build
Building tmp
Traceback (most recent call last):
  File "docker-compose", line 6, in <module>
  File "compose\cli\main.py", line 72, in main
  File "compose\cli\main.py", line 128, in perform_command
  File "compose\cli\main.py", line 303, in build
  File "compose\project.py", line 403, in build
  File "compose\project.py", line 385, in build_service
  File "compose\service.py", line 1106, in build
  File "site-packages\docker\api\build.py", line 158, in build
  File "site-packages\docker\api\build.py", line 341, in process_dockerfile
UnicodeEncodeError: 'ascii' codec can't encode characters in position 13-20: ordinal not in range(128)
[4220] Failed to execute script docker-compose
```

## 対処
フォルダ名の日本語が悪いっぽい。
英数字に変更したら動いた。
前は動いてたのにどうして...
MAEHARA_Keisukeのポータル記事

# テーマごとの記事一覧

## ***ROS2***
1. [RaspberryPi2 v1.1でもROS2 Dashing Diademataを動かしたい][1]
1. [（たぶん）最小コスト・最短時間でROS2にマイコンを繋ぐ話][2]
1. [M5Stack社製ESP32系モジュールでのmicro-ROSサンプルの確認][4]
1. [micro-ROS for ArduinoによるROS2対応IMUデバイス（第1報）][5]
1. [Android端末でROS1/ROS2を動かす（Rvizもあるよ！）][6]
1. [micro-ROS on Wio Terminal with WiFi UDP Transport][7]

## ***micro-ROS***
1. [M5Stack社製ESP32系モジュールでのmicro-ROSサンプルの確認][4]
1. [micro-ROS for ArduinoによるROS2対応IMUデバイス（第1報）][5]
1. [micro-ROS on Wio Terminal with WiFi UDP Transport][7]

## ***Micro-XRCE-DDS***
1. [（たぶん）最小コスト・最短時間でROS2にマイコンを繋ぐ話][2]

## ***Autoware.Auto***
1. [Autoware.Autoをインストールしてみた][3]

## ***RaspberryPi***
1. [RaspberryPi2 v1.1でもROS2 Dashing Diademataを動かしたい][1]

## ***新規テーマ用予約***

## ***仕込み中（Coming Soon...なのか？）***

# 本記事の目的

本記事は私（@MAEHARA_Keisuke）がQiitaに投稿した記事へのリンクを，テーマ別にまとめるための記事です．私が投稿する記事の末尾に，参考資料の一つとして本記事へのリンクを貼るようにします．
タグフィードなどから私が投稿した記事をご覧になった方が，「この人は他にどんなテーマに興味を持っているんだろう？」と感じられた際に，時系列順に並んだ記事一覧よりもテーマごとに整理されていた方が閲覧し易いだろうと考えました．テーマ名はQiita内でよく使用されているであろうタグ名をそのまま使用することとします．複数のタグを付与した記事についても，なるべく最も関連のあるテーマに紐付けるつもりですが，テーマ間で優劣つけ難い場合は複数のテーマに記事がぶら下がることもあります．
なお，本記事そのものはタグ検索などの際にヒットしない方が望ましいと考えたため，タグ付けしないものとします．と言いたいところですが，タグを空にして投稿はできないため，「自己紹介」タグのみ付与します．

[1]:https://qiita.com/MAEHARA_Keisuke/items/372ff79844a012035bc9
[2]:https://qiita.com/MAEHARA_Keisuke/items/81ac6909444c23168eb3
[3]:https://qiita.com/MAEHARA_Keisuke/items/81e2cae93f50cabd160c
[4]:https://qiita.com/MAEHARA_Keisuke/items/fb94a9bd61db7564a413
[5]:https://qiita.com/MAEHARA_Keisuke/items/1df4edef01560bb18161
[6]:https://qiita.com/MAEHARA_Keisuke/items/4422ae78fb154fc2a851
[7]:https://qiita.com/MAEHARA_Keisuke/items/bf08aa46db5e17007c77
「１０分」で「無料」の「wordpress」ブログを始める方法　（カード登録も不要）

# Qiita上の「無料でwordpressを運用できる」記事はほとんど誇張

「Heroku」か「GCP」を利用する記事に分けられます。

[驚くほど無料で一瞬でWordPressを用いたブログ環境を構築できた話](https://qiita.com/fuwamaki/items/8684003bb47197336645)

* これはHerokuを利用する例ですが、Herokuは現在、1日18時間しか無料で運用できなくなりました。しかも手続きが面倒。

[GCP(Google Cloud Platform)でWordPressスタート]
(https://qiita.com/sakkaonline/items/95daa42f97b9d55c345f)

* これはGCPを利用する例ですが、期間が一年＋αのみ、しかもカード登録が必須。しかも手続きが面倒。


#### 300MBまでなら、gmailのみで登録でき、ずっと無料で利用できる、wordpressの動くサーバーがあります

それが[000webhost](https://www.000webhost.com)です。

# ワードプレスを動かすまでの手順

* wordpressを動かすまでの手順

1. [000webhost](https://www.000webhost.com)にグーグルかFacebookで登録
![スクリーンショット 2020-01-31 3.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575398/745670de-e8e5-7b5b-f7fb-fed95d8e0004.png)

2. Create Newsiteをクリックして自分のサイトを作る→完了したら以下のように自分のサイトが表示されるので、Manage Websiteをクリック
![スクリーンショット 2020-01-31 4.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575398/81432856-9390-7789-7a73-82f514000cf2.png)

3. Install Wordpressをクリック ![スクリーンショット 2020-01-31 3.50.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575398/16027256-4248-6416-7f5c-0caf6b60dbc8.png)
4. 完了です！![スクリーンショット 2020-01-31 4.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575398/fe0f1c08-77b4-77c2-2ae9-615afee9a355.png)


**たった４ステップでできました。**


ちなみにwordpressをインストールすると使える300mbのうち25%ほど使います。

ブログを早速書いて見ました。

https://todai.000webhostapp.com/2020/01/qiitaの皆さんこんにちは〜



# 最後に

このように無料でとりあえずwordpress試したいときには000webhostが最良の選択肢かと思います。

他にも、PHPスクリプトならcronで自前のスクリプトを定時実行させられるし、スクリプトファイルをアップロードして掲示板システム等も作れます。

掲示板を000webhost上で無料で作りたい人は以下の記事も見てください。
[超使いやすい掲示板を無料かつ一時間で作ってみた　（「東大生用のBBS」と「京大マップ掲示板」の避難所を作成しました）
](https://qiita.com/utokyobbs/items/ab15ae39698475e0bac7)

作った掲示板のホームページ
https://qiita.com/utokyobbs/items/e6d04d1473b72768f5fc


【重要】**もしもっと良い無料で手軽に使えるサーバーがあれば教えてください！！**

とくにpythonのライブラリ等が自由にインストールできるところを探しています。
TypeScriptで**安全に**プロパティの実在を確認する方法

## 結: オプショナルプロパティとしてasする

`x: unknown`に対して`typeof (x as { 存在確認したいプロパティ名?: string }).存在確認したいプロパティ名 === 'そのプロパティの型'`する。

```typescript
interface Account {
  readonly id: string
  name: string
}

function isAccount(x: unknown): x is Account {
  return (
    typeof (x as { id?: string }).id === 'string' &&
    typeof (x as { name?: string }).name === 'string'
  )
}
```

TypeScriptの`as`はほとんどの場合に不健全で、責任が重すぎて使えたものではないですが、オプショナルプロパティ付きオブジェクトへの`unknown`からの`as`だけは健全っぽいです。
（
xが`object`であるなら、任意のプロパティ`foo`が存在するか、もしくは存在しないので。
また`x as { foo?: Bar }`はxが`object`であることの確認を含んでいるので。
）
kintone REST APIのレコード内容をPOSTMANで確認する


kintonのAPIを叩いて取得したデータをサイトに反映　といった感じのものをやりたい。

テスト用アプリは作成済。
ということで、作成したアプリの組み方が問題ないか、サイト側の対応はどのようなものでよいか、の確認のために実際返ってくるjson形式を調べます。

phpコードを書いて。。うんぬんは後日やるので、まずは手軽に確認するためにpostmanを使ってみました。







<br>

ここを見ながら作業します（というか答えはここに書いてある）
https://developer.cybozu.io/hc/ja/articles/360028177472


##GET　レコードの取得


###1.レコードを一括取得

</br>


**・URI**
https://(サブドメイン名).cybozu.comk/v1/records.json/k/v1/records.json
※サブドメイン名は自分の使用しているもの。わからなかったらデータを取りに行きたいアプリ画面のURIを見る。
一件とるだけなら/k/v1/record.json


**・必要なアクセス権**
アプリのレコード閲覧権限
値を取得するレコードの閲覧権限
値を取得するフィールドの閲覧権限
※アプリ側のアクセス権の設定が必要なので、設定していない場合はまずそちらを設定する。
↓アクセス件の設定
https://jp.cybozu.help/k/ja/user/app_settings/rights/app_rights.html


**・リクエストパラメータ**
app  アプリのID を指定　（※必須）
※わからなかったらデータを取りに行きたいアプリ画面のURIをみる


**・リクエストヘッダ**
ユーザー認証のためのヘッダ
X-Cybozu-Authorization　：「ログイン名:パスワード」をBASE64エンコードしたものを値に指定
※ログイン名が「Administrator」、パスワードが「cybozu」の場合
X-Cybozu-Authorization:QWRtaW5pc3RyYXRvcjpjeWJvenU=

<br>

これらの情報が準備できたら、postmanの画面で入力していきます。
↓こんな感じ
![postman1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574684/b99d4755-af1b-8ebb-620b-e403b6392dbb.png)
chrom拡張機能を使ってます
https://chrome.google.com/webstore/detail/tabbed-postman-rest-clien/coohjcphdfgbiolnekdpbcijmhambjff


「Send」を押したら取得！
![postman2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574684/7cfa79bd-eb30-07f7-c72c-ca9c97aa658d.png)




###2.ソートさせて一括取得

リクエストパラメータを追加することでソートができます。というかその他もお望みのまま。
![query.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574684/e515ce67-83c4-13a2-afe6-84ff0a55fc88.png)


「query」パラメータを使ってフィールドコードを指定してソートさせます。
![query2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574684/aafb7bd0-c5ac-74d8-8404-4aa9bfbef602.png)
↓アプリ側のフィールドコードの設定
https://jp.cybozu.help/k/ja/user/app_settings/form/autocalc/fieldcode.html

<br>

今回は簡単にフィールドコード「sort」を昇順で並べ替えしました。
![postman3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574684/d95adbaf-64f5-b015-5638-e3998e6affe3.png)



###注意点
・一度に取得できるレコードは 500件まで。　※2020年1月時点
・今回のアプリではサブテーブルにある値でのソートはできなかった

##　感想

まずは簡単にjson形式を調べたかったらこれだけでいいのか。。。と理解。
postman全然触ったことなかったんですが、今回のようなちょっとしたことを試すだけでもすごく便利でした。
パラメータやヘッダの追加もミスなく簡単にできる。

ここには記載してないのですが、kintoneのアプリ作成もすごく簡単にできたので感動でした。




引用元：
パラメータ表のスクリーンショットなど
https://developer.cybozu.io/hc/ja/articles/360028177472
[メモ]docker start で立ち上がらないとき

## docker start {コンテナID} で立ち上がらなかったときのメモ

`docker run -d ubuntu:latest`で立ち上がらなかったため、
`docker run -itd ubuntu:latest`をすると立ち上がった。

## 現象
`docker run -d ubuntu:latest`を実行後、
`docker start {コンテナID}`を実行し、
`docker attach {コンテナID}`をしたが、
`You cannot attach to a stopped container, start it first`
と怒られる。

再度コンテナの立ち上げ（オプションに `-i` `-t`）を実行したら立ち上がった。
Railsにhamlを導入しよう

🚨この作業は、railsでまだ初期のファイルしか存在していないことを前提に記述しています。
Railsで某有名メッセージアプリを制作しています。
Railsにhamlを使いたい。　簡単です。
（ご自身の環境にあった設定をお願いします）
Gemfileに
　　　
   gem 'haml-rails' と追記　すべの環境に適用するため、一番下に記述。
もちろんbundle installも忘れずに。
これでいいと思ってたんです。。。。。

でも拡張子がerbのファイルはすでに存在していますので、<img width="587" alt="ターミナル.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561051/0007a1ae-f77f-db96-bbcd-ab2e8fd8af06.png">
を行いましょう。
<img width="581" alt="ターミナル２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561051/b6661b57-3e92-0a04-c194-cfd696fcd0ec.png">
　次のこのような質問がなされます。基本的にyを選択していただいて構いません。
🚨この作業は、railsでまだ初期のファイルしか存在していないことを前提に記述しています。
【CakePHP4】 newEntityとpatchEntityの違い

みなさん、こんにちは。

今回は、Entityについて書いていきたいと思います。

これを読めば、Entitiyには、**「どのようなもので」「どのようなものに使うことができるのか」**、**newEntityとpatchEntity**は、何が違うのかなどの感覚が掴めると思います。

##そもそもEntityとは？

**Entity**はどういうもので何ができるのか？

モデル→データベースに対して、データを取得したり、書き加えたりする。MVCのなかの一つ

テーブル、エンティティは、対象の範囲の違い
テーブルは、データベース全般が対象、エンティティは各レコードなどDBの中でも更にフォーカスしたものって感じ。

基本的な流れは下記の図で。

<img width="472" alt="スクリーンショット 2020-01-31 11.20.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300592/d800f682-ea89-33ef-90ac-1cc67114b501.png">


##newEntitiyとは？

Entityを新規作成するときに使用する

具体的には、新規追加、保存処理をするときに使用

新しく保存されるときにデータの検証が行われる

データの検証の詳細は、hoge/Table.phpのvalidationメソッドに書く

データからエンティティーを構築する時、データの検証 (バリデーション) ができます。 
データのバリデーションではデータの型、形状およびサイズなどを確認することができる。
既定ではリクエストデータがエンティティーに変換される前に検証が行われます。 
検証が通らなかったらエラーが返る。


##patchEntity とは？

主にデータの更新するときに使用する。

これも同じくデータの検証が行われるという意味では、newEntityと同じ。

newEntityと同じように、 patchEntity メソッドは、データがエンティティーにコピーされる前に 検証を行います。このメカニズムは エンティティー構築前のデータ検証 のセクションで説明されています。 エンティティーにパッチを当てる際に検証を無効にしたいのであれば、 validate オプションにする。

##具体的な用途の違い

自分の現状の認識では、newEntityに出来て、patchEntityに出来ないものは、なさそう。
（色々な機能がある分、データ取得するなど速度に影響してきそうだけど）

例えば、確認画面で以前に入力した値と現在入力した値を比べて参照できるようにするためには、patchEntityを使うことになりそう。

新規作成画面にpatchEntityが使われていたことを確認したので、自分が知らない挙動があってもおかしくはないと思っています。
ご存知の方がいらっしゃいましたら、教えてくださるとありがたいです。


詳しくは、CakePHPの公式ドキュメントでご確認ください。https://book.cakephp.org/4/ja/orm/validation.html  

読んでくださり、ありがとうございます。
Cocoapodsで生成した.frameworkファイルにInfo.plistが含まれず、Simulatorへのアプリのインストールが行えない問題

直前になにをやっていたことを覚えてないので、おかしくなった理由は曖昧になるが「とりあえずこれ試してみて」みたいなお気持ちでまとめておく。

## 症状
あるときSimulatorへアプリをインストールしようとしたら、次の画像のようなエラーが発生してしまって、アプリの起動ができなくなってしまった。

![スクリーンショット_2020-01-29_14_49_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46597/076103a0-7584-1400-2645-b3fdba7b2fe0.png)


## 対処
次のうちどれがアタリだったかわからないが、いずれかを行なったあとで `pod install` しなおしたら直った。

### Xcode.appというアプリを一つApplicationディレクトリに含めるようにした
Xcodeのバージョンを疑って最新のバージョンを入れたが、そのときすべてのXcode.appの命名をXcode_x.x.x.appにして、複数バージョンの共存状態を作った。なにか命名に依存する仕組みがどこかで利用されているとしたら、これが原因かも。

### xcode-select -switchで利用するXcodeのバージョンを指定しなおした
Xcodeのバージョンや命名をいじったため、xcode-selectが適切に行われていなかった可能性があったのでやりなおした。

### Xcode > Preference > LocationsでXcodeのバージョンを指定しなおした
xcode-select -switchと同様の理由で、Xcodeバージョンを指定し直してみた。

###  macを再起動した
xcode-select -switchを行なったあと、xcode-select -pで指定したバージョンを確認したが、適切に設定されていない様子があった。どうもおかしいと思い、再起動を行なって再度switchしてバージョンを確認したらうまく切り替えが行われた。
仮想デスクトップを使ってみたら開発効率がUPした件

#転載元
当記事は以下ブログからの転載です。
[TECH BACK](https://techback.info/win10-virtual-desktop/)

#きっかけ

Windows10標準機能の**「仮想デスクトップ」**って使ったことありますか？
私も今まで使ったこと無かったんですけど、試してみたら思った以上に開発効率がアップしましたので紹介します。

#仮想デスクトップって？

`Windowsキー と Tabキー`

を押してみてください。

いま開いているウインドウの一覧が出ると思いますが、そこの上の方に

↓こんな表示ありません？？？ こいつです！

![img_5e1d1ea483b9d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450952/acea8ca4-08e4-54a1-f2f2-7cffa493e0da.png)


#こんな時に便利！
デスクトップが複数使えるんだ！
（　＾ω＾）・・・で？ となりますよね。

**やっている事(ジャンルとか)ごとにデスクトップを分けると、かなり業務効率がUPします！**

例えば。。。。

- プロジェクトを複数掛け持ちをしている時。
- 仕事とプライベートで
- プロジェクターにPCの画面を移す時。 ← これ結構大事！！

などなど、

同じエクスプローラを開いていても、どのプロジェクト用途で開いたんだっけ？？？とか、頭がごちゃごちゃになっちゃいがちですが、そんなのが防げます。

#使い方
もう、つべこべ言わず**ショートカット 覚えちゃいましょう！**
覚えるのは数個です！これで、生産性UPするんだし～

##覚えるショートカット
とりあえず、3つ覚えたらOK。私は基本これだけで、結構効率上がってます。

| 機能       |    ショートカット   |
|:-----------------|:------------------|
| 新しくデスクトップを作る |Win + Ctrl + d|
|今開いているデスクトップを閉じる|Win + Ctrl + F4|
|表示しているデスクトップを切り替える|Win + Ctrl + ← or →|


##試しに使ってみる
新しくデスクトップを追加しないと、話しが始まらないですね～

ショートカットキー `Win + Ctrl ＋d`

すっからかんのデスクトップできました?? 出来たら、それでOK
一応確認しましょうか～ `Win + tab` で！ お～一つ増えてますね。

![img_5e1d28eceb764.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450952/c7812e06-cc01-1f5b-8851-4906842af0de.png)


今度は、作ったデスクトップを消してみましょうか。

`Win + Ctrl + F4`

こちらは、さっきの逆ですね。新しくできたデスクトップ3が消えてればOKです。

お次は、デスクトップの移動。 ※デスクトップを複数ある状態にしてから。

`Win + Ctrl + ←`

他のデスクトップに移動できました？？

増やしたデスクトップは次回PC起動時も有効になってるので、PC立上げのたびに追加する必要はありません。




是非使ってみてください。

※ブログからの転載&加筆記事です。よろしければ[ブログ](https://techback.info/win10-virtual-desktop/)の方もご覧ください！
よく使うHerokuコマンド


### herokuをremoteリポジトリに追加

```
heroku git:remote -a {herokuアプリ名}
```

### 接続先herokuのURL変更
まず、`git remote -v `で現状の接続先を確認した上で、以下のコマンド

```
git remote set-url heroku {ここに変更するURLを貼り付け}
```

### herokuアプリ名の変更
初期のアプリ名（単語+ランダム文字列)を変更するときや、作ってて途中でアプリ名変えたいときに使用。（このコマンド実施することで、上記の接続先URL(アプリ名が含まれる）も自動的に変更される。）

```
heroku rename {新しいアプリ名}
```

### ローカルブランチ(git)からのpush

```
git push heroku master
git push heroku    #master は省略可能
```

### dbのリセット、再構成

```
# DBリセット(Postgre前提)
heroku pg:reset DATABASE
# 最構成
heroku run rails db:migrate
```

### メンテナンスモード
db:migrateしなきゃいけないときとか作業時にアクセスされたくないとき、一時的にアクセスできない状態（エラーページを表示）するときに使用

```
heroku maintenance:on   #メンテナンスモード開始
heroku maintenance:off  #メンテナンスモード終了
```

### HerokuのサーバーにSSHで接続


```
heroku run bash --app MyApp
```

上記コマンド後にheroku上でbashコマンド(ex. ls, cat, cd)が実行できる


# コメント
railsチュートリアルなどやっていく中で、herokuちょくちょく触りますが、すぐ忘れてしまうので備忘として残す。適宜追加します。
Unity2019.2以降のTest RunnerをJenkinsと連携させる時の備忘録

## はじめに

Test RunnerとJenkinsを連携させる際にバージョンの違いでいくつかコマンドの変更などがあったので、簡単にまとめたいと思います。EditModeとPlayMode両方に対応しています。

## 環境

- Windows 10 Home
- Jenkins: ver. 2.204.1
- Unity 2019.2.17f1
- Test Framework 1.0.18

## Test Runnerの導入

2019.2以降ではデフォルトでTest Runnerが使えない状態になっています。[Window]->[Package Manager]から「Test Framework」をInstallしてください。

インポートが終わると、[Window]->[General]->[Test Runner]からビューを表示できるようになります。

## Tests Assemblyの作成

こちらの記事が分かりやすかったです。

[Unityでテストを書くのが当然になる時代に今から備えよう - Qiita](https://qiita.com/naninunenoy/items/b5092774fed30739adbc#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E4%BD%9C%E3%82%8B)

## Jenkinsとの連携

概ねこちらの記事の通りなのですが、いくつか詰まった部分があるので補足していきます。

[UnityのEditor Test RunnerをJenkinsで走らせて、Slackで通知 - Qiita](https://qiita.com/fuqunaga/items/f92244502e946d34578b)

### コマンドラインからTestを実行

ドキュメントはこちらです(Test Framework @1.0系)。
[Running tests from the command line | Package Manager UI website](https://docs.unity3d.com/Packages/com.unity.test-framework@1.0/manual/reference-command-line.html)

[コマンドライン引数のマニュアル](https://docs.unity3d.com/Manual/CommandLineArguments.html)や[Test Runnerのマニュアル](https://docs.unity3d.com/jp/current/Manual/testing-editortestsrunner.html)を見てもほとんど記述がないので混乱するのですが、Package ManagerのTest Frameworkのページに載っていました。今後はこちらに移行するのかと思ったのですが、[Unity2020.1のTest Runnerのマニュアルページ](https://docs.unity3d.com/2020.1/Documentation/Manual/testing-editortestsrunner.html)は存在していてよく分からないです。

テストはこのように実行します。

```.sh
-batchmode -runTests -testPlatform editmode -testResults "${WORKSPACE}\result.xml" -logFile
```

- `runTests`: テストを実行します。
- `testPlatform`: `editmode`もしくは`playmode`を指定することができます。`testPlatform`がない場合はデフォルトEditModeで実行されます。この部分にプラットフォーム(StandaloneWindows, iOSなど)も指定できるようですが未確認です。
- `testResults`: 結果ファイルのパスを指定できます。単に`result.xml`だけでは出力に失敗したので、絶対パスで指定するようにしてください。

また、古いバージョンとの差分は恐らくこのようになっています(後方互換性あるかも)。

- `runEditorTests`->`-runTests`
- `testsResultFile`->`testResults`

### テスト結果をビルド結果に反映させる

EditModeとPlayModeの両方のテスト結果を通知する方法を紹介します。先の記事にあるNUnit Pluginを導入してください。(JUnitではないので注意です）

差分として、標準で書き出されるファイル名が`EditorTestResults.xml`でなく`TestResults-xxxxxxxxxxxxxxxxxx.xml`(xは数字)に代わっています。

そのため、[NUnit test result report]の[Test report XMLs]には`*.xml`を指定し、ビルド時には下記のようなコマンドを設定してください。

![dfasdキャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/5b84c56b-57c6-0fbc-cb9e-5dfc6f76ad4a.png)

```.sh
# EditModeテストの実行
-batchmode -runTests -testPlatform editmode -testResults "${WORKSPACE}\result-editmode.xml" -logFile
# PlayModeテストの実行
-batchmode -runTests -testPlatform playmode -testResults "${WORKSPACE}\result-playmode.xml" -logFile
```

こうすることで、それぞれのビルド結果が`resut-editmode.xml`,`resutl-playmode.xml`に出力され、`*.xml`で両方ともビルド結果に反映されるようになります。出力ファイルはビルドする毎に上書きされます。出力ファイル名を指定しない場合はビルド毎に新しいファイルが生成されるため、ビルド結果に前回のテスト結果も含まれてしまう点に注意してください。また、誤ってEditModeとPlayModeの出力ファイル名を同じにしてしまうと後から実行された方に結果が上書きされてしまう点にも注意してください。

## 参考

- [[UnityTest]UnityTestのPlayModeテストをコマンドラインから実行する - Qiita](https://qiita.com/ShibainuBot/items/306e4d4b3497d07ec577)
- [【Unity】Unity Test Runner がコマンドラインから実行できなかった場合に考えられる原因 - コガネブログ](http://baba-s.hatenablog.com/entry/2019/03/19/172000)
【暗記】to_i と to_s が覚えられない(ruby)

プログラミングスクールに通ってから２週間。
とりあえず本試験はパスしたけど、不安しかない。

本気で復習しないってことでカリキュラムをもう一度見直したら
rubyでこんなのが出てきた。

<span>　</span>to_iメソッド

<span>　</span>to_sメソッド

文字列を数値に変えるか、その逆かの違いなんだけどどっちが
どっちかごちゃごちゃになる（そもそも覚える気がない）。
ということでメモっておきます。

<span>　</span>to(〜に変える)　i : integer（整数） →　to_iメソッド ： 文字列を<b>数値に変える</b>

<span>　</span>to(〜に変える)　s : string（文字列） → to_sメソッド : 数値を<b>文字列に変える</b>

単語の意味で覚えると覚えやすいかも。
Docker for Windows(2.2.0.0) でハマった話

TL;DR : 
`Docker for Windows(2.2.0.0)`でネストされたPathを`volumes`に指定するとローカル側の変更がコンテナ側に反映されないバグ.
Dockerのversion下げるかネストPath指定しない事で回避可能.

現象
---
1. WebAppディレクトリ以下にDockerファイルを配置しLAMP環境構築,コンテナ起動してデバッグ作業を行おうとした.
2. configいじってデバッグしようとしたら設定が反映されなかったのでcacheか?と`Apache`や`php`のcache関連の設定を行ったが解決せずハマった.

ディレクトリ構造は以下の通り

```
web_project/
  ├　...
  └ docker/
      ├ docker-compose.yml
      └ docker/
          ├ LAMP環境コンテナ設定フォルダ
          └ ...
```

`docker-compose.yml`のApache`volumes`に以下のように記述していた

```
volumes:
    - ../../. :  /var/www/html
```

色々探し回った結果`Docker`のバグらしい事が判明,ネストせずに指定した結果正常にローカルの変更が反映されるようになった.
https://github.com/docker/for-win/issues/5540
【Python】辞書の値に関数を入れたときの実行時間

switch (select) 構文のないPythonではその代わりに辞書を使うことがありますが，
その実行時間に関する注意です．

## 結論

- **関数自体**を入れる：**{ key: func }**
    - **短時間**で済む
    - 実行されるのはキーによって選択された関数のみ
- **関数の返り値**を入れる：**{ key: func() }**
    - 余計な時間がかかる
    - 全ての関数が一旦実行され，その返り値が入る

関数の引数が異なる場合は，

- 予め関数の引数に`( *args, **kwargs )`を用意しておきその差を吸収する
- 与える引数自体も辞書にしてしまう
    - e.g. `dict_kwargs = { 1: { 'arg1': arg1 }, 2: { 'arg2': arg2 } }`

という方法が考えられます．

## 例

以下の2つの関数を場合分けして実行する場合を考えます．
（実行時間が知りたいので遅くなるような書き方をしています．）

```Python
def myfunc1():
    nx, ny = 50, 40
    arr = np.empty( ( nx, ny ) )
    for iy in range( ny ):
        for ix in range( nx ):
            arr[ix,iy] = ix * ix + iy * iy
    return arr


def myfunc2():
    nx, ny = 50, 40
    arr = np.empty( ( nx, ny ) )
    for iy in range( ny ):
        for ix in range( nx ):
            arr[ix,iy] = 1
    return arr
```

その上で，以下の3通りの実行方法にかかる時間を計測しました（JupyterLabの%%timeit使用，下はmyfunc1のみ）．

```Python
# 直接関数を実行
myfunc1()

# { key: func } 型の辞書から実行
key = 1
dict_func = { 1: myfunc1, 2: myfunc2 }
dict_func[ key ]()

# { key: func() } 型の辞書から実行
dict_return = { 1: myfunc1(), 2: myfunc2() }
dict_return[ key ]
```

結果は以下の通りでした．{ key: func() } 型では，両方の関数が実行される時間に近い時間がかかっていることが分かります．

```Python
# 直接実行
1: 488 µs ± 26.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2: 286 µs ± 925  ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# { key: func } 型
1: 461 µs ± 332  ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2: 298 µs ± 22.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# { key: func() } 型
1: 763 µs ± 3.96 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2: 771 µs ± 31.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
```
aptでパッケージの更新を抑止する方法

カスタムビルドのnginxをdebパッケージとしていれていたのですが、aptにより更新されてしまい、nginxが起動できなくなったことがあったので備忘録を兼ねて書いておきます。

# 更新を抑止

rootでやるか、sudoで実行します。

```bash
apt-mark hold <パッケージ名>
```

**例:**

```bash
apt-mark hold nginx
```

こうすることで、```apt upgrade```を実行しても無視されるようになります。

```
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  nginx
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
```

# 更新の抑止を解除

上と同様の権限で。

```bash
apt-mark unhold <パッケージ名>
```

**例:**

```bash
apt-mark unhold nginx
```

こうすれば抑止を解除できます。

```
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  nginx
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 851 kB of archives.
After this operation, 30.7 kB disk space will be freed.
Do you want to continue? [Y/n] 
```

# 抑止中のパッケージを確認する方法

```bash
apt-mark showhold
```

このコマンドを打つと抑止中のパッケージが表示されます。

もし何も返ってこない場合は抑止中のパッケージがないことになります。

# 参考文献

- https://www.tecmint.com/disable-lock-blacklist-package-updates-ubuntu-debian-apt/
jQueryで画面上の余白をすべて消す

#やりたいこと
Bootstrapで画面を作っていたのですが
余白があって画面に入らない、余白（paddingもmarginも）消してほしいといわれました
工数ないので、いちいち画面で使ってるCSSの余白調べて上書きするのはめんどくさいという理由で作った使いどころがなさそうなコードです

#コード

```js:clear.js
$(function(){
    $('*').each(function () {
        $(this).css({ padding: "0px", margin: '0px' });
    })
))
```

全要素ループして、余白を消しています。
phpのバージョンを7.3まで上げたらLOAD DATA LOCAL INFILE forbiddenになった

## 事象
DBUnitでfixtureファイル読み込みをしている箇所で、
PHPのバージョンを7.3.13まで上げたところ以下のエラーになりました。

```
Fuel\Core\PhpErrorException: mysqli::query(): LOAD DATA LOCAL INFILE forbidden
```

fixtureが読み込めていないよう・・・

## 解決

どうやらphpのバージョンを上げたことにより
MySQLi 設定オプションのデフォルト値が変わったよう。

php.initに以下の設定をすると解決しました。

``mysqli.allow_local_infile = On``

https://www.php.net/manual/ja/mysqli.configuration.php

<img width="826" alt="スクリーンショット 2020-01-31 11.23.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/d5e76ce0-69b2-8ce8-6854-572d7c17f3a2.png">

> PHP 7.2.16, 7.3.3 より前のバージョンでは デフォルト値は "1" でした。

> mysqli.allow_local_infile
PHP 側から、LOAD DATA 文によるローカルファイルへのアクセスを許可する。


とのことなので今回**php7.3.13**まで上げたのでビンゴのようです。
【Rails】 FullCalendar 動的にイベントの項目・色を変える方法

# はじめに
Rails アプリケーションにて、 FullCalendar 動的にイベントの項目・色を変える方法について説明します。
scaffold で Eventモデルを作成しているため、最低限の作業量でカレンダーに機能を追加する方法を実現しています。

#### 関連リンク
関連リンクを下記に載せておくので、必要であれば参考にしてください。。

* 【Rails】 5分でFullCalendar実装する方法
    * https://qiita.com/syukan3/items/68280ce4ff45aa336363


# 前提条件

FullCalendarをアプリケーションに実装済みであること。

今回はRailsアプリケーションで実装しています。上記の記事を参考にしてみてください。
Railsを使ったことがない人でも簡単に実装することができますので、この機会にRuby と Railsをインストールして使ってみてください。
※Rails アプリケーション以外でも実装する事ができます。

# 実装


## JSON File

JSONファイルを作成して、FullCalendarのライブラリへそのJSONファイルを渡すことで、カレンダーを表示することができます。

このとき、json.jbuilder の中で 分岐する式を書いて項目・色を指定することで、動的に項目を変更することができます。

```Ruby:app/views/events/index.json.jbuilder
json.array!(@events) do |event|
  json.extract! event, :id, :title, :body
  json.start event.start_date
  json.end event.end_date
  json.url event_url(event, format: :html)

  # json.color
  if event.start_date > Time.now
    json.color "#ff0000"
  else
    json.color ""
  end
end
```

# まとめ
カレンダーのアプリケーションを作成することになって、そこまで得意ではない Javascript の練習になるなーと思っていましたが、
FullCalendarという強力すぎるライブラリを見つけてしまったため、簡単に実装できてしまいました。
Javascript のスキルアップについては別の機会にでもやろうと思います。

# 参考
* FullCalendar 公式ドキュメント
    * https://fullcalendar.io/

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
VoIP Push のトークンが取得できない（iOS13/xcode11）

xcode を 10 から 11 に挙げて、デバッグを開始したところ [pushRegistry(_:didUpdate:for:)](https://developer.apple.com/documentation/pushkit/pkpushregistrydelegate/1614470-pushregistry) が呼ばれないという現象が発生しました。

xcode 10 に戻すと、正常に VoIP Push が利用できます。

Mac A と iPhone A では問題ないのですが、Mac B と iPhone B, C, D では上記の問題が発生してしまう。
開発環境である Mac 側の問題なのか、iPhone 側の問題なのか理由はわかりません。

##対策
似たような問題（[VoIP Push がバックグラウンド時に届かない](https://qiita.com/sunskysoft/items/a98252268eb00111a3bc)）がありましたので、同じ対応をしてみましたがダメでした。

結局は以下の対応で解決しました。
　1. アプリを一旦削除します。
　2. iCloud にバックアップします。
　3. iPhone をリセットします。
　　　設定＞一般＞リセット＞すべてのコンテンツと設定を消去
　4. iCloud から回復

この後、xcode 11 でビルドしたところ、[pushRegistry(_:didUpdate:for:)](https://developer.apple.com/documentation/pushkit/pkpushregistrydelegate/1614470-pushregistry) が呼ばれトークンが取得できるようになりました。

iCloud のバックアップ／復元は必須かどうかわかりませんが、iPhone の初期化が効いていると思われます。
iPhone 側に何か情報が変な形で残っていたのか、原因はわかりません。。。

心配なのは、正式リリースした後、同じ現象が発生しないかという点です。
利用者に「リセットしてね！」なんて言えないですからねぇ。。。