OmniAICreator/Qiita-1.07M huggingface dataset:
[入門向け]Webinar 用 Power Apps アプリ解説(1)

今回から、先日ご案内したWebinarアプリの内部動作の解説をしていきます。
今回は「お問い合わせアプリ拡張版」というお問い合わせをする側（ユーザー）が利用するアプリです。

このアプリは4つの画面（スクリーンといいます）で構成されています
１．スタート画面（新しいお問い合わせをするのか、既存のお問い合わせを確認するのかを選択する画面）
２．新規お問い合わせをするフォームの画面
３．フォームの投稿が成功したときに表示される画面
４．既存のお問い合わせを確認する画面

４については少し複雑なことをしているので、次回説明します。

## 最初の画面を表示・・・する前に

Power Appsのアプリは起動すると一番上のスクリーンを表示します。が、表示前に何らかの処理をしたいことがあると思います（事前にデータを読み込んでおく、変数を設定するなど）
![blog211111_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/cb4840f0-7e59-e832-9dcd-2f917febceab.png)
赤い部分が「最初のスクリーン」ですが、これを表示する前に青い部分（App の OnStart) を実行する
ここでは2つの処理を実施しています。

Set(gblButtonColor,RGBA(150,0,150,0.5));

こちらは gblButtonColor「変数」を設定しています。これ以降 gblButtonColor を指定するとこの色が設定されることになります。名前の通りボタンの色ですね。薄い紫色のボタンになっていることがわかると思います。
 - グローバル変数（アプリのどこからでも呼び出せる変数）は gbl**** のような命名をする
 - RGBA関数は色の指定。RGBとα値（透明度）を設定しています。透明度を設定すると背景が若干透けて見えるようになります。
以下、ボタンの色(Fill/FillColor)はgblButtonColorを指定すれば統一感のある色になります。

ClearCollect(colMyRequest,"");

こちらはコレクション変数の初期化をしています。（この処理がそもそも必要か？といわれると微妙ですが、ここで宣言をすれば、入力時の候補に表示されるのでアプリ作成が楽になります）

## 最初の画面

ここではボタンを2つ配置し、クリックするとそれぞれのスクリーンに移動します。これは OnClick に以下のように書きます

Navigate(Screen2,fade)

fadeの部分はなくてもいいのですが、指定するとスクリーンの表示のされ方が変わります。（ PowerPoint 風)

## フォームの部分

![blog211111_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/035cc6ef-078b-1f8f-e7f6-63b6929da2f4.png)

今回のメインの部分はこちらになります。新規のお問い合わせを記入してもらうページですね。
フォームをスクリーンに張り付け、 Datasource を Dataverse For Teams のテーブル（や SharePoint のリスト）に設定します。今回の場合、データソースである Dataverse for Teams には以下の列が定義されています。
「タイトル」「お問い合わせID」「お問い合わせ内容」「カテゴリ」「ステータス」「担当者」
しかしながらこのフォームには「タイトル」「お問い合わせ内容」「カテゴリ」しかありません。
これについて解説します。
まず、お問い合わせIDですが、これはお問い合わせを一意に識別する番号を保存します。
実は非表示にしてあるだけでフォームにこの値は存在しています。
![blog211111_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/4509bcd4-c3b0-a43a-aba1-0a1affc9d200.png)

Value プロパティに以下のように値を設定しています。

GUID()

これで「おそらく重複しないであろう値が自動的に設定されて、しかもユーザーが変更できないし見えない」という状態になります。
同様に「ステータス」も「新規」に設定して変更できないように非表示にしています（いきなり「解決済み」の状態でお問い合わせを投稿することはないはずなので…）
「担当者」はお問い合わせ投稿時は未定です。なのでこちらは非表示ではなくフォームからそもそも消しています。

これでフォームの設定はOKです。ただし、これを使うためにはいくつか注意点があります・

## 初期化して使う

プレビュー実行するとわかるのですが、一回投稿するとフォームが使えなくなります。これはフォームの情報を送信したら、自分はもう用済みだと認識してしまうからです。そこで、画面を表示するたびに初期化（リセット）してあげましょう。
これを実現するためには、 Screen の OnVisibleプロパティを以下のように設定します

ResetForm(frmNewReq)

これで「このスクリーンが表示されるたびに」フォームが初期化されます。

## フォームの投稿と成功

ボタンが押されたらフォームを送信するようにします。なので、ボタンの OnSelect に以下を設定します。

SubmitForm(frmNewReq)

これだけだと、何も画面に変化が起こらないためユーザーからするとちゃんと送信できたのかどうかわかりません。
そこで Form の OnSuccess に以下を設定します。

Navigate(scrSuccess)

流れとしては「ボタンを押す→ボタンの OnSelect プロパティにより SubmitForm が実行される→成功するとフォームの OnSuccess プロパティにより Navigate が実行される」となります。ちなみにフォームの送信が失敗した場合の処理が必要であれば OnFailure を設定します。

これで新規お問い合わせを投稿する部分については実装できました。
次は既存のお問い合わせを確認する部分を作ります。これはギャラリーと表示ビューを使います。さらに中級編として（？）フォームを使わずにデータソースに値を入れる方法を試してみます。
IBM Watson Text to Speech を使用してテキストから音声ファイルを生成する


## 初めに

この記事では、IBM Watson 「Text to Speech」サービスを使用して、テキストデータから音声ファイルを生成する方法をご紹介します。なお、使用する言語はPythonです。

逆にIBM Watson 「Speech To Text」を使用して、[弊社では『こえカラモジ』という音声から文字起こしサービス](https://alpcom.co.jp/post/20211227/?utm_source=Qiita&utm_medium=post&utm_campaign=sum&utm_id=20220112)を現在無償提供しています。
面倒な導入など不要で、Webブラウザから直ぐに使用できますので是非お試し下さい。

## 手順

### 手順1. Watson Speech to Text インスタンスの作成

#### 1. IBM Cloud アカウントの作成
IBM Cloudのアカウントが無い場合は、アカウントを作成します。

1-1.[https://cloud.ibm.com](https://cloud.ibm.com) にブラウザでアクセスします。

1-2.「アカウントの作成」のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/5712f555-315a-7846-24b1-40aac5c3d970.png)

1-3. アカウント作成画面になるので、画面の指示に従い、アカウントを作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/2b49f8b6-1add-2df8-a64c-b2191d12353d.png)

#### 2. Watson Speech to Text インスタンスの作成

2-1. IBM Cloud の Webコンソールから、「カタログ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/5a204e9b-7d33-eda6-0588-885e659af6c7.png)

2-2. 検索欄に、「text to speech」と入力すると、候補がでてくるので、「Text to Speech」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/8e5317a7-b4df-2abf-0ae5-9cbd5711d017.png)

2-3. 料金プランは「ライト」を選択。使用条件の同意にチェックをつけ、「作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740352/2ca99b60-1bdf-b5c8-3094-8475191c09d2.png)

2-4. インスタンスが作成されたら、「サービス資格情報」をクリックし、「apiKey」と「url」の情報を控えてください。コードを記載するときに必要になります。

### 手順3. Watson SDK の導入

3-1. 以下のpipコマンドで「ibm-watson」インストールします。

```
pip install ibm-watson
```

### 手順4．コーディングと実行

4-1. 以下のようなコードを記載します。

``` text2speech.py
from ibm_watson import TextToSpeechV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

# インスタンス作成時にできた資格情報のapiKeyの値を指定
apiKey = "xxxxxxxxxxxxxxxxxx"

# インスタンス作成時にできた資格情報のurlの値を指定
serviceUrl = "https://xxxxxxxxxxxxxxx"

# 出力するファイル名を指定
audioFile = "test.wav"

# 音声化したいテキストを指定
text = "このプログラムは、テキストデータから音声ファイルを生成します。"

# 音声モデルを指定。日本語は、女性(Emi)の声のみ。英語は複数選択肢あり。
voice = "ja-JP_EmiV3Voice"

# 出力する音声フォーマットを指定。mp3にしたい場合は「audio/mp3」を指定
audioFormat = "audio/wav"


authenticator = IAMAuthenticator(apiKey)
text_to_speech = TextToSpeechV1(
    authenticator=authenticator
)

text_to_speech.set_service_url(serviceUrl)

with open(audioFile, 'wb') as audio_file:
    audio_file.write(
        text_to_speech.synthesize(
            text,
            voice=voice,
            accept=audioFormat
        ).get_result().content)
```

4-2. 記載したプログラムを実行します。指定した音声ファイルができます。

```
python text2speech.py
```
qsort関数について

#はじめに
この記事はC言語初心者がqsort関数についてまとめたものです。
至らないところもあるかと思いますがご容赦ください。

#qsort関数とは
qsort関数とはクイックソートと呼ばれる高速な並び替えで配列を並び替える関数です。
どんな型でも並び替えが可能ですが比較関数は自作する必要があります。

