OmniAICreator/Qiita-1.07M huggingface dataset:
『DirectX12の魔導書』を読んで詰まった箇所をダラダラ書く

巷で難しい！わからない！と言われているDirectX12に挑戦しようと思って始めてみました。
さすがにサンプルと公式リファレンスだけでは厳しかったので、タイトルの通り『DirectX12の魔導書』を参考に色々いじっています。

[DirectX 12の魔導書 3Dレンダリングの基礎からMMDモデルを踊らせるまで](https://www.shoeisha.co.jp/book/detail/9784798161938)

この本を読みながら進めててちょくちょく詰まったところを、メモ代わりにちまちま書き残していきます。

# 現在の進捗

* 初期化から画面クリアまで
* ポリゴンの表示
* テクスチャを貼り付ける**←いまここ**
* 行列による座標変換
* PMDの読み込みとモデル表示
* マテリアル
* スキニングとアニメーション
* インバースキネマティクス(IK)
* マルチパスレンダリング
* 影行列とシャドウマップ
* マルチレンダーターゲットとその応用
* スクリーンスペースアンビエントオクルージョン(SSAO)

# ポリゴンの表示

## EXECUTION ERROR #613: RENDER_TARGET_FORMAT_MISMATCH_PIPELINE_STATE

エラー表示

```
D3D12 ERROR: ID3D12CommandList::DrawInstanced: The render target format in slot 0 does not match that specified by the current pipeline state. (pipeline state = B8G8R8A8_UNORM, RTV ID3D12Resource* = 0x00000206B90E28D0:'Unnamed ID3D12Resource Object') [ EXECUTION ERROR #613: RENDER_TARGET_FORMAT_MISMATCH_PIPELINE_STATE]
```

D3D12 ERROR: ID3D12CommandList::DrawInstanced: The render target format in slot 0 does not match that specified by the current pipeline state. (pipeline state = B8G8R8A8_UNORM, RTV ID3D12Resource* = 0x00000206B90E28D0:'Unnamed ID3D12Resource Object') [ EXECUTION ERROR #613: RENDER_TARGET_FORMAT_MISMATCH_PIPELINE_STATE]

レンダーターゲットのフォーマットとパイプラインのフォーマットが合ってないぞ、と怒られてます。

### 解決

```cpp
//---- スワップチェーンの初期化
DXGI_SWAP_CHAIN_DESC1 swapchainDesc = {};
swapchainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;

//---- パイプラインの初期化
D3D12_GRAPHICS_PIPELINE_STATE_DESC gpipeline = {};
gpipeline.RTVFormats[ 0 ] = DXGI_FORMAT_R8G8B8A8_UNORM;
```

確認していたらフォーマット違ってました。
`DXGI_FORMAT_B8G8R8A8_UNORM`と`DXGI_FORMAT_R8G8B8A8_UNORM`でよく見るとRGBの順番が違います。
よく見て設定しないとだめですね。

## エラー出てない、なのに三角形が出てこない

長い長いパイプラインの設定が終わって、コマンドも描いてさあ描画と思ったけれど三角形が出てこない。
座標も合っているし、設定値も間違ってない。どういうことと迷いました。

### 解決

```cpp
_cmdList->SetPipelineState( _pipelinestate );
_cmdList->SetGraphicsRootSignature( _rootsignature );
//_cmdList->RSSetViewports( 1, &viewport );        ←これと
//_cmdList->RSSetScissorRects( 1, &scissorrect );  ←これを忘れてる
_cmdList->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
_cmdList->IASetVertexBuffers( 0, 1, &vbView );
_cmdList->DrawInstanced( 3, 1, 0, 0 );
```

描画命令(p144)で、コマンドリストに積み重ねるコマンドが一覧で載っています。

1. パイプラインステートのセット
2. ルートシグネチャのセット
3. ビューポートとシザー矩形のセット
4. プリミティブトポロジのセット
5. 頂点情報のセット
6. 描画(Draw)命令

このあと、それぞれの実際のコードが書いてあるのですが、3. ビューポートとシザー矩形のセットに関しては書いてません。（前節のコラムp144で小さく書かれています）
これを書くのを忘れてたから描画されてませんでした。

# ポリゴンにテクスチャを貼り付ける

## エラーが出ないのにテクスチャが表示されない

ノイズのテクスチャを貼り付けたはずなのに、四角形が真っ黒になるという事象が発生しました。

### 解決

シェーダーリソースビューの設定値が間違えてました。

```cpp
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};

//srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UINT; // ← NG
srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;  // ← OK
```

だいたいうまく表示されないのは設定値ミスが多いですね。
VBA×Python最速仕事術を読んだ内容メモーchapter3

###■プログラムを書く前に・・

★今回はVisual Studio Codeを使用

プログラムを書く前に、まずは作業手順の洗い出しから行う。
　　ex)サーバーに保存されたExcel売上伝票のデータ一部を抜き取り、システム販売管理システムに転記したい
　　手順１／指定のフォルダにあるワークブックを開く
　　手順２／売上伝票シートの一部分のデータを選択
　　手順３／CSVデータとして吐き出す

※　プログラムの略語のなかでtoを2として略して語呂合わせしたりする

###■使用ライブラリ
import pathlib  ⇒標準ライブラリ。ファイルやフォルダーのパスをプログラム中で扱いやすくする
import openpyxl  ⇒外部ライブラリ
import SCV  ⇒標準ライブラリ。csvファイルを出力するときに使う

**ライブラリについて**
標準ライブラリはpythonがインストールされたときに同時にインストールされる。
Libフォルダにあるファイルが標準モジュール
外部ライブラリはインストールが別途必要になる。

**パッケージとは・・**
pythonのモジュール<○○○.py>などの複数のモジュールをまとめたもの。
フォルダでまとまっている
**モジュールとは・・**
単一のpythonファイルで構成されているもの。いくつかの

**CSVファイルにとは**
Comma Separated　Value（カンマで区切った値）の略
拡張子は.csvでテキストファイルになる。メモ帳などのテキストエディタやVisual Studio Codeなどで開くことができる。
ExcelやAccess、サーバー型データベースなどでデータ取込・出力などが出来る


####■コード解説・まとめ

1wb=openpvx1.**workbook()**　新規ワークブックを作成する変数
1wb=openpvx1.**active**　アクティブシートを取得する変数
path = pathlib.**path("..\data\slaes")**  パスを指定する変数

**for pass_obj in path.interdir():** 


※".."は相対パスのことで現在のフォルダを基点としてパスの指定をしている

**pass_obj.match("*.xlsx"):　**　Excelファイルか調べる動作
wb = openpyxl.**load_workbook(pass_obj)**　ワークブックを読み込む動作
**dt_row in range(9,19):**　セル行の始まりと終わりを指定（19行目は値が返されないので注意）

※Excelの範囲指定について
rangeとcellの二種類
range(列,行)
cell(行,列)

Excelではセル番地をしてするときはA1やG２のような指定の仕方もあるが、
pythonでは、行番号→列番号の順で指定する。また、列番号はアルファベットではなく数字を使うことが多い

\n　⇒改行の意味
＊　⇒ワイルドカード　例)pass_obj.match("*.xlsx"):

###■if 条件分岐
ある条件が成り立つか否かで処理をわけることできる関数。
条件がなりたつとき(真=true)のときに＜~する＞命令文を設定。

```python:if関数
if 条件式:　　　　　　※　末尾にコロンをつける
　　命令文1　　　　　　
　　命令文2
```
※None=何もない

```python:if関数
if pass_obj.match("*.xlsx"):
            wb = openpyxl.load_workbook(pass_obj)
            for sh in wb:
                for dt_row in range(1,1):
                    if sh.cell(dt_row, 1).value != None:　　←これ
```

else例)特定の条件について正解の場合は"合格"、不正解の場合は"不合格"と設定する場合

```python:if関数(else使用)
score = 100
If score => 100:
     print("合格")
else:
     print("不合格")
```

```python:if関数(else使用)
score = 100
If socore => 100:
     print("合格")
else:
     print("不合格")
```
AdHocでテスト端末を追加登録する方法

後からテスト端末を追加することはよくある話だと思うのですが、一発でできなかったので手順をメモしておきます
XcodeはVersion11.4.1です

【2021/5/24 追記】
Xcodeのバージョン12.4でも同様の手順でできました

## デバイスの登録
Apple Developer上で
・「Certificates,IDs&Profiles」＞「Devices」より端末を登録
・「Certificates,IDs&Profiles」＞「Profiles」よりAdHoc用のProfileをEditし、登録した端末を追加

## プロファイルの再読み込み
Xcode上で
・「Xcode」＞「Preferences」から「Accounts」を開く
・「Download Manual Profiles」を押下
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165658/4b67104b-0d76-83ce-8a3c-ebf2b400be90.png)
これでプロファイルが再読み込みされたので、「Product」＞「Archive」でIPAファイルを新しく作成して終了です
Ubuntu18.04でSalome-Mecaのアイコンをお気に入りに表示する

#背景
Ubuntu16以前は，Salome-Mecaを起動している間，アイコンがお気に入りリストにアイコンが表示され，アイコンを右クリックしてお気に入りに追加できたが，Ubuntu18以降はできないようなので，毎回，appli_V2019xxxを端末から開いてsalomeを起動する必要があり，やや面倒だった．お気に入りにアイコンを表示させたい．
#参考にした情報
HiroRittsuさんの情報（https://qiita.com/HiroRittsu/items/6257767d0d8ab55bb498 ）を参考に，xxx.desktopファイルを作成する．
#ファイルを置く場所
ホームディレクトリの真下にある，.local/share/applications を開く．ファイルマネジャーの場合，Cntl+Hで隠しファイルが見えるようになるが，端末で入り，

```
ls -al
```

として表示させてもよい．
#作成するファイル
今回は，SalomeMeca2019.desktop という名前のファイルをテキストエディターで作成した．
中身は以下の通り．

```
[Desktop Entry]
Version=1.0
Type=Application
Name=SalomeMeca2019
Icon=/home/user/salome_meca/V2019.0.3_universal/icon.png
Exec="/home/user/salome_meca/appli_V2019.0.3_universal/salome" %f
Categories=Graphics;IDE;
Terminal=false
StartupWMClass=SalomeMeca2019
```

私は古いユーザなのでviエディターを使った．
IconとExec以外がどういう意味なのかよくわからないが，これで何とかなった．
#お気に入りへの追加
上記のファイルを保存して，左上のActivitiesをクリックすると，検索してSalomeのアイコンが表示されたら成功．アイコンを右クリックしてお気に入りに追加する．
![Activities.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608825/4f2872df-18d8-598f-0db6-2c418f65eb0d.jpeg)

#結果
お気に入りにSalomeのアイコンが入り，Salome-Meca2019を起動できた．
![StartWithIcon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608825/9111bcd6-bce6-9044-d035-c95d739b3d66.jpeg)
SourceTreeでgit push時にエラー403から始まったpush不能

#始まり
SourceTreeを使ってローカルMacPCからリモート(GitHub)にgit pushしようとしたらキーチェーンでパスワードを確認されてからエラー403が出る。