#使用方法
###定義
```c:
#include <stdlib.h>

void qsort(void* head, size_t num, size_t size, int(*cmp)(const void*, const void*));
```
最初にqsortが宣言されているstdlib.hをインクルードします。
この関数には戻り値がありませんので戻り値の型はvoidになります。
###引数
・第１引数 `head`：ソートする配列の先頭アドレス
・第２引数 `num`：ソートする配列の要素数
・第３引数 `size`：ソートする配列のデータ一つ分のバイト数
・第４引数 `cmp`：ソートをするための比較関数へのアドレス
###サンプルコード
int型の配列を昇順にソートしてみます。

```c:
#define _CRT_SECRE_NO_WARNINGS 
#include <stdlib.h>
#include<stdio.h>

//比較関数（昇順）
int cmp(const void* x, const void* y)
{
	if (*(int*)x > * (int*)y)
	{
		return 1;
	}
	else if (*(int*)x < *(int*)y)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

int main(void)
{
	//ソート対象データ
	int num[] = { 70,10,30,50,20,90,100,80,40,60 };
	int i;

	//並べ替え
	qsort(num, 10, sizeof(int), cmp);

	//結果の表示
	for (i = 0; i < 10; i++)
	{
		printf("%d ", num[i]);
	}
}

```
実行結果

```
10 20 30 40 50 60 70 80 90 100
```
qsort関数は比較関数の戻り値をもとにソートします。
昇順の場合、戻り値は下記のようになります。
・ｘ＜ｙの時は０より小さい数値
・ｘ＞ｙの時は０より大きい数値
・ｘ＝＝ｙの時は０
また、降順の場合は正負の戻り値を逆転することで実現可能です。

```c:
if (*(int*)x > * (int*)y)
	{
		//昇順では1
		return -1;
	}
	else if (*(int*)x < *(int*)y)
	{
		//昇順では-1
		return 1;
	}
	else
	{
		//ここは変わらない
		return 0;
	}
```
実行結果

```
100 90 80 70 60 50 40 30 20 10
```

#まとめ
ソートを実装するよりqsort関数を利用することによって簡単にクイックソートを実現することができる。どんな型でもソートが可能なのが魅力的。

#最後に
今回はqsort関数について簡単にまとめてみました。
知識不足なところがまだまだたくさんあるのでこれからも勉強を続けていきます。
最後まで読んでいただきありがとうございました。
インタープリタを作る その34

#概要

インタープリタを作ってみた。
jsforthを使ってみた。
グラフィック拡張する。
sin波、やってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1fc33c49-7d6b-e5a5-06ca-3d2ab2f151b4.png)



#サンプルコード

```
: test 400 1 do i i sin susume loop ;
test
```

#成果物


https://embed.plnkr.co/plunk/jfz9aBHPsUwLwPY3


以上。
使用されているポートの確認(Windows)

# 操作環境
OS：Windows10
使用ターミナル：WindowsPowerShell、コマンドプロンプト
環境構築ソフト：Docker

# 課題
　ある朝、いつものようにDockerでコンテナを立ち上げてPHPファイルを実行しようとしたところ、コンテナは立ち上がっているものの、PHP実行用のコンテナが起動していません。  
　デーモンさん（サーバー側で、クライアントからの要求に応じるために常駐している門番のようなプログラムのこと）からは、「50080のポートにアクセスしようとしましたが、上手くいきませんでした」と言われている様子。  
![220112 docker05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/fe2e2202-c2b5-2a3c-ea33-93798652627e.png)

　$ docker-compose ps、 docker-compose logs コンテナ名　でコンテナの状況を確認しても、「STATUS: created」とあるものの、やはり起動はしていない。（起動していたら「running」となります。）
　Dockerのアプリの画面から起動ボタンを押しても、「ポート番号80が使われています。」という趣旨のエラーが画面上部に表示され、イメージを起動できません。

![220112 docker01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/a911f909-7f98-076c-83d5-01b65a66a636.png)


# 解決手順
　まず、ポート番号80をどのアプリケーションが使用しているのか調べるために、コマンドプロンプトで、$ netstat -nao　と入力し、実行します。  
　すると、次のように、ローカルアドレスや外部アドレス、状態や使用されているプロトコル（ネット上の通信の際の決まり事のようなもの）の一覧が表示されます。（-naoのnは「IPアドレスとポート番号を数字で表示」、aは「LISTENING状態にあるTCPポートも表示」、oは「プロセス状態を表示」という意味のコマンドです。）  
![220112 docker02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/5ae52ffd-bb37-a237-6ca0-017ee7a4786c.png)  
　ポート番号は外部アドレスの一番最後の部分で表されるので、末尾が80のものを探すと、...ありました！！
![220112 docker03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/afa9fd78-34d4-dbbb-6628-030cb1af21a8.png)
　ここに表示されているPID(プロセスID)から、このポート番号80を使用しているアプリケーションを調べます。  
　タスクバーにあるWindowsマークを右クリック→タスクマネージャー→詳細　で、アプリケーションの名前やPIDなどが載っている一覧が表示されます。この中から、先ほど調べたPID0のアプリケーションを探します。  
　すると、Pythonの標準機能として搭載されている、IDLEがどうやらポート番号80と通信していることが分かりました。
![220112 docker04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475646/39c5e077-9f92-1196-cac2-448edcabc4c5.png)
　さて、次は、IDLEで行われている通信を切断！！...としたいところだったのですが、試しに先ほどのDockerのコンテナを起動しようとしたら起動できました。もしかしたら最初は何らかしらの通信がIDLEの方で行われていたものの、そのプロセスが数分間のうちに終了したのかもしれませんね。ちなみにSystem Idle Processの状態は今も「実行中」のままです。何はともあれ、とりあえず一件落着でめでたしめでたし。

# 総論
　ということで、今回は途中で解決してしまったため、使用されているポートの確認まででしたが、インターネットの勉強で出てきていたデーモン、ポート、プロトコルなどが実際にどのように使われているのか確認でき、良い経験になりました。  
　今後もポートの重複などでトラブルが発生した時は、この手順で状態を確認することができそうです。  
　それではまた次回の記事までごきげんよう！！

# 参考
https://aprico-media.com/posts/5591

独学エンジニア（実際の内容は有料会員のみ見れます。）
https://dokugaku-engineer.com/
Power BI で Web コンテンツをQuery し自動更新する時のエラー回避方法

##Web ページ の テーブルを取得
Power BI でWeb コンテンツを利用する場合は、データの取得先を”Web” とし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/75b4498d-552e-3ea3-b034-835f41f21fb3.png)
対象ページの URL を入力したら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/8be8f9f8-3e4e-d2ad-68f7-302689dedcd3.png)
そのページのテーブル（HTMLで記述されたテーブル）を取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/57c0bdba-cb61-cac7-7f29-4efed3315fdc.png)
その時の詳細エディタでの記述は↓↓この様になっています。

```text
Source = Web.BrowserContents("https://community.alteryx.com/t5/%E3%82%A6%E3%82%A3%E3%82%AF%E3%83%AA%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8-%E6%97%A5%E6%9C%AC%E8%AA%9E/%E3%82%A6%E3%82%A3%E3%82%AF%E3%83%AA%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8-INDEX/td-p/616996"),
```

その他のデータベースを読み込んだ時と同様の Power Query をかけることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/806c28e8-d787-29af-0410-0ebc2da7a672.png)

作成した Power BI Report を Work Space に Publish します。その後に自動更新のスケジュールを設定しようとしても、グレーアウトしており設定することが出来ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/6958ab39-8090-cd09-4856-e01f7413b165.png)

これを回避するためには、ゲートウェイが必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/f4548c33-3020-efa1-a1fe-b858715ef68d.png)

個人用ゲートウェイをインストールしたらゲートウェイが働き自動更新出来るようになります。が、それではローカルPCを起動しておく必要があり、手間もかかるのであまり好ましくありません。

回避方法は CSV 入力を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/e31bebb7-19b3-6777-d825-d1fa4b8cea05.png)

CSV ファイル名の入力画面で、Web ページのURL を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/6633a4e6-84b6-1e19-f0c8-ddace8e87910.png)

そうすると、同じ Web ページコンテンツが取得されます。
一瞬 ダウンロード のウィンドウが出てきます。（Web ページをダウンロードしているようです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/46609774-7341-b7b5-15c6-51623cd02f62.png)

詳細エディタを見てみると、ソースが先程と違い、C drive 内のキャッシュを参照しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/821d1ca4-7fd4-c026-3f44-87dc5bf93366.png)

そこで 参照元のソースを Web URL に置き換えてやります。
Query ステップの ソースをダブルクリックしてもいいですし、エディタ窓から変更しても良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/eb6d3c26-a919-628d-e582-d542b3e58cd7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573860/ba1f7662-52ff-274c-427c-9168be7dae38.png)

この設定をすることで、Power BI workspace での自動更新設定を使用することが出来るようになります。
WordPressで先頭固定表示が有効にならない時の対処法