#403エラーが出てる時
[git push時に403エラーが返ってくる際の対処法](https://sy-base.com/myrobotics/others/git-push_403error/)
↑を参考にキーチェーン内のgithubパスワードを削除
手順通りにやればgithubのパスワードを聞いてくるはずなのに聞いてこない…
403エラーは出てこなくなったけど、pushが終わらない

#pushが終わらない
とりあえず、アンインストールして再インストール
[SourceTreeの過去バージョンの入手先](https://community.atlassian.com/t5/Sourcetree-articles/SourceTreeの過去バージョンの入手先/ba-p/731205)

他にpushが出来なくなった人がいないか探すと、gitのバージョン合わせの話が出てきたので合わせる。
[Sourcetree 3.2.6にアップグレードしたら、pushできなくなった時の対処法](https://blog.maromaro.co.jp/archives/7578)

#解決
gitから直接pushしてみると成功しました。

ターミナルを立ち上げる。

```terminal:
$ cd ローカルディレクトリ  # 保存場所に移動
$ git log --graph  # gitのログを確認
$ git push origin master  # リモートレポジトリからローカルレポジトリへpush
```

しかも、そのあとにSourceTreeを立ち上げると何事もなかったかのようにpushが出来た。


注) リンク・アカウント・通信方法(https/ssh)が自分が想定しているものと同じか、も確認
[SourceTree で複数アカウントを扱う](http://mattsudev.hatenablog.com/entry/2015/06/19/182416)
国土数値情報を使って、最寄り駅とその距離を求める


# はじめに
緯度・経度があるデータに、その位置に関する情報を付与したいことがあります。
[国土数値情報　ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/index.html)には、色んな情報が無償で公開されています。それを使って、最寄り駅とその距離を求めます。

# PostGISのインストール

PostGISを使います。 [PGSQL](https://pgsql.io/)のサイトからだと便利です。
（以前はPowerShell用の手順もあったのですが、WSLを使いましょうになってきました。。。）

# シェイプファイルからインポート

[駅別乗降客数データ](http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-S12-v2_3.html)をダウンロードします。展開すると、*.shpなどのファイルがあります。ここに移動して、シェイプファイルからインポート用のSQLに変換します。


```
$ shp2pgsql -W cp932 -D -I -s 4326 S12-18_NumberOfPassengers.shp station_passenger > station_passenger.sql

$ psql -U postgres sample < station_passenger.sql
```


距離をもとめる関数を使うために、geography型のカラムを追加します。

```
psql> ALTER TABLE station_passenger ADD COLUMN geo geography(MultiLineString,4326);
psql> UPDATE station_passenger SET geo = geom::geography;
psql> CREATE INDEX idx_station_passenger_geo ON station_passenger USING gist (geo);
```

# 最寄り駅とその距離を算出

緯度・経度があるデータを、下記のようなテーブルに作ってpostgisにいれます。

```
create table sample (
    id integer primary key,
    longitude double precision,
    latitude double precision,
    geo geography(Point, 4324)
)
```

緯度・経度から、geography型のカラムに値をいれ、インデックスをつけます。

```
psql> create index sample_geo on sample using gist(geo);
psql> update sample set geo = st_setsrid(st_point(longitude, latitude), 4326)::geography;
```

cross join と、遅延評価のlateralを使います。
イメージ的には、sampleテーブルの1行ごとに、最短距離のレコードを問い合わせます。
geographyのカラムにインデックスが貼っていないと、めちゃめちゃ遅くなります。

```:sql
select a.id, station_name, passengers_per_day, distance from sample a 
CROSS JOIN LATERAL (
SELECT 
S12_001 as station_name, 
S12_033 as passengers_per_day, 
a.geo <-> b.geo as distance 
FROM station_passenger b ORDER BY a.geo <-> b.geo LIMIT 1) AS closest_pt
```
copy文で出力するには、下記のようになります。

```
copy (select a.id, S12_001, S12_033, dist from rpay_geo a CROSS JOIN LATERAL (SELECT S12_001, S12_033, a.geo <-> b.geo as dist FROM station_passenger b ORDER BY a.geo <-> b.geo LIMIT 1) AS closest_pt) TO '/tmp/nearest_station_passenger.csv'(FORMAT csv, FORCE_QUOTE *);

```



# 参考リンク

* https://qiita.com/boiledorange73/items/f2d8388e88d534066bc0
* https://stackoverflow.com/questions/48551479/postgis-minimum-distance-between-two-large-sets-of-points/48554474
* https://qiita.com/junkor-1011/items/896f2071546b5dc1c3e5
Railsのproductionモードで静的ファイルが反映されない時

Railsアプリケーションサーバを起動する時に

```
rails s
```

コマンドを使うが、このコマンドで起動されるのは`development server`です。

`production server`を起動するには

```
rails s -e production
```

オプションを設定する必要があります。

しかし、`production server`ではcssが反映されなかったり、jsが動作しなかったりします。

これは一般的にアプリケーションを公開する場合は、cssなどの静的ファイルはNginxなどのWEBサーバが返却するのが一般的で、アプリケーションサーバの役割ではないためです。

しかし、開発の場において簡易的に公開時の動作を確認したい場合もあります。

そのときは環境変数に次の値を設定します。

```
export RAILS_SERVE_STATIC_FILES=1
```

今回は例として`1`を設定しましたが、実際はどんな値でも問題ありません。
これは、`config/enviroment/production.rb`を確認すれば理解できます。



```ruby:config/enviroments/production.rb
  # Disable serving static files from the `/public` folder by default since
  # Apache or NGINX already handles this.
  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
```

このコードでは、環境変数`RAILS_SERVE_STATIC_FILES`の存在するか否かの結果が静的ファイルを配布するのかを決めています。

なので、どのような値でも格納しておけば`present?`の部分で`true`が返ってくるので`production server`でも静的ファイルを配布することが可能になります。

Dockerで環境を構築するときは、予め環境変数を設定しておくと便利です。


```yaml:docker-compose.yml
rails:
    environment:
      RAILS_SERVE_STATIC_FILES: "1"
```
Windows で ssh 接続できないいい

WindowsからCentosにssh接続できなかった。
ほかのPCからはCentosに接続できるのでサーバーの問題ではない。

解決した。

Windowsのエクスプローラーからconfigと秘密鍵のプロパティでセキュリティを押す
自分とadminとsystem以外の特殊なアクセスも含めてすべて外す。

自分は特殊なアクセスだけ許可してたのでできなかった。
それを外したらできたので多分これが原因
PHPデバッグ作業用ログ出力あれこれ

# デバッグ
変数内のデータがどういう状態にあるのかを知ることは、デバッグするうえで非常に重要な情報となります。
PHPでは変数内に何が入っているのかという情報を得るために以下のような関数が用意されています。
出力のフォーマットや情報量に差がありますが、print_rとvar_exportを覚えておくとよいとおもいます。

##print_r関数
得られる情報量はおそらく3種の中で一番少ないですが、第二引数にtrueを付けることでダイレクトに出力せずにテキストとして取得することができるようになります。
`$debug = print_r($var, true);`

##var_dump関数
この関数を私があまり使うことがないのは、変数内に格納することができないからです。
そのため後述するログ関数と組み合わせて使うことはできず、そのまま画面や標準出力に出してしまうことしかできないのです。
画面の上のほうに変数内のダンプデータがガガガッとでてきて画面の表示が変になったりくずれます。　画面やターミナルに出せるような機能であれば、いいのですが定期実行バッチであったりLaravelのQueueとかの調査になるとvar_dumpでは白旗を上げざるを得ません。

使い方はいたってシンプルです。
`var_dump($var);`

##var_export関数
こちらも、第二引数にtrueを付けることでダイレクトに出力せずにテキストとして取得することができるようになります。
`$debug = var_export($var, true);`

# ファイルに書き出す
##error_log関数
ログを書き出すための関数です。
書き出すテキストだけしか指定せずにデフォルトで使うと、システムで設定されているエラーログファイルに書き出しされます。
`error_log(print_r($var, true));`

もし、任意の場所に書き出したいのであれば、追加の引数を指定して以下のようにします。
`error_log(print_r($var, true), 3, '/tmp/debug.txt');`

##file_put_contents関数
変数内のテキストをファイルに一気に書き出すことができる関数です。
書き出し先は第一引数で任意のファイルパスを指定して自由に選べます。
第三引数を省略すると、書き出しのたびにファイルがリセットされます。
`file_put_contents('/tmp/debug.txt', print_r($var, true));`

追記型でどんどん書き出しをストックしていきたい場合は、第三引数にフラグ定数をセットします。
`file_put_contents('/tmp/debug.txt', print_r($var, true), FILE_APPEND);`

##主要フレームワークのログ出力関数
###CakePHP3
Logクラスを使います、第一引数はログのラベルです。
`Log::write('debug', $message);`
Cake\Log\Logをuseしている箇所であれば、logメソッドを使うこともできます。
こちらでラベリングする際は第二引数に値を渡します。
`$this->log($message, 'debug');`
ラベルにはEmergency、Alert、Critical、Error、Warning、Notice、Info、Debugの８種類が利用できます。

ドキュメント
https://book.cakephp.org/3/ja/core-libraries/logging.html#filelog

###Laravel7
Logクラスを使います。ログのラベルごとに違うメソッドを使います。
`Log::emergency($message);`
`Log::alert($message);`
`Log::critical($message);`
`Log::error($message);`
`Log::warning($message);`
`Log::notice($message);`
`Log::info($message);`
`Log::debug($message);`
ドキュメント
https://readouble.com/laravel/7.x/ja/logging.html

###CodeIgniter3
log_message関数を使います、第一引数はログのラベルです。
`log_message('error', $message);`
`log_message('debug', $message);`
`log_message('info', $message);`
ドキュメント
https://codeigniter.jp/user_guide/3/general/errors.html?highlight=log#log_message

###FuelPHP
Logクラスを使います。ログのラベルごとに違うメソッドを使います。
`Log::info($message);`
`Log::debug($message);`
`Log::warning($message);`
`Log::error($message);`
ドキュメント
http://fuelphp.jp/docs/1.7/classes/log.html
【業務系】システム開発に役立つ書籍4冊

##業務知識・DB設計
###『グラス片手にデータベース設計 販売管理システム編 第2版』
業務知識とデータベース設計を関連付けての説明がある。
業務フローから、どのようなデータベースを論理設計するかを学ぶことができる。
業務系システムが例になっているので、
業務系システムのデータベース設計を学ぶことができる。

##システム設計
###『システム設計の謎を解く』
業務系システムを例に、システム設計の説明がされている。
システム設計について、体系的・網羅的な説明があるため、
標準的なシステム設計を学ぶことができる。

##プログラミング
###『プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理原則』
過去のプログラマが生み出した原理原則を集めて、解説されている。
抽象的な内容なので、実際のプログラミングで具体的に考えることで、
品質の良いコード作成につなげることができる。

##SQL
###『SQL実践入門』
SQLに関して、実行計画を読み解きながら、
パフォーマンス、可読性や保守性に対して焦点を当てた説明がある。
一通り、基本的なSQLを書けるようになっている状態で読むことで、
さらに品質の良いSQLを書く方法論を学ぶことができる。
Windows10: pythonのMeCabライブラリのインストール

$ pip install MeCab

インストールできるんだけど、Tagger()でいきなりエラーがでる・・
いっそのことインストールできなきゃハマり度も浅いのに・・

有志で制作されてる[ここ](https://github.com/ikegami-yukino/mecab/releases/tag/v0.996)のMeCabをインストールするとちゃんと動きました！
ありがとうございます。
GAS を利用して素数日をお知らせしてくれる Slack Bot を作ってみた

# 概要
Slack Bot と Google Apps Script を用いて素数日を通知する機能を実装する．

# 詳細
今日2020年4月29日は素数日（20200429は素数）らしい．そこで，今回は

1. Google Apps Script で素数日判定を行う
2. 素数日ならば Slack Bot に通知を送る

という機能を作る．

## Slack Bot の作成
[以前にも Slack Bot を作った](https://qiita.com/denkiuo604/items/9501098038a22180683c)が，Slack API のページに変更があったため，説明を変更している．

1. https://api.slack.com/apps にアクセスし **Create New App** をクリック
2. アプリ名とワークスペースを設定し **Create App** をクリック
3. 左側のメニューから **OAuth & Permissions** をクリック
4. **Bot Token Scopes** にある **Add an OAuth Scope** をクリックし，**chat:write** を追加
5. 左側のメニューから **App Home** をクリック
6. **Your App’s Presence in Slack** にある **Edit** をクリックし，**Display Name (Bot Name)** と **Default username** を追加
7. 再び左側のメニューから **OAuth & Permissions** をクリックし，ページ上部にある **Install App to Workspace** をクリック
8. アプリがワークスペースへのアクセス権限をリクエストしてくるので，許可する
9. 表示される **Bot User OAuth Access Token** をメモしておく

## GAS でのコーディング
1. Google ドライブ上に "Google Apps Script" を新規作成する
2. エディタ画面の **リソース>ライブラリ** から[こちら](https://github.com/soundTricker/SlackApp)のライブラリを追加する
3. 次のコードを入力して保存する

```javascript:コード.gs
function myFunction() {
  // 今日の日付を取得
  var todayobj = new Date();
  var today = Utilities.formatDate(todayobj, 'Asia/Tokyo', 'yyyyMMdd');
  var year = Utilities.formatDate(todayobj, 'Asia/Tokyo', 'yyyy');
  var month = Utilities.formatDate(todayobj, 'Asia/Tokyo', 'MM');
  var day = Utilities.formatDate(todayobj, 'Asia/Tokyo', 'dd');
  
  // 素数かどうか判定する関数
  function is_prime(n) {
    var result = true;
    for(let i = 2; i <= Math.ceil(Math.sqrt(n)); i ++) {
      if(n % i == 0) {
        result = false;
        break;
      }
    }
    return result;
  }
  
  // Slack API でメッセージを送信する準備
  var slack_token = "xoxb-..."; // Bot User OAuth Access Token
  var slackApp = SlackApp.create(slack_token);
  var channelId = "ABCDEF12345"; // 作成したアプリのチャンネルID
  var message = "本日【" + year + "年" + month + "月" + day + "日】は素数日です！";
  var result = "Not Posted";
  
  // 素数日ならばメッセージ送信
  if(is_prime(today)) {
    result = slackApp.chatPostMessage(channelId, message, {});
  }
  
  Logger.log(result);
}
```

## テスト
1. スクリプトエディタの画面で **実行ボタン** をクリック
2. Google アカウントへのアクセスをリクエストされるので，許可する[^2]
3. スクリプトが実行され，Slack Bot に通知が来たら成功

[^2]: 「このアプリは確認されていません」という画面が出たら「詳細」をクリックした後「～（安全ではないページ）に移動」をクリックすると先に進める．

## 運用開始
1. スクリプトエディタの画面で **編集>現在のプロジェクトのトリガー** をクリック
2. **トリガーを追加** をクリック
3. イベントのソースを **時間主導型** にし，トリガーのタイプを **日付ベースのタイマー** にして時刻を選択する

素数日であれば，下記のように通知がなされる．

![素数日通知の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478774/01044213-e75e-0c8f-4227-70aed26f4cd8.png "素数日通知の画像")

# 参考
- [Google Apps Script で Slack Botを作ってみた。(お勉強編) - Qiita](https://qiita.com/Quikky/items/9de56c049304885a4f4f)
- [素数判定いろいろ - シンプルな判定と、素数の分布 - Qiita](https://qiita.com/srtk86/items/874639e361917e5016d4)
- [GoogleAppsScriptで現在日時の取得](http://www.googleappsscript.info/2017-07-27/get_now.html)
DockerDesktopが何もしないのに壊れて焦った話

DockerDestop便利だ。
メインPCがWindows10の自分は、CentOS環境で試したいことがあったり、メジャーなツールやミドルウェアの調査ならインストール済みのイメージ探しから着手してる。

## 利用例

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">組織が小さいと守備範囲は広がる。当然やね。<br>DockerのCentOSでgccのconfigure,makeの素振りなど。<br>現代のPCでも軽く1hは持ってかれるのな。</p>&mdash; masuda kaz (@masudakz) <a href="https://twitter.com/masudakz/status/1163771355667427328?ref_src=twsrc%5Etfw">August 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[PostgreSQL Collation ja-x-icuの検証](https://qiita.com/masudakz/items/ee01f62ec5ad589ff16f#%E6%A4%9C%E8%A8%BC%E7%92%B0%E5%A2%83)
2019-12-12

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今時のJenkinsってどうなってるか、手元でちょっと調べようとなったんだけど、docker pull してdocker run するだけやもんな。いい時代だ。<br><br>「ビルド環境」にsecretTextAreaとか使えるようになってる。プロダクトのビルド環境もちゃんと更新しなきゃ。 <a href="https://t.co/F0YPGvQRBH">https://t.co/F0YPGvQRBH</a></p>&mdash; masuda kaz (@masudakz) <a href="https://twitter.com/masudakz/status/1217607259099783168?ref_src=twsrc%5Etfw">January 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 何もしないのに壊れた

業界歴40年にもなろうというのに、なんなんだこの言い草は。
でも主観的には何もした覚えがなかった。

masuda  2020-03-25 10:10
> あれ。嘘だといってよ。
3/13にバッテリー枯渇危機になって DockerDesktop を止めた記憶はあるんだけど、そのとき まちがってUnistallしちゃった？

`docker ps -a` で何も出てこない  
DockerDesktop 起動できない

調査目的で入れたimageはどうなろうと、必要ならもう1回落とせばいいんですが、Jenkins調査して、具合がよかったのでlocalのCIに継続使用してたのです。
Jenkinsの各jobはWebUIでポチポチ編集してできあがったやつなので、作ったときの覚え書きから再生はできるはずだけど、面倒くさい。

## 調査

masuda  10:17
> まちがってUnistallはいくらなんでもやらかさないだろう。Update失敗したのかな？

```
3/17
[13:55:06.712] [InstallWorkflow-DownloadStep] Download completed successfully
[13:55:06.716] [InstallWorkflow] Uninstalling previous version in update mode
```

3/17～3/25の間は開発っぽい仕事じゃなかったから、DockerDestopもJenkinsも使わなかったのはありうるなあ

## 対処

masuda  10:29  
"C:\Users\XXXX\AppData\Local\Docker\install-log.10.txt"

```
[13:42:58.119] [InstallWorkflow] Using package: https://download.docker.com/win/stable/43472/Docker Desktop Installer.exe
```
 これをもう1回downloadして実行してみる。


masuda  10:46
> 復旧した。ホッ。

- DockerDestop起動可能
- `docker ps -a` で既知のコンテナが見える
- `docker start ...` でjob設定済みJenkinsが起動した

## 推測

Updateに失敗した時刻は、すぐ後にSkypeオンライン会議の予定があった。
Skypeの帯域確保のためにVPN接続を切断したときにおかしくなったのかも。
2020-04時点は、WorkFromHomeのために、VPNの接続・切断する機会が増えている。そのときたまたまDockerDesktopがupdateingだと失敗するのかも。DockerDesktopのログを確認しましょう。
PHPで初めてのWebアプリケーション開発　備忘録1

#主旨
PHPを使ったWebアプリケーションの開発知識が必要になったので、開発過程の備忘録、知識のインプット・アウトプットをする。
機能実装の過程や、エラーが起きたときの解決方法を中心に共有していきたいと考えている。

##筆者のスペック
Progateで基礎学習をしたことがある程度。Railsでtwitterクロームをデプロイしたことがある。

##学習手段
「独習　PHP 第３版」「Laravel 入門」「Laravel　実践開発」の書籍が手元にある。
あとはひたすらググる予定


##開発環境
- PHP 7.3.11
- HTML/CSS
- macOS Catalina 10.15.3
- MySQL
- Editer:Atom

##目標物
スケジュール・出欠管理アプリ

##アプリ制作の経緯
社会人サッカーチームに所属しており、情報共有に以下の3つのツールを使っている。

- Line
- スケジュール管理
- 監督が選評を書く掲示板

出欠登録と事前の連絡が別のツールで行われていて面倒なので、
この機能を一つのWebアプリケーションにまとめたい。


##実装したい機能（暫定）
- 投稿機能(掲示板)
- ユーザー機能（新規登録・ログイン・ログアウト機能）
- スケジュールの追加、編集、削除
- 予定への出欠確認機能（出席、欠席、未定、未回答の表示）
- レスポンシブデザイン

##おわりに
アウトプットを通して理解を深めると共に、PHPを用いたWebアプリケーションの開発者や、初学者の人と知識を共有できたら嬉しい。
Pythonで毎日AtCoder #51

### はじめに
[前回](https://qiita.com/taxfree_python/items/97beb6dcf75554acc0e2)

### #51
[問題](https://atcoder.jp/contests/abc164/tasks/abc164_d)

**考えたこと**
本番では、$i,j$を全探索してTLEしました。計算量は$O((2*10^5)^{2})$となります。この問題の制約だと、$O(N)$くらいに抑えないと通りません。

十進数で表記されている数字は$a_i*10^n+a_{i-1}*10^{n-1} \cdots a_0 * 10^0$と表すことができます。長さ$N$の文字列$S$を右から$i$番目で分けたときの文字列を$S_i$とすると$S_i$は$S_0 + S_1 * 10 ^ 1 \cdots S_i * 10 ^ {N-i}$と表せます。飛び飛びで文字を分けて結合することはできないので、$S$の$i,j,i<j$の区間の文字列$S_{i-j}$は$S_{i-j} = \frac{S_{j}-S_{i}}{10^i}$と書けます。ここで、$2019,10^i$は互いに素(最大公約数が1)です。よって、$S_{i-j}$が2019の倍数であるかの判定は前の式の分母($\frac{S_{j}-S_{i}}{10^i}$)が2019の倍数であることの判定と同値です。また、2019で割った余りが同じ異なる2数どうしを引き算すれば2019で割り切れる数になります。ですので、それぞれ$i$の$S_{i} mod(2019)$を記録します。私は、余りを記録するlistを作る時に躓きました。2019で割った余り$m$は当然$0 \leq m < 2019$になりますが、余り0の時だけは$S_i$だけで2019の倍数になれます。なので、余りを記録するlistの余り0の項は最初に+1しておきます。この+1は長さ0の文字列があって、余り0のときは長さ0の文字列とペア→単体で2019の倍数となるような気持ちです。組み合わせを計算する式は、${}_n C _2$を変形して$n\*(n-1)$となります。

```python
s = input()

t, a = 0, 1
mod = [0]*2019
mod[0] = 1 #最初の要素(余り0)は+1
s = s[::-1] #後ろから調べた方が位取りしやすいのでreverse
n = len(s)
for i in range(n):
    t += int(s[i]) * a
    t %= 2019
    a *= 10
    a %= 2019 #互いに素なので%2019を計算しても答えtは変わらない
    mod[t] += 1
ans = 0

for i in range(2019):
    ans += mod[i]*(mod[i]-1)//2 #組み合わせの計算
print(ans)
```
t, a = 0, 1って別の行に書いたほうがいい? PEP8で探せなった。

### まとめ
本番に解きたかった。今週は最高に幸せなことにABCが二回あるので入茶します。ではまた。
Amplify CLIがamplify: command not foundで進まない件

#結論:PATHが通ってませんでした

この記事はamplify -vとかしても

amplify: command not found

と出てしまう人向けです。

まずは

```
npm config get prefix
```

でnpmモジュールのインストール先を確認します。
ここでは /Users/hogehoge/.global とします。
次に

```
echo $PATH
```

として、その中に先程のパスが含まれているか確認。多分含まれていないはず。

あとは

```
export PATH=$HOME/.global:$PATH
```

としてパスを追加。
これでnpmでインストールしたモジュールまでパスが通ったので
amplifyのコマンドが通るようになります。

ここまでではコンソール閉じたら消えるので、exportの文をbash_profileに記述すればあとはオッケーです。
【解決】npmでインストールしようとしたらsymlinkに関するエラーが出た

hubotを作る際に、yo hubotコマンドを実行したところ
以下を含むエラーが出た。

```
 EPROTO: protocol error, symlink '../mime/cli.js' -> '/home/vagrant/workspace/nanyakanya/node_modules/.bin/mime'
```

解決方法は2つ。

①Vagrantfileの編集
Symbolic Links With Vagrant Windows
https://www.rudylee.com/blog/2014/10/27/symbolic-links-with-vagrant-windows/

```
config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end
```

で共有ファイルに関する制限を解除

②vagrant up するコマンドプロンプトを管理者権限で起動
管理者権限ならsymlinkを作れるようになるらしい
Cortex-M3以上でN == 2^n判定とビット列反転

気分転換になんの気無しに彷徨ってて見つけた記事。
[FFT: ビット列反転インデックス - Qiita](https://qiita.com/ikiuo/items/b0ea275368b2e326b35d)
面白そうなのでやってみた。

Cortex-M3以上なら動くはず(未実装のコアで使おうとするとソフトウェア実装が呼ばれるのでかなり遅くなる)。

## N == 2^nの判定

CLZ命令(Count Leading Zeros Cortex)で一番上のセットされたビットを探せる。
0x8000'0000を右シフトしてNと比較、あるいはNを左シフトして0x8000'0000と比較、で判断できる。

```c++
const bool a = N == (0x8000'0000 >> __CLZ(N));
const bool b = 0x8000'0000 == (N << __CLZ(N));
```

即値をシフトする分前者が有利?
アセンブリで書くならもうちょっといいやり方がありそう。

## ビット列反転

__RBIT命令で32bit内の上下反転ができる。
__CLZ(N - 1)で右シフトすべき量が得られる。

```c++
const int K = __CLZ(N - 1);

for (uint32_t i = 0; i < N; i++)
{
    const uint32_t ri = __RBIT(i) >> K;
}
```

## 感想

ビット演算命令つよい

そういえば、CMSISのFFTライブラリでビットリバーサルしないモードってのがあって、何に使うんだろうと思ってたけど、こういうのを組み合わせて使えばいいわけか。`LUT[i]`でアドレスを変換するより、`__RBIT(i) >> K`のほうが早そうな気もする? でもビットリバーサルしないモード使うなら定数で指定しそう。

## おまじない

まちがってたらごめんね
AtCoderBeginnerContest164復習＆まとめ（前半）

# AtCoder ABC164
2020-04-26(日)に行われたAtCoderBeginnerContest164の問題をA問題から順に考察も踏まえてまとめたものとなります．
前半ではABCまでの問題を扱います．
問題は引用して記載していますが，詳しくはコンテストページの方で確認してください．
[コンテストページはこちら](https://atcoder.jp/contests/abc164)
[公式解説PDF](https://img.atcoder.jp/abc164/editorial.pdf)

## A問題　Sheep and Wolves
> 問題文
> 羊が$S$匹、狼が$W$匹います。
> 狼の数が羊の数以上のとき、羊は狼に襲われてしまいます。
> 羊が狼に襲われるなら"unsafe"、襲われないなら"safe"を出力してください。

if文使えば終わりです．
他にあまり書くことないのですがあえて少し書くのであれば，本来襲われる条件が「**以上**」を使って書いてあるのでそのままコード書けばいいのですが，過去に比較演算子を「=<」と書いて事故った経験から，以上や以下を意識的に避けて書くことが多いです．正しくは「<=」です．
コロナで大学始まらず，SNSでは新入生の中で人狼などが流行っているので，人狼っぽい問題を作ったのか，元から好きなのかはわかりませんが，"Yes" or "No"の問題が個人的には好きです（スペルミスとか，大文字小文字とかすごく気を遣う）．

```python:abc164a.py
s, w = map(int, input().split())
if s > w:
    print("safe")
else:
    print("unsafe")
```

## B問題　Battle
> 問題文
> 高橋君と青木君がモンスターを闘わせます。
> 高橋君のモンスターは体力が$A$で攻撃力が$B$です。 
> 青木君のモンスターは体力が$C$で攻撃力が$D$です。
> 高橋君→青木君→高橋君→青木君→... の順に攻撃を行います。攻撃とは、相手のモンスターの体力の値を自分のモンスターの攻撃力のぶんだけ減らすことをいいます。このことをどちらかのモンスターの体力が0以下になるまで続けたとき、先に自分のモンスターの体力が0以下になった方の負け、そうでない方の勝ちです。
> 高橋君が勝つなら"Yes"、負けるなら"No"を出力してください。

とりあえず自分の提出したコードをまず載せます．

追記 : Pythonはwhileに()が不要なので，`while True:` と書くことができますが，自分は他の言語の癖で()を付けたまま書いてしまうことが多いです（汗）

```python:abc164b.py
a, b, c, d = map(int, input().split())
while(True):
    c = c - b
    if c <= 0:
        print("Yes")
        break
    a = a - d
    if a <= 0:
        print("No")
        break
```

もちろん，$A$と$C$の体力がものすごく大きい場合があるなら，ループなんかしてられないけど，今回の問題の制約が100以下の整数だったから，迷わず問題文通りのコードを書きました．
Twitter上でいろいろ言われてるけど，後悔はしてないです（ミスってWAなること考えたら）．
もちろん，以下のようなコードが頭をよぎったので，コンテスト終わった後に書き直しました．

```python:abc164b.py
a, b, c, d = map(int, input().split())
if (c + b - 1) // b <= ( a + d - 1) // d:
    print("Yes")
else:
    print("No")
```

多少面倒なのは，小数点以下を切り上げる必要があるので，計算式が多少頭使うことになることだけど，~~このあたりは本番で書くならmathモジュールにあるceil使う方が安全かな~~．

追記：@DaikiSuyama さんからコメントいただいた通り，ceil関数は誤差が生じる可能性があるようなので，使わない方が無難のようです．
式が複雑にならなくていいなと思い「**安全かな**」と書いてしまいましたが安全じゃありませんでした．
今回の問題は通ること確認してありますが，[ABC046C](https://atcoder.jp/contests/abc046/tasks/arc062_a)では誤差によって通らなかったことを教えていただきました．
こういうコメントは，本当に参考になりますね．
@DaikiSuyama さん，ありがとうございました．
自分もきちんと過去問を解き直さないとですね．

```python:abc164b.py
import math
a, b, c, d = map(int, input().split())
if math.ceil(c / b) <= math.ceil(a / d):
    print("Yes")
else:
    print("No")
``` 



## C問題　gacha
> 問題文
> くじ引きを$N$回行い、$i$回目には種類が文字列$S_i$で表される景品を手に入れました。
> 何種類の景品を手に入れましたか？

辞書型使えば終わりです．
このあたりは，自然言語処理で使いまくってるのでラッキーでした．
pythonはlen使えば，listだけでなく，dictの中にあるkeyの数返してくれるの本当に便利．
普段，単語の出現頻度数えるときは

```python:
word_dict = {}
for word in word_list:
    if word in word_dict
        word_dict[word] += 1
    else:
        word_dict[word] = 1
```
みたいに書くけど，今回の問題は回数使わないから楽に書けた．

追記：今回自分はdict使っていますが，公式の解説にもある通り，setやmapなどでも実装が可能です．

```python:abc161c.py
n = int(input())
dict_s = {}
for i in range(0, n):
    s = input()
    dict_s[s] = 1
print(len(dict_s))
```


前半はここまでとなります．
後半はDEF問題の解説となります．
今回のコンテストはABCまで解いた後，行き詰まり，試行錯誤しましたが結局"AC"は出ずに終わってしまい，C問題までの短距離走の速さ比べになってしまい反省しています．
やっぱり，難しい問題を一問くらいは通して，徒競走から抜け出したいと思っています．
とりあえず前半の最後まで読んでいただきありがとうございました．
[後半に続く](https://qiita.com/takaito0423/items/2c2ac6de6e89b652110b)．
NextCloudをWindows10でネットワークマウント(WebDAV)

# NextCloudをWindows10でネットワークマウント(WebDAV)

NetxtCloudをWindows10にて、ネットワークマウント(WebDAV)するための設定をやってみました。
エクスプローラでPCを開き、エクスプローラの右上の下矢印を押すと以下のようなメニューが出力されます。
出力されたメニューの中から「ネットワークの場所の追加」を押します。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/WebDAV/webdav001.png" width="640">

「ネットワークの場所の追加」ウィザード起動するので、「次へ」をクリックします。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/WebDAV/webdav002.png" width="640">

次の画面で「カスタムのネットワークの場所を選択」を選択し、「次へ」をクリックします。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/WebDAV/webdav003.png" width="640">



NextCloudのWeb画面にアクセスし、設定を押すと下部にWebDAVのURLが出力されるので、コピーしておきます。



<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/WebDAV/webdav004.png" width="240">

次の画面で「インターネットまたはネットワークのアドレス」に先ほどコピーしておいたURLを貼り付け、「次へ」をクリックします。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/WebDAV/webdav005.png" width="640">

次の画面で名前を入力し(デフォルトでドメイン名が入力されています)、「次へ」をクリックします。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/WebDAV/webdav006.png" width="640">

次の画面で名前が表示されたら、「完了」をクリックします。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/WebDAV/webdav007.png" width="640">

そうするとユーザ、パスワード認証画面が出力され入力するとWebDAV接続され、ネットワークの場所に追加されます。

<img src="https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/WebDAV/webdav008.png" width="640">
DjangoのURL設定

# はじめに

ここでは、djangoのURLに関する設定について解説していきます。


# プロジェクトのurls.pyの設定

まず、プロジェクトディレクトリ下の`urls.py`を以下のように編集します。

```python:プロジェクト名/urls.py
from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('アプリケーション名.urls')),
]
```

`admin/`となっているところは、管理画面へのURLを示しています。
その他のページについては、アプリケーションディレクトリ下の`urls.py`に記載するという意味で、`include`を使っています。


# アプリケーションのurls.pyの設定

アプリケーションディレクトリ下にも`urls.py`を作成します。
基本的には、`path(URL, view関数（またはクラス）, name=逆参照するときの名称)`といった形で`path`関数を記述します。

## クラスベースビューを用いる場合

```python:アプリケーション名/urls.py
from django.urls import path
from . import views


app_name = アプリケーション名

urlpatterns = [
    path('list/', views.SampleList.as_view(), name='app_list'),
    path('create/', views.SampleCreate.as_view(), name='app_create'),
    path('detail/<int:pk>', views.SampleDetail.as_view(), name='app_detail'),
    path('update/<int:pk>', views.SampleUpdate.as_view(), name='app_update'),
    path('delete/<int:pk>', views.SampleDelete.as_view(), name='app_delete'),
]

```
クラスでviewを指定する場合は、クラス名の後に`as_view`メソッドを書きます。

# 関数ベースビューを用いる場合

```python:アプリケーション名/urls.py
from django.urls import path
from . import views


app_name = アプリケーション名

urlpatterns = [
    path('list/', views.list_func, name='app_list'),
    path('create/', views.create_func, name='app_create'),
    path('detail/<int:pk>', views.detail_func, name='app_detail'),
    path('update/<int:pk>', views.update_func, name='app_update'),
    path('delete/<int:pk>', views.delete_func, name='app_delete'),
]

```


# まとめ

ここでは、djangoのURL関連の設定について解説しました。
次回はテンプレートについて取り上げる予定です。
異なるアカウントでGitHubにpushしてしまった時の対処法

仕事がリモートになり社用PCを持ち帰ったことで、休日も社用PCでgit操作をするようになったときに、やらかしてしまいました。
仕事中に、個人用のgitから会社用のgitに切り替えるのを忘れてしまい、push。
GitHub上で確認したところ、自分の個人アカウントが表示されていて赤面。

[こちらのサイト](https://qiita.com/nagito25/items/2463a677e46210c6a90f)を参考に、少し修正を加えて解決することができました。



## 解決方法

特定のAuthor名だけを指定して変更した方法。

```
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<変更前の名前>" ];
then
  GIT_AUTHOR_NAME="<変更後の名前>";
  GIT_AUTHOR_EMAIL="<変更後のメールアドレス>";
  GIT_COMMITTER_NAME="<変更後の名前>";
  GIT_COMMITTER_EMAIL="<変更後のメールアドレス>";
  git commit-tree "$@";
else
  git commit-tree "$@";
fi
' -- HEAD~3..HEAD
```

最後の行、`-- HEAD~3..HEAD`というのは、過去直近の3コミット分を修正する書き方です。
最初は対処を3つに絞って、変更が書き換えられてるか`git log`で確認しましょう。

その後、`-- HEAD~3..HEAD`の部分を適宜変更して修正したい範囲を広げましょう。
- すべて修正したい場合は、`-- HEAD`
- 特定のコミットから今までのコミットを修正したい場合は、` <コミットのSHA-1>...HEAD`

（`SHA-1`とは`f2666d52ad`のようなコミットIDのことです。）

git logでAuthor名が変更されていることを確認します。

その後、 `git push`して、GitHub上でもAuthorが書き換わっているか確認してみましょう。

## 注意点

最初に`WARNING:~~`と出ますが、特に気にしないで良さそうです。

[参考にした記事](https://qiita.com/nagito25/items/2463a677e46210c6a90f)では、スペースがあるとエラーになってしまうとありましたが、私の場合はスペース追加しなければずっと`syntax error`を吐き出されてしましました。
`syntax error`はが出た場合、エラー文をよく読んで指摘箇所の前後のスペースを疑ってみましょう。



## 備考

個人アカウントを晒してしまうというヤラカシを再発させないためにも、GitHub[アカウントを使い分ける方法](https://qiita.com/0084ken/items/f4a8b0fbff135a987fea)を確認しておきましょう。
Sequel ProでCSVファイルからテーブルをUPDATEしようとしてハマった

![header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/793216e9-21d0-22fd-8a79-3d64d855e42c.png)

# ハマったこと

[Sequel Pro](https://www.sequelpro.com/)でCSVファイルの中身をテーブルに`INSERT`しました。

`INSERT`だけじゃなくて`UPDATE`もできるのでは？

と思って、インポート画面でモードを`INSERT`から`UPDATE`にしたら、ボタンが無効化されてしまいました。

# 解決策

![step3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/b4178bc4-f021-b7fa-c461-e9ffeadb31f3.png)
![step4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/92df5240-b83c-c89e-abb6-656cc995af9f.png)
![step5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/71bd56a3-e2f9-093b-2599-b5c150096f4d.png)

上記のように、**`Match Filed`にする項目をクリックして設定する**と、ボタンが有効化されました。

# 余談

改行周りがおかしくなるときは、ファイルの選択画面で`Lines terminated by`を`\r\n`にしてやるといい感じです。

![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/a204a0c0-290f-3bd8-0867-486bdcb4d896.png)
![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502255/a468f2c6-7f47-d44c-7793-d1e4f9c955c5.png)

# 参考
- [Update some MySQL data from a CSV using Sequel Pro](https://youtu.be/FO1i7BgkT8o)
P5.js 日本語リファレンス(curveDetail)


このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の curveDetail関数を説明します。

## curveDetail()

### 説明文

曲線が表示される解像度を設定します。

デフォルト値は20で最小値は3です。

この関数はcreateCanvas()で WEBGL を指定した場合にのみ有効です。

### 構文

curveDetail(resolution)

### パラメタ

- resolution  
Number：曲線の解像度

### 例1

```javascript
function setup(){
   createCanvas(100, 100, WEBGL);
   curveDetail(8); // 曲線の描画を少し粗くする
}
function draw(){
   curve(250, 600, 0, -30, 40, 0, 30, 30, 0, -250, 600, 0);
}
```
### 実行結果
![curveDetail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/df88f9e5-f8fb-18d4-caa0-eb82b02daf87.png)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス
【Vue.js】v-forの中でrefを使用していて、要素を並べ替えたら、$refs配列の順番がずれた問題

以下のように  `v-for` の中で `ref` を使う場合、`this.$refs[n]` でオブジェクトを取得することができます。


```vue:

// HogeHogeというコンポーネントを使っていますが、
// nameというメソッドを呼ぶとvalueパラメータで与えられた
// オブジェクトのnameを返すものとします。
<template>
  <ul>
    <li v-for="(item, i) in items" :key="i">
      <hoge-hoge ref="hoge" :value="item" />
      <button @click="test(i)">{{ item.name}}</button>
    </li>
  </ul>
</template>

<script>
  data() {
    return {
      items: [
        { name: 'AAA' },
        { name: 'BBB' },
        { name: 'CCC' }
      ]
    }
  }.
  methods: {
    test(i) {
      console.log(this.$refs.hoge[i].name)
    }
  }
</script>
```

このコードを実行すると、３つのボタンが表示されます。
AAAというボタンをクリックするとAAAがコンソールログ出力され、BBBというボタンをクリックするとBBBが出力されます。

ここで、プログラムの中で `items` 配列の要素の順番を入れ替えてみます。

```javascript:
this.item = [
  { name: 'BBB' },
  { name: 'AAA' },
  { name: 'CCC' }
]
```

ボタンのラベルはこの配列の順番に表示されますが、ボタンをクリックすると、困ったことに異なるnameが出力されることがあります。

refはリアクティブではないため、オブジェクトを再利用する際に、$refsの配列の順番まで面倒を見てくれないのかも知れません。

仕方ないので、こんな感じでこの問題を回避してみました。

```vue:
<template>
  <ul>
    <li v-for="(item, i) in items" :key="i">
      <hoge-hoge ref="hoge" :value="item" :hoge-key="i" />  // hoge-keyを追加
      <button @click="test(i)">{{ item.name}}</button>
    </li>
  </ul>
</template>

<script>
  import _ from 'lodash'

  data() {
    return {
      items: [
        { name: 'AAA' },
        { name: 'BBB' },
        { name: 'CCC' }
      ]
    }
  }.
  methods: {
    test(i) {
      const hoge = _.find(this.$refs.hoge, (ref) => {
        return Number(_.get(ref, '$attrs.hoge-key', -1)) === i
      })
      if (hoge) {
        console.log(hoge.name)
      }
    }
  }
</script>
```

HogeHogeオブジェクトに、`hoge-key` というプロパティを追加して、インデックスの `i` を代入しておきます。

クリックイベントで、インデックス `i` を受け取り、`this.$refs.hoge` 配列の中から、`hoge-key` プロパティと `i` が一致するオブジェクトを探します。

`hoge-key` プロパティの値は、`$attrs.hoge-key` で取得できましたが、果たして`$attrs` は公式に使って良いプロパティなのか分からなかったので少々不安ではありますが、一応はこれで動いております。
P5.js 日本語リファレンス(curve)


このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の curve関数を説明します。

## curve()

### 説明文

中央の4つのパラメータとして指定された2点間に曲線を描画します。最初の2つのパラメータは、曲線が描画されていなくてもこの点からカーブが作成されたかのようにする制御点です。同様に最後の2つのパラメータは、曲線が描画されていなくてもこの点までカーブが作成されたかのようにする制御点です。

一連の curve() を組み合わせたり curveVertex() を使用したりすることでより長いカーブを作成できます。 curveTightness() と呼ばれる追加の関数は曲線の視覚的な品質を制御します。curve() は Catmull-Rom スプラインの実装です。

### 構文

curve(x1, y1, x2, y2, x3, y3, x4, y4)

curve(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4)

### パラメタ

- x1  
Number：開始制御点のx座標

- y1  
Number：開始制御点のy座標

- x2  
Number：最初の点のx座標

- y2  
Number：最初の点のy座標

- x3  
Number：2番目の点のx座標 

- y3  
Number：2番目の点のy座標

- x4  
Number：終了制御点のx座標

- y4  
Number：終了制御点のy座標

- z1  
Number：開始制御点のZ座標

- z2  
Number：最初の点のz座標

- z3  
Number：2番目の点のz座標

- z4  
Number：終了制御点のz座標

### 例

```javascript
function draw(){
  noFill();

  stroke(255, 0, 0);
  curve(10, 50, 150, 30, 220, 160, 280, 15);


  stroke(0, 0, 255); // 青色の設定
  circle(10, 50, 6); // 開始制御点の描画
  
  stroke(255, 200, 0); // オレンジ色の設定
  circle(150, 30, 6); // 最初の点

  stroke(0, 255, 255); // 水色の設定
  circle(220, 160, 6); // 2番めの点

  stroke(205, 255, 35); // 黃緑色の設定
  circle(280, 15, 6); // 終了制御点の描画  
}
```

### 実行結果
![curve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/d1aa9b03-d280-2ed0-5645-b8e768dd3c50.png)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
本当にあったやらかしDB設計②【囚人番号テーブル】

どうも、記事書くのにちょっとはまっちゃった人です

今日は[「本当にあったやらかしDB設計①【R無しRDB】」](https://qiita.com/bouitengineer12/items/ca7beb7ba83c3233d316)に続いてまたびっくりしたことを紹介します

#囚人番号テーブル
割とみんな使ってしまっているのではないでしょうか
どういうことかというと、「XXX001」「XXX002」「XXX003」のように**テーブル名に囚人番号を付けている**、ということです

###何が悪いの？？
皆さん、クラス名や関数名を付けるときに悩んだ経験はありませんか？
誤用を避けるためや可読性を向上させるためにも名前付けって大事ですよね
これは**<font color ="red">テーブル名にも同じことが言えます</font>**

自分の子どもが居るとして、**子どもの名前に「XXX001」って付けますか？？**
少なくとも何かしらの意味を持った名前にするんじゃないかなと思います
(もしくは好きな人の名前とか)

意味の無い名前ほど意味のわからないものは無いです(だって元々意味がないんだから…)

###問題
テーブル名を適当に付けるといろいろ厄介なことが起こります

- **テーブル名を見ても何のデータが入っているか全くわからない**
テーブル名を見ただけでもある程度は中身のデータまで想像できるようにするべきです

- **誤ったクエリーを書いてしまう**
特に囚人番号テーブルを使っていると似通ったテーブル名になってしまうことがあり、間違いの種になることがあります
他にも、クエリーを書くときにテーブルに別名を付けて書くときには「t1」、「t2」のような使い捨てのような名前ではなく、意味の伝わる言葉を使うべきです
別名はテーブル名の省略系として記述すべきであり、一番良いのは別名を付けなくてもクエリーだけで意味が伝わることです

- **データと関係の無い、無駄に難しい謎の命名規則が生まれてしまう**
これはかなり厄介な問題です
命名規則というのはわかりやすさのために考えることですが、囚人番号テーブルのような構造の命名規則を考えてしまうと逆効果になってしまいます
下手をするとテーブル名の桁溢れ、なんてことも起こります
テーブル名の命名規則はシンプルなものにするべきです

###原因
なぜこのようなことが起こってしまうのか、原因は単純です

**<font color = "red">数を数えて順番に並べようとしてしまっています</font>**


###解決方法

######テーブルをグループ分けしよう！
1. まずはどのようなデータが必要なのかを洗い出します
2. データをグループごとに分けます
(顧客、商品、注文などなど)
3. グループ内で適切にテーブル分けを行います
4. テーブル名をグループと紐づいた名前にします

これを行うことで、グループ別にテーブル名を決めることができ、テーブル名だけでどのグループに所属するどのようなデータなのかが非常にわかりやすくなります

この工程はエンティティの抽出、論理設計、物理設計、正規化と呼ばれる部分を簡単に並べたものです

でもなんかこれだけなら意外と簡単そうじゃないですか？
**<font color = "red">そう、実はDB設計ってそんなに複雑じゃないんです</font>**
もちろん、扱うデータによっては複雑になってしまうこともあるんですけど…

######テーブルの命名規則を変えない
は？どゆこと？解決方法じゃないの？？？ってなると思います
<font color = "red">残念ながら、既存の囚人番号テーブルに対する明確な解決策はほぼありません</font>

なぜかと言うと、囚人番号テーブルは根本的にDB設計が間違っていることがあるからです
データをグループ分けしていない、外部キーを適切に使っていない、正規化が中途半端、などなど…
データのグループ分けが正しくできていれば名前を変えるだけで良いのですが、**<font color = "red">それができていないから囚人番号テーブルになっているんです！！！</font>**

運よく「設計はちゃんとしてるけど命名規則だけが何か変」というパターンに当たることができれば解決できますが、それ以外のパターンだとテーブル構造から変えることになってしまうので中々現実的ではないんですよね

なので、開き直ってテーブルの命名規則は変えずに、中身ごと見直そう、というタイミングで設計しなおす他ありません

#まとめ
- 自分の子どもの名前を決めるように慎重にテーブル名を考えろ
- 関数名にはうるさい人はテーブル名にもうるさい人になれ
- いい加減な設計をするな

囚人番号テーブル、どれだけ罪深いか分かって頂けたでしょうか…
DBは一度設計してしまうと後から修正が効かないことが多々あります
最初の一発目、データが空っぽの状態で正しく設計をし、正しく命名することはめっちゃ重要なんです



- [本当にあったやらかしDB設計シリーズ一覧](https://qiita.com/bouitengineer12/items/e63e5f7d6f628da11362)
[WPF]左からスライドインするメニューバー

#こんな感じ
左からバーがスライドイン表示するよ。

![slidein2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374840/9f342c8b-28ea-132b-837c-1948f419c7c9.gif)

ソースは[ここ](https://github.com/TakadaTentaro/SlideInMenu)

#仕組み
WPFの`Window.Width`の値を大きくした時、Windowは右方向に伸びる。
バーをMainWindowとは別のWindowにして、`Width`を勢いよく増やしていけば、実用性はともかく、これはもうスライドインと言ってもいいのではなかろうか。

```cs:MenuWindow.xaml.cs
        // メインウィンドウ側から呼んでもらう、メニューバー表示用のメソッド
        public async void ShowSlideWindow(double left, double top, double ownerWidth)
        {
            this.Top = top;
            this.Left = left;
            this.Show();

            // スライドイン表示
            for (int i = 1; i < 15; i++)
            {
                var newValue = this.Width + 30 * (i - 0.7);
                if (newValue <= ownerWidth)
                {
                    this.Width = newValue;
                }
                else 
                {
                    break;
                }
                await Task.Delay(1);
            }
            this.Width = ownerWidth;
        }

```


本題とはあまり関係ありませんが、メニューバー以外の部分をクリックした時に、バーが消えてくれる動きが好きなので、WindowのDeactivatedイベントで`Close()`しています。


```cs:MenuWindow.xaml.cs
        private void Window_Deactivated(object sender, EventArgs e)
        {
            this.Close();
        }
```
東京オリンピックのエンブレムを遊びつくす!(4)〜ひし形充填の発展〜

#grasshopperで書くための工夫
grsshopperでひし形重点をしようとすると帯の扱いが難しそうですね。
前回話した通り、帯でひし形同士の関係を決めた後うまい感じに動かすなら、帯をうねうねやってうまい感じに正十二角形内に交点を配置する意味ってあるのかな〜ってなります。ないですね。この帯のグリッドとでも言うもののトポロジーが変わらなければひし形同士の関係は変わりません。つまり出来上がるひし形充填も同じと言うことです。と言うことは帯のグリッドは使い勝手がいいように変形していいと言うことです。
そこでgrasshopperで書きやすいように折れ線ではなく、直線で考えた帯を使っていきます。

#正十二角形以外は充填できないのか
結論から言うと、正偶数角形はひし形で充填できます。
物凄い雑な説明をすると、ひし形充填するのは帯が必要ですが、帯は型枠となる多角形に平行な2辺があればできます。正偶数角形は平行な2辺があるので帯ができ、ひし形充填もできると言うことです。逆の理由で正奇数角形はできません。
ただ充填と言っても様々あるようで、重なりを許す充填など充填の概念を拡張すればまた話が変わってくるようです。興味がある方はぜひ調べてみてください！

#次回
話が整理されてきたところで今回はここまで！幾何学の話も一旦終わりです！
次回はいよいよgrasshopperでひし形充填を描いていきます！
【Mac】MySQLの基本操作


■パッケージインストール
npm init --yes
npm install express ejs
npm install nodemon（"start": "./node_modules/.bin/nodemon app.js"）
npm install mysql


↓
jsファイルの編集

■サーバー起動
node app.js


■MySQLの繋げ方

brew services start mysql@5.7
mysql --user=root --password

■MySQLの接続解除
exit;


■データベース
SHOW databases;
CREATE DATABASE データベース名;

■テーブル
・データベースの選択
USE データベース名;

・テーブル一覧の確認
SHOW tables;

・テーブルの作成
CREATE TABLE テーブル名 (`id` int auto_increment, `name` text, primary key (id));

・テーブル構造の表示
DESCRIBE テーブル名;

・テーブル削除
DROP TABLE テーブル名;
DROP DATABASE テーブル名;
React + Reduxを学習し始めた初心者の成果物

#やったこと
React/Reduxを使って、時間/天気/ToDoリストを表示するウェブサイトを作成しました。
Chrome拡張機能の「Momentum」を意識して作ってみました。

これが[Momentum](https://chrome.google.com/webstore/detail/momentum/laookkfknpbbblfpciffpaejjkokdgca?hl=ja-JP)です。
新規タブを開くと、美しい背景写真と時間、Todoなどを表示してくれます。
今回は、美しい背景写真はないのですが、、、

今回、Todoリストを作成するにあたって、Reduxの公式HPを参考にしました。
[Basic Tutorial: Intro | Redux](https://redux.js.org/basics/basic-tutorial)

#成果物
![画面収録-2020-04-29-13.16.20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577071/1caa659b-6ea7-a02a-e5d8-3ff81d6a98c3.gif)

#経緯
React/Reduxを先週からUdemyで勉強し始めました。
なんとなく概念は理解できたので、実際に何か作ってみようと思い、開発に至りました。

[Udemy: React+Reduxを使用したモダンフロントエンド開発](https://www.udemy.com/course/react-redux-basic/?start=315)

#感想
Redux難しい！！！
Reactについては、比較的理解しやすかったのですが、Reduxに関しては、理解するのが大変でした。
QiitaでReduxの記事を書いてらっしゃる方も多くいらっしゃったので、参考にさせていただきましたが、なかなか大変でした。

どのjsファイルが何と結びついていて、どう機能しているのか理解できませんでした。
特に、Action、Reducerがそれぞれ何をしているのかなんてもうさっぱり、、、

#これから
今回、このウェブサイトを開発してみて、少しずつ理解が深まりましたが、これからもっと学習していきます。
React/Reduxに関しては、あまり日本語の文献が多くないように思えるので、学習コストが高そうです。

Reduxについて、おすすめの学習法などをご存知の方がいらっしゃいましたら、教えていただきたいです。

引き続き、よろしくお願いいたします。
Tera Term経由でemacsを使う場合に行がずれる問題

Tera Term経由でemacsを使っていると、ミニバッファのリサイズが起きて行方向の表示が崩れることがある。
たとえば、通常はこのように見えているのだけど…
![normal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575/3d1db758-d782-a491-2440-cc49c067c054.png)
何かの拍子にこんな感じになってしまう。
![abnormal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575/30b812d3-b386-4ec1-0c31-3fdac2ea8e74.png)
ちなみに上記は、4行めでFlycheckの警告が出ている `import` にカーソルを移動した結果、「`Data.Text`を`import`しているけどコード中では使われてないよ」というメッセージがミニバッファに表示されて、emacsがとち狂った様子。カーソル位置には`main`という文字列があるように見えるし、左端の行数表示も6を指しているが、実際にはここは1枚目のキャプチャにおける4行めの先頭であり、`import`がある。

考えられる原因は以下のような感じだろう。

* Tera Termの`TermType`と、サーバ側の環境変数`TERM`は一致しているか？
* Tera Termの`TerminalSize`と、サーバ側のttyが認識している画面の高さ（`stty -a`の結果）と、emacsが認識している画面の高さ（`(display-pixel-height)`の評価結果）はすべて一致しているか？

しかし、それぞれ調べてみても何も問題がないので、仕方なく「emacsのミニバッファの高さが変わらない」ように設定した（つまり、高さの最大値を`1`にした）。

```emacs-lisp
(setq max-mini-window-height 1)
```

これにより、ミニバッファのリサイズが原因で行がずれ、それにより表示が崩れることは回避できた。ちなみに、Flycheckはデフォルトではミニバッファに表示しきれない情報がある場合に新しいバッファを作るようだが、これだと行が崩れることはないので、やはり何らかの理由でミニバッファの高さ情報をうまく処理できていないらしい。
![renormal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575/46b40c91-2d43-ec19-47b8-171bd3712a6b.png)

この回避方法だと、当然、ミニバッファのリサイズ以外の原因で起こる行ズレには耐えられない。Tera Termとemacsの間で根本的に何が起きているのか知っている方がいたら教えてください。
[Rails] コールバックについて

# 対象読書
コールバックって何？という方

# コールバックとは
> 
コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。コールバックを利用することで、Active Recordオブジェクトが作成/保存/更新/削除/検証/データベースからの読み込み、などのイベント発生時に常に実行されるコードを書くことができます。

[引用：Active Record コールバック](https://railsguides.jp/active_record_callbacks.html)

個人の解釈としては、例えば、ある商品に対してコメントする際に、createアクションが動くけど、このcreateアクションの前後で何か一手間加えたいな、って思った時にこの”前後”の一手間のこと

![alt](https://i.gyazo.com/63f20e2e79095d2275556252a41ea757.png)

# 利用可能なコールバック
Active Recordで利用可能なコールバックの一覧です。

## オブジェクトの作成
before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save
after_commit/after_rollback

## オブジェクトの更新
before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save
after_commit/after_rollback

## オブジェクトのdestroy
before_destroy
around_destroy
after_destroy
after_commit/after_rollback

##コールバックの実行（trigger）
create
destroy
save
update
valid?　など

# 例えば

実用的でないですが、例として
ユーザーが投稿(comment)を行ったら、commentsテーブルのtextカラムに保存されるデータの最後に「！！」を自動で追加するというコードは以下の通り。

```ruby
class Post < ApplicationRecord
  before_create :change_comment

  def change_comment
    self.text = text + "！！"
  end
end
```

comments_controller.rbでのcreateアクション内で、createトリガーが発火した時にchange_commentのコールバックが呼ばれ、結果として"!!" が付与されてDBに登録(INSERT)される仕組みです。
（self.textとしているのは、セッターメソッドだからです。）
MAMPを使ったWordpressでのWEB制作方法6　初心者向け

#MAMPを使ったWordpressでのWEB制作方法6　初心者向け

前回の記事はこちら
[MAMPを使ったWordpressでのWEB制作方法5　初心者向け](https://qiita.com/fumiya0414/items/f9a42a1957d89a3a4d18)

#リンク（aタグ）の置き換え

今度はヘッダーのリンク（aタグ）を置き換えます。
グローバルナビとなっているヘッダー部分で説明します。

```html:header.html
    <nav id="header"><!--headerstart-->
      <h1><a href="index.html">"CORPORATE_SAMPLE_SITE"</a></h1>
      <div id="menu">
        <ul>
          <li class="home"><a href="index.html">ホーム</a></li>
          <li><a href="service.html">事業内容</a></li>
          <li><a href="company.html">会社概要</a></li>
          <li><a href="archive.html">お知らせ</a></li>
          <li><a href="single.html">ブログ</a></li>                
          <li><a href="contact.html">お問い合わせ</a></li>
        </ul>
      </div>
    </nav><!--headerend-->
```

ここでは６つのページへのリンクを貼ってあります。
これを以下のように書き換えてください。

```html:header.html
　　<!--書き換え前-->
    <nav id="header"><!--headerstart-->
      <h1><a href="index.html">"CORPORATE_SAMPLE_SITE"</a></h1>
      <div id="menu">
        <ul>
          <li class="home"><a href="index.html">ホーム</a></li>
          <li><a href="service.html">事業内容</a></li>
          <li><a href="company.html">会社概要</a></li>
          <li><a href="archive.html">お知らせ</a></li>
          <li><a href="single.html">ブログ</a></li>                
          <li><a href="contact.html">お問い合わせ</a></li>
        </ul>
      </div>
    </nav><!--headerend-->

　<!--書き換え後-->
   <nav id="header"><!--headerstart-->
     <h1><a href="<?php echo get_stylesheet_uri(); ?>index">"CORPORATE_SAMPLE_SITE"</a></h1>
      <div id="menu">
        <ul>
          <li class="home"><a href="<?php home_url(); ?>">ホーム</a></li>
          <li><a href="<?php home_url(); ?>service">事業内容</a></li>
          <li><a href="<?php home_url(); ?>company">会社概要</a></li>
          <li><a href="<?php home_url(); ?>archive">お知らせ</a></li>
          <li><a href="<?php home_url(); ?>archive">ブログ</a></li>                
          <li><a href="<?php home_url(); ?>contact">お問い合わせ</a></li>
        </ul>
      </div>
    </nav><!--headerend-->

```

wordpressタグの  <?php home_url(); ?>  を使用して各リンクを書き換えます。
.htmlの拡張子は不要なので削除します。
※お知らせとブログは一覧ページへのリンクにするためarchiveに書き換えています。
同様にindex.phpやsidebar.phpなどのリンクも修正しておきましょう。
※リンク先はまだ作成していないので白紙の画面に飛んでいます。

次回は固定（事業内容・会社概要）ページの設定です。

[MAMPを使ったWordpressでのWEB制作方法7　初心者向け](https://qiita.com/fumiya0414/items/5b035482bed053d845e4)