WordPressで投稿作成時に「ブログのトップに固定」にチェックを入れてみたのですが、投稿のカテゴリー別一覧で先頭に表示されませんでした。

その時の対処方法をメモしておきたいと思います。

# WP_Queryを利用する
使っているテーマにもよるのですが、投稿を一覧表示する場合、have_posts()とthe_post()を組み合わせて投稿の一覧を取得している場合が多いです。

``` php:/wp-content/themes/xxx/archive.phpなど
・・・
<?php while(have_posts()): the_post(); ?>
記事の表示処理
<?php endwhile; ?>
・・・
```

have_posts()でループする場合、先頭固定表示設定したかどうかに関係なく投稿が取得されてしまいます。
先頭固定表示設定を有効にするには、この部分をWP_Queryで記述し直す必要があります。

``` php:/wp-content/themes/xxx/archive.phpなど
・・・
<?php
$arg=array(
        'orderby'=>'date',
        'order'=>'DESC'
);
$query=new WP_Query($arg);
?>
<?php while($query->have_posts()): $query->the_post(); ?>
記事の表示処理
<?php endwhile; ?>
・・・
```

# まとめ
修正自体はそれほど難しいものではないのですが、問題はどのテーマファイルを修正すればいいかを見つけるのにてこづりました。
まずは利用しているテーマのファイルを片っ端からgrepしてみるしかなさそうです。

# 参考

https://www.bossraku.com/blog/305/
Firebase Hosting で firebase deploy に失敗した時の対応策

# 概要
Firebase Hosting で firebase deploy に失敗した時の対応策
後ほど記事を追記していきます

# 事象と原因と対応策

事象: プロジェクトに対する権限が無い

```
Error: Failed to get Firebase project popul-pj. Please make sure the project exists and your account has permission to access it.
```

原因: 長期間ログアウトしていないとFirebase側の仕様などが変更されている場合エラーになることがある。

対策: 長期間ログインしていないアカウントからだとなぜか失敗するため、もう一度ログインし直すと成功する

```
firebase logout

firebase login

firebase deploy
```
JavaScriptのClassでprivateメソッドを実装すると「Parsing error: Unexpected character '#' eslint」エラーになる

## はじめに
ESLintを設定している時に、以下の図のようなエラーが発生した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/7f45977c-39c1-9484-2659-c54ecba53200.png)

今回はこのエラーを解消する方法について調べてみたのでその備忘録を残す。

## ESLintについて
https://qiita.com/yuta-katayama-23/items/5d73bbe79c19301551df#eslint%E3%81%AE%E8%A8%AD%E5%AE%9A

を参照。

## ESLintのparserOptionsを指定する
JavaScriptsのprivateメソッドはes2022の機能なため、以下のようにESLintの設定を変える必要がある。

```json
// .eslint.json
{
	...
	"parserOptions": {
		"ecmaVersion": 13
	},
	...
}
```

https://github.com/yuta-katayama-23/post-restaurant-reviews/commit/2635997cf6305a7b731cac3ed42f6e17456ca119

※[コメント](https://qiita.com/yuta-katayama-23/items/4a7578ff230e8b4df825#comment-d2393cd0f296831e665c)でご指摘を頂いたとおり、以下の方法ではなくESLint自体の設定でカバーできる問題でした。

~~上記のエラーを解消するには、`yarn add --dev @babel/eslint-parser`等でライブラリをインストールし、後は公式にあるように以下のように`parser`を追記すればいい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/5e0a4ee9-b5e0-0730-9bc7-1357dfef37a0.png)
こうすると、ESLintが実装されている構文を解釈できるようになりエラーが発生しなくなる。~~

- 参考：[Specifying Parser Options](https://eslint.org/docs/user-guide/configuring/language-options#specifying-parser-options)
- 参考：[Parsing error: Unexpected character '#' #1542](https://github.com/standard/standard/issues/1542)
良い引継ぎとは？

先日とある案件にて、会社都合により担当者が変わることになり、前任者と後任者のやり取りを見てて感じたことを書きたいと思います。

## 前提
前任者と後任者では引継ぐ案件の知識量が断然に違います。
当然ですよね。後任者は後任に決まるまで、その案件のことを全く知らないことがほとんどです。
なので引継ぎに関しては前任者9割、後任者1割ぐらいの責任があると思います。

## やってはいけないこと
上記前提をもとに、下記に愚かな引継ぎを挙げたいと思います。

・前任者が引継ぎ資料を作らない
・前任者が引継ぎの時間を作らない
・何か引継ぎ漏れがあった時に前任者が「聞かれなかったので答えませんでした」と開き直る

これ、<strong>前任者の責任放棄</strong>です。

・後任者が引継ぎの中で疑問に思ったことを質問しない
・後任者が前任者に確認する前に顧客に質問してしまう

上記は後任者が気を付けるべきことです。
気を付けないと顧客の信頼を失うことになります。

## やっておくべきこと
そこで引継ぎに関してやっておいた方が良いことを挙げたいと思います。

##### 引継ぎ前
・顧客とのやり取りを議事メモやQ&A表のような形で残しておく
・システム環境などの情報は常に最新版にしておく
・案件の体制図を作っておく

##### 引継ぎ時
<strong>・担当者交代について顧客に早めに連絡する</strong>
※今回はここを怠ったために顧客の評価を下げる結果になりました
<strong>・前任者主導で引継ぎを行う</strong>
※今回、後任者主導で引継ぎを行い前任者の協力も足りなかったため問題発生

##### 引継ぎ後
・可能であれば後任者に引継いだ後も前任者も引継ぎの時間を少し用意する

## まとめ
会社都合でいきなり担当者交代ということは前任者も予期せぬこと？だったのかもしれません。
だとしても前任者が非協力的なのはいただけません。
何かしらの業務に従事している以上は、常に引き継ぎが発生することを想定して準備をしておきたいものです。

駄文にお付き合いいただきありがとうございました。
グランデータのマイページで初期パスワードを変更する方法

電気使用料を調べるためにマイページへログイン。
ログイン → 初期パスワード入力 →　メール認証 → パスワード変更画面
するとパスワード変更画面で「登録する」ボタンが反応しません。

しょうがないのでデバッグさせていただきました。
結論だけ書きます。

1. パスワードは「半角英数字10文字以上20文字以下で入力」。
- コンソールからsubmitを送信

```
$('#submenu_password_init').submit();
```

無事にログインできました。
<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209937/30f1f604-7cca-2d4b-117f-2b11b14b8103.png">


---
※デバッグ風景
エラーメッセージが出ないのでパスワードの入力規則が分かりにくかった。
（よく見たら画面に書いてありました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209937/e6a843d6-04b4-b402-ba1d-cac17878ca5a.png)
インタープリタを作る その33

#概要

インタープリタを作ってみた。
jsforthを使ってみた。
グラフィック拡張する。
kame作ってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1064dd5c-7304-8e9a-0edf-8f2be043d4b5.png)

#サンプルコード

```
: koch 5 walk -60 turn 5 walk 120 turn 5 walk -60 turn 5 walk ;
: koch1 koch -60 turn koch 120 turn koch -60 turn koch ;
: koch2 koch1 -60 turn koch1 120 turn koch1 -60 turn koch1 ;
koch2 -60 turn koch2 120 turn koch2 -60 turn koch2

```

#成果物

https://embed.plnkr.co/plunk/0IqMlprttBveL5TL


以上。
Pythonでアナグラムを判別するプログラムの作成

# アナグラムとは
>〘名〙 (anagram) ことばのつづりを換えることによる遊び。単語をばらばらに崩し、全く別の単語を作る。LIVE が EVIL に、TIME が EMIT にの類。
出典:　精選版 日本国語大辞典

例えば、evilとlive, eatとteaなどがアナグラムの例として挙げられます。

# 与えられた配列からアナグラムをグループ分けする

いくつかの単語が格納されたリスト(strs)からアナグラムとなっている単語のグループを返す関数を作ります。

```Python
def groupingAnagram(strs):
    hashMap = {} #ハッシュマップを作成

    for s in strs:                  
        key =''.join(sorted(s))  # 文字列をアルファベット順にソートする
        if key not in  hashMap.keys():    
            hashMap[key] = [s]     # ハッシュマップにキーを作成
        else:
            hashMap[key].append(s) # 文字列sから作られたキーが既にハッシュマップにあるなら、そこにsを追加
    return  hashMap   

strs = ["eat","tea", "evil", "live"]
print(groupingAnagram(strs))
```


# 実行
```
{'aet': ['eat', 'tea'], 'eilv': ['evil', 'live']}
```

アルファベット順に並べられた文字列をキーとして、アナグラムのグループ分けができました。

# 参考
https://qiita.com/ztrehagem/items/32407b3bae8fb92d4baf

https://qiita.com/knhr__/items/eaabb8b4a65a32cbfd94
Slim4 に dotenv と migration の機能を追加していい感じにする

## 環境
* Slim4 (Skelton じゃない方だが、どっちでも行けそう？)
* PHP7.4 (or later)
* MySQL5.7 (MariaDB)
* dotenv ライブラリ: `vlucas/phpdotenv@5.4.1`
* マイグレーションライブラリ: `robmorgan/phinx@0.12.9`

## dotenv ライブラリの準備
PHP 向けの dotenv ライブラリは2種類くらいメジャーなのがあるが、今回は `vlucas/phpdotenv` を採用した。

### インストール
```sh
composer require vlucas/phpdotenv
```

### 設定ファイル作成
```sh
touch .env
```

自分の環境に合わせて、設定内容を書く。

```/.env
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=username
DB_PASSWORD=password
DB_CHARSET=utf8
```

## マイグレーションライブラリの準備
マイグレーションのライブラリも有名なものはいくつかあると思うが、今回は `phinx` を採用した。

### インストール
```sh
composer require robmorgan/phinx
```


### 設定ファイル作成
まず以下のコマンドで設定ファイル `phinx.php` を生成する。

```sh
vendor/bin/phinx init .
```

次に、中身を書き換える。
初期状態では配列をリターンしているだけになっているので、先頭で dotenv を読み込ませる。

```phinx.php
<?php

$dot_env = __DIR__. '/.env';
if (is_readable($dot_env)) {
    $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
    $dotenv->load();
}

```

続けて、配列の中身を書き換える。

```phinx.php
return
[
    'paths' => [
        ...
    ],
    'environments' => [
        'default_migration_table' => 'phinxlog',
        'default_environment' => 'production',
        'production' => [
            'adapter' => 'mysql',
            'host' => $_ENV['DB_HOST'] ?? 'localhost',
            'name' => $_ENV['DB_DATABASE'] ?? 'production_db',
            'user' => $_ENV['DB_USERNAME'] ?? 'root',
            'pass' => $_ENV['DB_PASSWORD'] ?? '',
            'port' => $_ENV['DB_PORT'] ?? '3306',
            'charset' => $_ENV['DB_CHARSET'] ?? 'utf8',
        ],
        'development' => [
            'adapter' => 'mysql',
            'host' => $_ENV['DB_HOST'] ?? 'localhost',
            'name' => $_ENV['DB_DATABASE'] ?? 'development_db',
            'user' => $_ENV['DB_USERNAME'] ?? 'root',
            'pass' => $_ENV['DB_PASSWORD'] ?? '',
            'port' => $_ENV['DB_PORT'] ?? '3306',
            'charset' => $_ENV['DB_CHARSET'] ?? 'utf8',
        ],
        'testing' => [
            ...
        ]
    ],
    ...
];
```

DB の設定は dotenv で設定するので、production/development と分けなくても良いケースもあるので、不要であれば development の配列を丸ごと削除しても良いかも。

また、今回は dotenv を利用したが、サーバで環境変数を設定できるのであれば、先頭部分を削除し `$_ENV` のところを `$_SERVER` に変えるだけで済むと思う。

それでは良き Slim ライフを。
[Ruby] 丸め誤差というバグについて簡単に説明

# 丸め誤差とは
コンピューターの内部で10進数ではなく、~~2進数で計算すると発生するのが~~**丸め誤差**です。
「有限桁で数を表そうとするから」と捉えたほうがいい↑


###Rubyに備わっているirbを使って確認してみましょう
```apex
irb(main):001:0> 0.1*3.0
=> 0.30000000000000004
```
上記のように0.3になりません。

このような誤差の~~バグ~~で正しく処理できないことがあります
　　　　　　　　　↑不可避
以下が例です。

###数値の大小を比較したりする際にバグになる

```apex
irb(main):002:0> 0.1*3.0 == 0.3
=> false
irb(main):003:0> 0.1*3.0 <= 0.3
=> false
```
**trueではなくfalseが返っています。**
こうなると正しく計算ができませんよね

# 対処法
### Rationalクラスを使う

先ほどの計算に**Rationalクラス**を使ってみましょう
数字に後に'r'を付けます。

```apex
irb(main):004:0> 0.1r*3.0r == 0.3
=> true
irb(main):005:0> 0.1r*3.0r <= 0.3
=> true
```
**無事trueが返ってきました！**

#おさらい
Rationalクラスは**有理数を表す**ことができる
小数点を使わない計算をすることで、バグを回避できます。

## おわりに
最後まで読んでいただいた方ありがとうございます。
何かあればご教授いただけますと嬉しいです。
cloud9が起動しない

1日ぶりにcloud9環境にアクセスしたら、cloud9の画面が一向に表示されない。

しばらくすると、画面の上部に以下のメッセージが。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/cdb0a5f5-4d7e-73e3-7c1f-18482f616eb7.png)

```
This is taking longer than expected.
The delay may be caused by high CPU usage in your environment,
 or your T2 or T3 instance is running out of burstable CPU capacity credits,
 or there are VPC configuration issues.
```

色々検索して、色々対策を講じました。ダメでした。

- EC2インスタンスの停止 → 起動
- EC2インスタンスのアップ t2.micro → t2.small → t2.medium

Google Chrome デベロッパー ツールの［ネットワーク］タブで見ると「CORSエラー」の文字が。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/3a42c90a-dd07-9b88-7e18-b429be19cf56.png)
なんでやねん。

- キャッシュ削除

はダメでした。

有効だったのは、

- **Chromeのシークレッドウィンドウ**
- **他ブラウザ（SafariはOK、FirefoxはNG）**

でした。

検索したところ、「EC2インスタンスの停止 → 起動」で解決した、というのがほとんどで、後はネットワーク関係の設定で解決、というのがありましたが、古いブログエントリだったので、これは現在の解決策ではないような気がします。
2022/1/12主にITとかセキュリティの記事

「利用環境の確認」などと騙すフィッシング攻撃に注意
https://www.security-next.com/133130

「H2DB」にRCE脆弱性 - 「Log4Shell」と同じく「JNDI」に起因
https://www.security-next.com/133102

サイバー攻撃、海外子会社サーバ経由で - パナソニック
https://www.security-next.com/133109

コロナ検査結果確認サイトで別人の検査結果 - 愛媛県総合保健協会
https://www.security-next.com/133112

管理状況、詳細に　個人情報保護法(1/10)
https://www.nikkei.com/article/DGKKZO79032530X00C22A1TCJ000/

2021年11月のウイルスレビュー ― マルウェア活動の増加等(1/10)
https://japan.cnet.com/release/30629771/?ref=rss

仮想通貨詐欺ミラートレーディングインターナショナルのCEOがブラジルで逮捕される(1/10)
https://nextmoney.jp/?p=47344

パキスタン、数百万ドルの仮想通貨詐欺でバイナンスを調査へ(1/10)
https://jp.cointelegraph.com/news/pakistan-to-investigate-binance-for-multi-million-dollar-crypto-scam

「ノートン 360」、暗号通貨採掘を強制インストールした上に削除が困難と批判が相次ぐ
しかも15％の手数料を徴収(1/9)
https://japanese.engadget.com/norton-360-cryptominer-hard-to-delete-041040311.html

特別な設定なしにPCのリモート操作やファイルのやり取りが行えるリモートデスクトップソフトウェア「RustDesk」(1/10)
https://gunosy.com/articles/aB4vG

楽天モバイル、ネットワークスライシング実現に向けた取り組みを紹介(1/10)
https://k-tai.watch.impress.co.jp/docs/news/1379004.html

今年変わる法令・ルール一覧　内部告発者保護など強化(1/10)
https://www.nikkei.com/article/DGXZQOUC2905O0Z21C21A2000000/

LCX、ホットウォレット侵害で680万ドル流出(1/10)
https://jp.cointelegraph.com/news/lcx-loses-6-8m-in-a-hot-wallet-compromise-over-ethereum-blockchain

パキスタン連邦捜査局、1億ドル詐欺の疑いでBinance Pakistanに出頭通知を送信(1/10)
https://nextmoney.jp/?p=47357

障害者らの個人情報誤掲載　福井・越前市ホームページに2900人分(1/8)
https://news.yahoo.co.jp/articles/8692aa364471f6059230f7e667a5768c04777dd7

岸田政権の目玉「デジタル構想」は“金ナシ人ナシ”の絵に描いた餅か(1/10)
https://news.biglobe.ne.jp/trend/0110/abz_220110_1888309447.html

ビットコインなどの仮想通貨をマイニング可能な三輪電気自動車「Spiritus」が登場(1/9)
https://article.auone.jp/detail/1/3/7/48_7_r_20220109_1641736822883422

なぜiPhoneでアプリを開くと｢トラッキング許可｣を求められるようになったのか(1/10)
https://president.jp/articles/-/53583?page=1

フランスのデータ保護当局、cookie 拒否の操作が許可の操作よりも複雑だとして Google と Facebook に制裁金(1/9)
https://it.srad.jp/story/22/01/09/0544245/

3千人分の個人情報誤掲載
福井、外部アクセス31回(1/8)
https://nordot.app/852503497583017984?c=768367547562557440

カオスになったDropboxを一気に整理する方法(1/10)
https://news.yahoo.co.jp/articles/2df640d8fae01b6192d62f44a1f9117ebfd21504

2021年12月のフィッシング報告件数、前月から1.4万件増加して6.3万超に(1/10)
https://news.infoseek.co.jp/article/mynavi_2350654/?tpgnr=it

パナソニックが不正アクセスの結果発表、サーバーに採用応募者や取引先の個人情報(1/11)
https://xtech.nikkei.com/atcl/nxt/news/18/11978/

異なるiPhoneでWi-FiのMACアドレスが重複？新機種移行でのトラブルに要注意(1/11)
https://xtech.nikkei.com/atcl/nxt/column/18/00138/010500952/

ゼロトラストはさらに広がる、2022年の注目株「SASE」の実力(1/11)
https://xtech.nikkei.com/atcl/nxt/column/18/01909/010400008/

実行中のスクリプトを上書きして77TBのデータを消失、京大のスパコンで事故(1/11)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/121500147/
Macにsymfonyをインストールしてローカルで表示するまで

前提条件
Home brewがすでにインストールされている

###1. composerインストール

    //ひとまずbrewをアップデート
    $ brew update
    
    //composerをインストール
    $ brew install composer


###2. symfonyをインストール

    $ curl -sS https://get.symfony.com/cli/installer | bash

公式のものとは少し異なるので、公式のものがいいという方はそちらをどうぞ。

公式ページはこちらからどうぞ
https://tssymfony.com/download

githubはこちらからどうぞ
https://github.com/symfony/symfony-installer

###3. パスを通す

    $  mv /Users/xxxxxxx/.symfony/bin/symfony /usr/local/bin/symfony

3パターンあるんですけど、一番シンプルなmvコマンドを採用しました

###4. プロジェクトの作成

    $ symfony new <project name> --version lts

versionでlts指定すると安定版が入るようなので、こちらを採用しました

###5. ローカルサーバ立ち上げ

    $ php -S localhost:8000 -t public

ローカルサーバを立ち上げないと表示されないので、必須です

####5.1 作成したディレクトリに移動(必要に応じて) 

    cd 自分の作成したプロジェクトのディレクトリ

もしダウンロードフォルダとか書類フォルダにプロジェクトを作成した場合はこうなります

    //ダウンロードフォルダにプロジェクトを作成した場合
    cd /Users/あなたのuserネーム/Downloads

    //書類フォルダにプロジェクトを作成した場合
    cd /Users/あなたのuserネーム/Documents

あなたのuserネームのところを自分のユーザーネームに変えてください。

###6 ローカルサーバにアクセス、表示確認

こちらにアクセスしてください。
http://localhost:8000/

こちらの画面が表示されたら完了です
![スクリーンショット 2022-01-12 4.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/187f4b30-ab49-9149-080f-e18b5635ba10.png)
【MySQL】MySQLの初期設定

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##MySQL8．0の初期設定

```
$ sudo mysql_secure_installation
Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: [空Enter]
Please set the password for root here.

New password: [初期パスワードを入力]

Re-enter new password: [初期パスワードを再度入力]
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

[匿名ユーザーを削除しますか？]
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

[リモートでrootログインを禁止しますか？]
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


[テスト用データベースを削除しますか？]
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

[特権テーブルをリロードしますか？]
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!
```
【Vue.js】vueform/multiselectを使用してVue3でタグ選択を実装する

## 概要
Vueでセレクトボックスのライブラリを探すと、[Vue-multiselect](https://vue-multiselect.js.org/)の記事がけっこう出てくるのですが、[[Vue3]Vue-multiselect を用いた、ドロップダウンの実装とサンプルアプリ](https://www.harubears.com/ja/tech/vue-js/vue3-multiselect-dropdown-table-filter/)の記事にある通り、Vue3への対応が怪しい感じがするとのこと。2022年1月時点ではVue3対応のリポジトリはあるものの、あまり更新されていませんでした。
ので今回は、上記の記事で紹介されていた[vueform/multiselect](https://github.com/vueform/multiselect#basic-props)というライブラリを使用して、Vue3でタグ選択を実装してみたので紹介したいと思います。

## 実装方法
[こちら](https://github.com/vueform/multiselect#basic-props)のドキュメントにコンポーネントに設定できるpropsが記載されています。
`mode`という項目が、入力の種別（`single|multiple|tags`）を設定する箇所になります。tag 選択を実装するには、tagsを指定すればOKです。念のため、該当箇所のキャプチャーを以下に添付します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/21b1da0e-aaeb-64d7-10db-a5107ed7bf87.png" width="600px" />

## 実装サンプル
実装サンプルは以下です。optionには、選択できるカテゴリーの一覧を設定する想定としています。
なお、vee-validateを今回併せて使用したのでサンプルにも含めていますが、特に使用する必要はないです。

```vue
<template>
  <Multiselect
    v-model="categoriesValue"
    :options="categoryOptions"
    mode="tags"
    placeholder="カテゴリー選択"
  />
</template>

<script>
import { defineComponent, getCurrentInstance } from "vue";
import { useField } from "vee-validate";
import Multiselect from "@vueform/multiselect";

export default defineComponent({
  props: ["categories"],
  components: {
    Multiselect,
  },
  setup() {
    const app = getCurrentInstance();
    const props = app.props;
    // カテゴリーの選択一覧
    const categoryOptions = props.categories.map((c) => {
      return {
        label: c.name,
        value: c.id,
      };
    });
    // カテゴリーの入力フィールド
    const { value: categories } = useField("categories");
    const categoriesValue = computed({
      get: () => categories.value,
      set: (value) => {
        categories.value = value;
      },
    });

    return {
      categoryOptions,
      categoriesValue,
    };
  },
});
</script>

<style src="@vueform/multiselect/themes/default.css"></style>
```

表示はこんな感じになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/35c8dc52-7a2b-71a5-8f25-d5b410f4e703.png" width="250px" />
DQLで日付関数とGROUP BY

DQLでDATEカラムをGROUP BYする方法がわからなかったので調べた

#DoctrineExtensionを入れる
https://github.com/beberlei/DoctrineExtensions
でSQLの関数を追加

```
composer require beberlei/doctrineextensions
```
`configs/packages/doctrine.yaml`に追加

```
doctrine:
    orm:
        dql:
            string_functions:
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR: DoctrineExtensions\Query\Mysql\Year
                DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
```
#QueryBuilder
例えば`NewsPost`エンティティで記事がある年を取得する

NewsPostRepository

```
$qb = $this->createQueryBuilder('post')
    ->select('YEAR(post.post_date) AS year')
    ->groupBy('year')
    ->orderBy('post.post_date', 'DESC')
;
// array(
//    array(
//        'year' => 2022
//    ),
//    array(
//        'year' => 2021
//    )
// )
```

#Group By 節に直接日付関数は使えない模様

```
$qb->groupBy('YEAR(post.post_date)');
```
とした時

```
[Semantical Error] line 0, col 59 near 'YEAR(post.post_date)': Error: Cannot group by undefined identification or result variable.
```
というエラーが出る。
select()で明示的に取得カラムにエイリアスをつけて、エイリアスでGroupByする様だ。
Java Twitter投稿（twittered）

# 前提
Javaを利用してTwitterで呟くためには、twiiter4jを利用する記事を多く拝見しました。しかし、2021年12月にtwitterAPIがバージョンアップした為、twitter4jを利用した投稿は上手く行きませんでした。（[twitter4j-v2](https://github.com/takke/twitter4j-v2)というTwitter API v2向きのtwitter4jが存在しますが、自分の環境では依存関係を上手く読み込むことができませんでした。）2022年1月現在ではJavaでのTwitter API V2向きに対応している記事が少なかった為、記事録的に残しておきます。初学者な為至らない点があるかもしれません。


#Twitter Developer 開発者申請（事前準備）
1. [Twitter Developer](https://developer.twitter.com/en/docs)にアクセスし、開発者申請を行います。
1. 以下リンクなどを参照し、申請を完了させます。
    1. https://auto-worker.com/blog/?p=3157
    1. 自分の場合は長文で答えるような質問はありませんでした。バージョンアップで質問内容が少し異なっているようです。
1. ログイン後に以下の様に移動します。
    1. Developer Portal　→ Projects&Apps →　Projects　→ 自分で作成したプロジェクト名
1. User authentication settingsのEditをクリックします。
     ![スクリーンショット 2022-01-12 0.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637828/9a7c3aee-0e2f-4797-a6ab-add2f5d9bc4d.png)
1. OAuth 1.0aにチェックを入れます。![スクリーンショット 2022-01-12 0.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637828/cfce0c16-3ef9-d48a-8b4c-689ac444b77f.png)
1. App permissionsからRead and writeを選択します。こちらを選択することでTwitter　APIを利用し、ツイートすることができる様になります。
![スクリーンショット 2022-01-12 0.48.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637828/f5648c78-8d4a-b833-364b-4f843697908a.png)
1. GENERAL AUTHENTICATION SETTINGSのCallbak URI / Redirect URLとWebsiter URLに自分のツイッターURLを入力します。（自分はそうしました。。）
    1. 例：https://twitter.com/自分のユーザー名
1. 一番下にあるSaveをクリックして、保存します。
1. 続いて、keys and tokensを選択します。
![スクリーンショット 2022-01-12 1.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637828/379d21d9-4b8c-1459-3fda-f6c1ab922cf0.png)

1. ここで以下2点を発行し、保存します。（発行した値をメモしておいてください。）
    1. API Key and Secret
    1. Access Token and Secret 


#twittered
今回は[twittered](https://github.com/redouane59/twittered)を利用して、ツイートすることにしました。
Java開発者向けのTwitterAPIクライアントになります。

#pom.xmlの設定
- mavenの場合pom.xmlに対して、以下を設定します。(gradleの場合は[公式ドキュメント](https://github.com/redouane59/twittered) を参照していただければと思いますmm)
- VERSIONにリリースされているバージョンを指定します。（2022年1月現在では以下の様になります。）

```xml
<dependency>
  <groupId>io.github.redouane59.twitter</groupId>
  <artifactId>twittered</artifactId>
  <version>2.14</version>
</dependency>
```
ログを見る為に、以下の導入も推奨されている様です。

```xml
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.30</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.30</version>
</dependency>
```

#jsonファイルの作成
以下の様にjsonファイルを作成します。
メモした値をxxx箇所に設定します。

```json
{
  "apiKey": "xxx",
  "apiSecretKey": "xxx",
  "accessToken": "xxx",
  "accessTokenSecret": "xxx"
}
```

#ツイート
ではいよいよ、本文を作成していきたいと思います。
公式ドキュメントのCode Samplesを参考に、作成しました。
ファイルパスは先ほど作成した、jsonファイルのパスを指定します。
以下の様に`posteTweet`内に文字列を指定することでツイートすることができます。

```java
TwitterClient twitterClient = new TwitterClient(TwitterClient.OBJECT_MAPPER
                .readValue(new File("sample/key.json"), TwitterCredentials.class));
Tweet  resultPost = twitterClient.postTweet("test");
```

### 最後に
ここではtwitterdを利用した、Javaでのツイート方法を記録しました。知識が浅い為至らない部分があったと思いますが、ここまでお読みいただきありがとうございました。
Tableau Desktopメモ

自分用のメモです。

## フォント

* Public,Onlineセーフフォント一覧

https://public.tableau.com/views/TableauBrowser-SafeFonts/FontMenu?%3Aembed=y&%3AshowVizHome=no&%3Adisplay_count=y&%3Adisplay_static_image=y&%3AbootstrapWhenNotified=true#1

## 地図

* アメリカ地図シェープファイル（アラスカとハワイがいい感じになっている）

https://community.tableau.com/s/news/a0A4T000002NGVhUAO/new-spatial-files

* アメリカのタイルマップ用データがあるブログ
https://www.tableau.com/blog/viz-whiz-hex-tile-maps-64713

## カラーパレット

* Color Brewerに対応したTPSファイルサンプル

https://community.tableau.com/s/question/0D54T00000C5arCSAR/how-to-use-color-brewer-based-custom-color-palettes-in-tableau

* カラーパレット紹介viz

https://public.tableau.com/app/profile/datavizard/viz/ColorPalettesforTableau/color

https://public.tableau.com/app/profile/ken.flerlage/viz/DatafamColors/StartPage

## 色関連
* Coolers

色数を増やしたり減らしたりしながら、自動で色パターンの提案が出る

https://coolors.co

* Color Space

一色を指定して、配色パターンごとの関連色を出してくれる

https://mycolor.space

* 和色大辞典

https://www.colordic.org/w

* NIPPON COLORS

https://nipponcolors.com/

* PCCSトーン一覧（HTMLコード入り）
https://www.color-site.com/pccs_tones

## 書式設定

### ツールヒントの数値形式
・行列シェルフやマークカードで既に使っている（ツールヒント以外）フィールドの場合
　・軸の書式設定が自動なら、ペインの書式が採用される
　・自動でなければ、軸の書式が採用される
・行列シェルフとかで使っていないフィールドの場合
　・ペインの書式が採用される

### パラメータで中身を切り替えるメジャーの書式設定も変える（ゴリ押し）
・パラメータで「売上（円マーク等Prefix付整数）」と「数量（ただの整数）」を切り替えるような場合
・そのメジャーの書式設定だとどちらかしか設定できないが、、、
・表示用に別のメジャーを作り、片方をマイナスにする
・カスタムの書式設定で、プラス値、マイナス値それぞれ別の書式を設定すればOK
・当然、マイナス値が存在するようなメジャー同士では使えない
（別記事にしたい）

## リファレンスライン

### リファレンスボックスをつくる
https://www.theinformationlab.co.uk/2021/01/11/how-to-make-reference-boxes-in-tableau-desktop/

・分布バンドで好きな色を塗りたい場合、「対称」にチェックを入れる！！

## 細かいTips

### タブ表示なしダッシュボードのフィルタアクションが別タブで開くのを防ぐ
https://tarsolutions.co.uk/blog/tableau-action-filter-opens-in-new-tab/
（別記事にしたい）

### データソースから作成したパラメータ（リスト）のソート順変更
パラメータ生成元のディメンションの「規定のプロパティ」で並べ替えを指定した状態でパラメータを作ればよし。

## データ接続

### データソースの「接続の編集」を行った際の動き
* Excelだとそのままファイル内容が差し替えられるが、CSVだと新しいファイルとして認識され、結合やりなおしになる
Windows10でPINコード＆Windows Helloが設定できない場合の対処法（解決編）

# 姉妹記事を書きました
PINも生体認証も使えるけどPIN変更を強制されるのがうっとうしい！という方はこちらへ

https://qiita.com/Laniakea/items/955c06fb02e6cb272d47

# 問題が発生しました
PINを設定しようとしたが、「問題が発生しました。後でやり直してください。」と表示されてしまった。
![スクリーンショット 2021-11-10 033511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694538/84dc9a05-2951-eaa2-7b43-3322298df690.png)
Google先生に聞いてみると、グループポリシー「便利なPINを使用したサインイン」をオンにする、CNG Key Isolationとやらの設定を見直す、などが上のほうに出てきましたが、どれも効果なし。
そんな時にやったことを三つほど紹介します。

ちなみに、「後でやり直して」と書いてありますが、いくら待っても何の解決にもなりません。実際に一年半待ちましたが何も起きないです。
# 1.職場、学校のアカウントの接続解除
あんまり話題になりませんが、職場（学校）のマイクロソフトアカウントには厄介な「罠」があります。
実は、職場のマイクロソフトアカウントを登録していると、職場のポリシーが強制的に適用されてしまいます。
そこでもし職場がWindows Helloを禁止していると、それがそのまま職場のアカウントを登録しているパソコンすべてに適用されてしまうのです。
「設定」→「アカウント」→「職場または学校にアクセスする」から今すぐ職場のアカウントを登録抹消しましょう。

まあ不用意にこれやると仕事に支障が出たりするのが厄介なのですが…。そのへんは自己責任でお願いします。
# 2.Windows Hello for Businessのグループポリシー設定
これです

https://docs.microsoft.com/ja-jp/windows/security/identity-protection/hello-for-business/hello-manage-in-organization

意外な抜け穴として、グループポリシーの「便利なPINを使用したサインイン」がオンになっていても、「Windows Hello for Businessの使用」もオンになっていないとだめらしいです。
僕の場合はこれがオフになっていました。
グループポリシーの「コンピュータの構成」→「管理用テンプレート」→「システム」→「PINの複雑さ」に行って修正しておきましょう。
（バージョンによっては「コンピュータの構成」→「管理用テンプレート」→「Windowsコンポーネント」→「Windows Hello for Business」にあるかもしれません）
# 3.レジストリ修復
こちら

https://br.atsit.in/ja/?p=40984

このレジストリの値がおかしくなっていたので修正しておきました。
「HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PolicyManager \ default \ Setting」からAllowSignInOptionsを選択。
本来は「Value」というものがあるらしいのですが、僕のところにはなかったので、新規作成してDWORD値1を設定しておきました。
値無しだとどのような影響があるのかいまいちよくわかりませんが…一応。

# まとめ
以上です。この三つを見直したところ、Windows10、Home Windows10 Pro機の両方でWIndows Helloが使えるようになりました。
【超初心者向け】初めてC言語プログラミングをVisualStudioで行ったときに陥りがちな４つのエラー

#目次
__0.はじめに__
__1.scanfとscanf_s__
__2.%cを扱う時の注意点__
__3.for文などでiを使用するときの注意点__
__4.if文などの条件式__
__5.最後に__

#はじめに

この記事はC言語を習い始めて一年ほどの初心者の私が、初めてすぐのころにミスをしていたことについてまとめたものになります。
記事を書くのも初めてですので、誤字・脱字等があるかもそれませんがご了承ください。

#scanfとscanf_s
まず最初にVisualStudioでプログラミングを行うとき、scanfの下にscanf_sというのが出てきます。ほとんどの学習参考書やネット記事などは、scanfで表記されているためそのままscanfを記述することになると思います、しかし下のコードのように書いたときほとんどの場合で__C4996__というエラーが発生します。

~~~
#include<stdio.h>

int main()
{
	char c[10];
	scanf("%s", c);
    printf("%s", c);
}
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2302262/5ff5fb34-db7c-f011-7598-36de441421b9.png)
このエラーが出る理由としては、初心者がscanfを使用するとバッファオーバーランを起こしてしまう可能性が非常に高いからとされています。
またこのエラーを解消しscanfを使用したい場合は、`scanf_s`をscanfの代わりとして使用することや、`#include<stdio.h>`の前に`#define _CRT_SECURE_NO_WARNINGS`や`#pragma warning(disable : 4996)`を記述することでscanfのまま使用することもできます。

※バッファオーバーランとは元々，コンピュータのメモリ上の領域（バッファ）よりも大きなデータが渡されているのにプログラムがそれを見逃して領域あふれ（オーバーラン）が起きてしまうことを指す。

#%cを扱うときの注意点
scanfの使用時に注意することは前述のことだけではありません。
scanfで一文字ずつ入力するときに使用する%cにも気を付けなければいけないことがあります。例えば下のようなコードは入力はできても、出力で10文字中5文字分しか表示されません。

~~~
	for(int i=0;i<10;i++)
    {
	    scanf("%c", &c[i]);
    }
~~~
なぜ10文字とも表示することができないのかというと、そもそも__%c__というのは一文字づつ入力を行うというものなので、スペース区切りで入力した場合も改行区切りで入力した場合でもそれ自体を一文字と認識してしまうため、見た目では5文字でも10文字分の領域を使っているからです。
これらを解消するには`scanf("%c", &c[i]);`の前にダミーとして`scanf("%c", &dummy);`を用意しておくことや、空白類文字の読み捨てを行うように%cの前に空白を入れ`scanf(" %c", &c[i]);`というように記述することで正常に入出力を行えます。

#for文などでiを使用するときの注意点
for文などを使用するとき基本的にはint型の変数iを使う人が多いと思います。しかし使用する場所によってはエラーの種になる可能性を秘めています。例えば下のようなコードの場合エラーとなります。

~~~
int main()
{
	int n[10];
	for  (int i = 0; i < 10; i++)
	{
		scanf("%n", &n[i]);
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d", n[i]);
	}
}
~~~
これがエラーになる理由としては、一つ目のfor文の中でiを宣言しているので、そのiをfor文の外に持ち出して使用することは基本的に不可能であるためです。for文などの関数はそれ自体で一つの領域のようなものなので、その領域内で定義したものは領域外では定義されていないため存在しないため、もし使用したい場合はfor文などの領域外で定義しておくことでその内側であればどこでも使用できるようになります。

#if文などの条件式
条件式というのはif文などを使用するときに基本的に必要になるものです。ただこれを使用するときのミスは、プログラミングを始めてすぐのころはほとんどの人がするはずです。例えば下のように、よく見たらちょっとしたケアレスミスをしていたり。

~~~
	if (n = 10)
	{
		printf("%d", n);
	}
	else　if(n=<9)
	{
		printf("low");
	}
    else
    {
        printf("high");
    }
~~~
本来等価演算子は`＝＝`と二つ記述しなければいけないのに一つしかなかったり、比較演算子で`<=`と記述しないといけないところが逆になっているなど、条件式を扱う際は、しっかり見直せばわかるミスが起こりやすいので注意して使用しましょう。

#最後に
今回は初心者の陥りがちなミスをまとめていきましたが、私もいまだに気を抜いてこれらのミスをしていることがあるので、今後も気を抜かずしっかりとプログラミングを行っていきたいと思います。
ここまでご清覧ありがとうございました。
マークダウンとは

##マークダウンとは

マークダウンは人が読みやすくて、書きやすくすることが目標です。
私のようにHTMLとマークダウンがあって何が何かわからなく混乱している人もいると思います。
マークダウンとHTMLの関係は下記になる。

__マークダウン　→（変換）→　XHTML(またはHTML)__
簡単に言うと書きやすいマークダウンを書いて、HTMLを表現するというイメージです。

##マークダウンの特徴

コードの表現にも特化していて、
githubでmdファイルの記述やイッシューの追加などに使われます。
下記のように綺麗にコードを書くことができます。


```ruby:board.rb
puts 'This is how to put the code.'
```

##マークダウン学習のためのおすすめサイト、記事
記事をみるよりは、手で打ってみると分かりやすいのでおすすめのサイトを紹介します。　　
_下記にマークダウンのテュートリアルがありますので、私のような初心者の方は確かめてみてください。_

https://www.markdowntutorial.com/jp/

_そして[Qiita](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#links---%E3%83%AA%E3%83%B3%E3%82%AF)で特価したマークダウンの記事です。丁寧な説明ですごく分かりやすいです！_

https://qiita.com/Qiita/items/c686397e4a0f4f11683d#links---%E3%83%AA%E3%83%B3%E3%82%AF


以上です！
APR ⇔ APY 変換公式

APRとAPY
========

DeFiで資産を運用する場合に、得られる利率として「APR」と「APY」の二種類の表記があります。
一文字違いなので紛らわしいのですが、それぞれ下記のような略語となっております。

- APR - Annual Percentage Rate (年換算利回り)
- APY - Annual Percentage Yield (年間利回り)

「何の略語なのか分かっても違いが分からねぇ……。」という声が聞こえそうですが笑

単利と複利
========

これらの違いは「単利か複利か」の違いになります。
具体的には前者のAPRは単利で換算した場合の利率、後者のAPYは複利で換算した場合の利率です。

DeFiの場合にはものによっては毎秒（！）利子がもらえて、もらった利子にさらに利子がついて……という無限ループになりますので、瞬間風速的な利率はAPRで計算されますが、例えば一週間後にいくらになるかといった値はAPYを見る必要があります。

伝統金融においては債権は比較的長い一定の期間（1年とか）が経過しないと利子はもらえないため、例えば1年償還で年利10%であれば、10年間複利で運用した場合は $1.1^{10} = 2.59 = 15.9\%/\text{year}$ と比較的簡単に計算できます。

DeFi市場における計算公式
=====================
 
ではこれが毎秒償還されるようなDeFi市場ではどう計算できるでしょうか？

基本的な考え方は1年償還のものとほぼ一緒ですが、償還間隔が1年未満であることを考慮して割り算して、その分べき乗の回数を増やすだけです。
これをきちんと数式で示してみましょう。

以下のように変数を設定します。

- $r_\text{APR}$ - 年利 (%)
- $t$ - 償還間隔 (秒)
- $T$ - 1年間の秒数 (つまり、$365 \times 24 \times 60 \times 60 = 31536000\text{秒}$)

すると、一回の償還期間における利率は $r_\text{APR} \times \frac{t}{T}$ になりますから、これを一年間の償還回数 $\frac{T}{t}$ 回だけ掛け算すればいいですね。
つまり、

$$
r_\text{APY} = 100 \times \left( \left( 1 + \frac{r_\text{APR}}{100} \cdot \frac{t}{T} \right)^{\frac{T}{t}} - 1 \right)
$$

となります。
途中の計算でパーセント単位の利率を何倍かの値に変換しないといけない (例えば 10% ならば 1.1 にしなければいけない) ため少々複雑ですが、よ〜く数式を読み解けば分かるはずです。

指数関数近似
==========

さてさて、厳密な式としては上記のとおりなのですが、上の式を見てなにか気づかないでしょうか……？

そうです！
なんか自然対数の底 (ネイピア数) の定義みたいな式ですね！

自然対数の底の定義式は

$$
e = \lim_{n \rightarrow \infty} \left( 1 + \frac{1}{n} \right)^n
$$

でしたね。

少し変形すると、任意の実数 $x$ に対して

$$
e^x
= \lim_{n \rightarrow \infty} \left( 1 + \frac{1}{n} \right)^{nx}
= \lim_{n \rightarrow \infty} \left( 1 + x \cdot \frac{1}{n} \right)^n
$$

が成り立ちます。

さて、ここでAPYの計算式の$\frac{T}{t}$というのは非常に大きな値であったことを思い出すと、$n = \frac{T}{t}$とおいてしまえば

$$
r_\text{APY}
= 100 \times \left( \left( 1 + \frac{r_\text{APR}}{100} \cdot \frac{1}{n} \right)^n - 1 \right)
\simeq 100 \times \left( \exp\left(\frac{r_\text{APR}}{100}\right) - 1 \right)
$$

と近似することができます。

これなら覚えやすい簡単な式になりましたね！

グラフ
=====

APRとAPYをグラフにするとこんな感じになります。

![APR-⇔-APY-変換テーブル-Google-スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121446/b3cb6c55-0732-02c6-6411-fdb05f60dedb.png)

厳密解と指数関数近似は重なってしまって違いがほとんどわかりませんね！
またAPRが20%程度になるとAPY換算では22%ほどになり、一割ほど実質収益が増えることが分かります。
APRとAPYの差は指数関数的に増えていきますので、APRが高ければ高いほど、APY換算での実質収益はますます増加していきます。

⇧ の計算テーブルは以下をご参照ください。
https://docs.google.com/spreadsheets/d/1ed2eF2hhpo33EIDsowjYFDuaJ5asyj9_zc1UX7c0erE/edit?usp=sharing

複利の計算は足し算と掛け算しか使いませんが、高校数学の知識を使うと指数関数で近似できるというのはなかなか面白かったのではないでしょうか？（当たり前なんだけど）

ではでは！
SAP認定Scale-Out構成-AWS

#AWSにデプロイするSAP　Scale-Out認定構成はピックアップしました。　
※2022/01/12元時点の公開情報によるまとめ

 * u-6tb1.56xlarge
   + Workload (Scale-out - 16 active nodes: 1 master, 15 worker nodes):
      - OLAP (incl. BW/4HANA & BWoH)
   + Workload (Scale-out up to 4 nodes: 1 master, 3 worker and NO standby node):
      - OLTP (incl. S/4 HANA)
 * u-9tb1.112xlarge
   + Workload (Scale-out up to 4 nodes: 1 master, 3 worker and NO standby node):
      - OLTP (incl. S/4 HANA)
 * u-6tb1.metal
   + Workload (Scale-out - 16 active nodes with BW: 1 master, 15 worker nodes):
     - OLAP (incl. BW/4HANA & BWoH)
     - standby node is not allowed
     - AWS Nitro System next generation (100Gbit/s) must be used
   + Workload (Scale-out up to 4 nodes: 1 master, 3 worker and NO standby node):
     - OLTP (incl. S/4 HANA)
     - Requires SLES 12 SP3 or above / RHEL 7.4 or above
     - For information about S/4 scale-out see SAP Note 2408419 and referenced SAP Notes.
                Remark: scale-out configuration is without standby node. HA is available via 
                SAP system replication.
 * r5.24xlarge
   + Workload (Scale-out up to 16 nodes)
      - OLAP (incl. BW/4HANA & BWoH)

 * u-12tb1.metal
   + Workload (Scale-out up to 4 nodes: 1 master, 3 worker and NO standby node)
       - OLTP (incl. S/4 HANA)
       - Requires SLES 12 SP3 or above / RHEL 7.4 or above

 * x1.32xlarge
   + Workload (Scale-out up to 25 nodes)
     - OLAP (incl. BW/4HANA & BWoH)
     - Requires SLES 12 SP1 or above / RHEL 7.4 or above

                Remark: Based on SPS11 (or later) core-to-memory relaxation for OLAP, as of 
                SPS11 customers can make full use of RAM

 * x1e.32xlarge
   + Workload (Scale-out up to 25 nodes)
     - OLAP (incl. BW/4HANA & BWoH) - up to 1.9TiB per node
    - Requires SLES 12 SP1 or above / RHEL 7.4 or above

                Default scalability guidelines for generic OLAP and OLTP workloads apply.
                For customer-workload optimized configuration - up to 4TiB per node is
                supported; see HANA sizing guidelines at https://www.sap.com/about/benchmark
                /sizing.html for details on customer workload-driven sizing.

 * r3.8xlarge
   + Scale-out (up to 17 nodes, >5 nodes in controlled availability):
     - OLAP (incl. BW/4HANA & BWoH)
     - BPC (special attention has to be paid to table distribution (see SAP notes 2003863 and 2088315) and sizing (see https://www.sap.com/about/benchmark/sizing.html -> Sizing Guidelines -> Analytics -> EPM: SAP Business Planning and Consolidation)

  * u-6tb1.112xlarge
   + Workload (Scale-out up to 4 nodes: 1 master, 3 worker and NO standby node)
     - OLTP (incl. S/4 HANA)
   + Workload (Scale-out up to 16 nodes)
     - OLAP (incl. BW/4HANA & BWoH)

 * u-12tb1.112xlarge
   + Workload (Scale-out up to 4 nodes: 1 master, 3 worker and NO standby node)
     - OLTP (incl. S/4 HANA)
   
参照リンク：https://www.sap.com/dmc/exp/2014-09-02-hana-hardware/enEN/#/solutions?filters=iaas;ve:23
crontab×ruby 備忘録

##### 経緯
crontab で ruby のスクリプトを動かすことに苦戦したので、
忘れないようにメモ。


##### 参考記事
https://qiita.com/xxl/items/88108f9ef70eafab395c

##### 実行環境
・cent os  (ヴァージョン追記予定)

##### シェルスクリプトの作成
参考記事に倣って作成する。

##### crontabの設定
crontabは環境変数が通っていないため、crontabで使いたい環境変数は自分で通す必要がある。
crontab -e の編集画面で、
PATH, HOME, RBENV_ROOT,RBENV_SHELL,SHELLなど通すことで、
crontab　で　ruby のスクリプトが動かせるようになった。

（LANG も通しておかないと、実行ログが文字化けしてました）
ポインタについて 

#始めに
　この記事はC言語初心者がポインタの基礎についてまとめたものです。

###・まず
　変数や配列などの領域は、メモリ上に保存されている。
　メモリには、場所を表す**「アドレス」**という固定長（1バイトの大きさごとに1番地）
　の数字の列がついている。

###・データ型によって確保される領域
　・int：4バイト

　※intが32ビット（４バイト）である環境として考える

　宣言したint型の変数xが1000番地から確保されたとすると、
　int型は4バイトのデータ型なので、確保されたxの領域は
　1000番地から1003番地までのアドレスをまたいで４バイトの大きさになる。
![int x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2304309/bfbefa4f-3576-29f2-0a44-254181fd0820.png)



#・ポインタ（変数）とは
　変数や関数などが置かれたメモリ上の番地などを格納する変数のことです。
　メモリ上に確保された領域の（始まりの）アドレスと大きさ（データ型）から
　参照する。
　ポインタ変数にはアドレスだけを格納することができ、数値や文字などの値を
　直接格納することはできない。

###・ポインタ変数の宣言

```:
　　データ型　＊ポインタ変数名；

　　例：int *p;
```

　この例は、
　「int型のデータをしまう領域を参照するために使うポインタ変数」ｐを宣言していて、
　ここで宣言された変数名ｐに「＊」を付けて使うと「int」型の領域を表すことができる。
　ここで「＊」はポインタ変数を宣言することを示す**「宣言子」**である。

#・間接参照
　
　ポインタ変数が特定の領域を参照しているとき、その特定の変数そのものをポインタ変数を使って表すこと。

```:
　　ポインタ変数名 = &変数名;

　例：int x;　　//int型変数xの宣言
　　　int *p;　　//int型を被参照型とするポインタ変数pの宣言
　　　p = &x;　　//ポインタ変数pに変数xの領域を参照させる
```

　ポインタ変数pに変数ｘのアドレスを代入することによって、ポインタ変数ｐが
　Int型変数ｘの領域を参照することができる。
　ここでは、ポインタ変数ｐそのものにアドレスを代入するため、
　**「*p=&x；」**と書いてはならない。

　演算子「＊」をポインタ変数の前に付けると、ポインタ変数が参照している特定の変数の
　領域からその特定の変数そのものを表すことができる。
　ここで、この演算子「＊」を**「間接参照演算子」**という。

```c++:
#include<stdio.h>
int main(void)
{
	int x;
	int* p;　　　　　　　　　　　　　　//ポインタ変数の宣言

	x = 100;
	p = &x;　　　　　　　　　　　　　　//ポインタ変数へ変数xのアドレスを代入

	printf("x = %d\n", x);　　　　　　//変数xの内容
	printf("*p = %d\n", *p);　　　　　/*ポインタ変数による間接参照
　　　　　　　　　　　　　　　　　　　　　　ここでは変数xの値が表示される*/

	printf("&x = %p\n", &x);　　　　　//変数xのアドレス
	printf("p = %p\n", p);　　　　　　/*ポインタ変数の値
　　　　　　　　　　　　　　　　　　　　　　ここでは変数xのアドレス*/
	return 0;
}
```
※「%p」は、ポインタの値を出力する
###出力結果
```:
　x = 100
　*p = 100
　&x = 00AFFD0C
　p = 00AFFD0C
```

#・まとめ
```
　int *p;
```

　**「p」**：変数のアドレスが代入される
　**「*p」**：「p」に格納されているアドレスにある値を表示させる

#・最後に
　今回はポインタの基礎を簡単にまとめてみました。
　まだまだ分からないことだらけなので勉強を続けていきたいと思います。
　
　最後まで読んでいただきありがとうございます。