OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミングを始めて約３ヶ月の進捗状況

4月下旬にプログラミングというものを始めてそろそろ3ヶ月が経とうとしていますが、自分の技術、知識がどれほどついたのかを数年後に確認したいため、ここにまとめておきます。

おそらくこれからプログラミングを始めたい方、始めて1ヶ月目くらいの方には参考になるかもしれないので指標として温かい目でご覧ください。

#始めた頃の状況

・そもそもパソコンも初心者だったのでタイピングバカ遅い（寿司打お得にできなかった）
・Pythonは言語の名前しか知らない、Hello worldさえわからない。
・マークアップ言語も全く書けなかった
・コンピューターサイエンスの知識皆無

完全に右も左も分からないような状況でした。

#今の状況

・htmlの基礎は結構理解してきた
・PHPの基礎ちょっと理解した
・JavaScripの基礎ちょっと理解した
・Pythonの基礎結構理解してきた
・機械学習の初歩理解してきた
・データサイエンスの意味合い理解してきた
・データサイエンスの数学めっちゃ勉強中
・AIについての勉強中
・G検定の勉強中
・kaggle挑戦中
・Atcoder挑戦中
・簡単なWebスクレイピングができる
[【コピペでできる】PythonでWebスクレイピング](https://qiita.com/hayato_8810xxx/items/b357f19317727a5d10ae)
・Pythonで簡単なブラックジャックが作れる
[Pythonで簡単なブラックジャックを作ってみた](https://qiita.com/hayato_8810xxx/items/f02e68ec1ac0933b4e8e)

#まとめ

こんな感じで毎日やっております。

最初の方はやりすぎて病みかけてゴールデンウィークはほぼ触っていないような状況でしたが意外と進んだ気がします。

この記事のようなメモ的なやつも定期的に上げていこうと思うのでまた１ヶ月後お楽しみに。
GitHubでOSSにコミットしたい

社内のGitHub Enterpriseは使ったことがあったのですが、
OSSにコミットするのは初めてだったので、手順をまとめてみました。

自分がコミットしたのはblikiの日本語訳([bliki-ja](https://github.com/bliki-ja/bliki-ja.github.io))で、記事をひとつ翻訳しました。


## お目当てのリポジトリをフォークする

右上の「Fork」ボタンを押すだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/c769a01e-15d4-a712-7748-f8b7540ae2f4.png)


フォークしたリポジトリのページが表示されるはずなので、ここをクリックしてURLを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/29553cbc-96d0-fbad-1400-db5211069d19.png)

## ローカルにGit Clone

ここからは基本的にはEnterpriseと同じです。

```bash

git clone https://github.com/ko-flavor/bliki-ja.github.io.git ./bliki-ja
```

変更してプッシュ

## プルリクエスト作成

リモートにプッシュすると、自動的にPRを作成するボタンが表示されます。Enterpriseと同じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/ff7ca1f7-5f62-ca96-8648-6cce24571cd0.png)

ぽちと押すと、PRを作れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/ebc0210f-845a-c5d3-a2e2-115048d7155e.png)

この図のようにフォークした自分のリポジトリからもとのリポジトリに向き先が向いていればOKです。
PRを作り、あとはレビューやマージを待ちましょう。


## 雑感

- 思ったより複雑じゃなくてよかった、、というかEnterpriseとほとんど同じですね。
- 今回は省略しちゃいましたが、リモートからfetchしたいときなどはupstreamとして元のリポジトリも登録する必要があるようです。
    - つまり、今回のやつは自分がforkする～コミット完了までコミットが無い前提だったりします。
- ちなみに、翻訳したぺージはこちらです([DDDにおける集約](https://bliki-ja.github.io/DDD_Aggregate/))。よかったら見てみてください。
Jest で new Date() をモック化する

JavaScript でアプリケーション開発をしていく際に、日付をつかさどる `Date` オブジェクトを使うことがちょくちょくあると思います。[^1]

`Date.now` のようなメソッドをモック化することはとても簡単で、単に `jest.fn()` で置き換えてしまえばよいです。

```javascript
Date.now = jest.fn(() => 1482363367071);
```

公式ドキュメントにもやり方が記載されています↓↓↓
[2. Tests should be deterministic](https://jestjs.io/docs/ja/snapshot-testing#2-tests-should-be-deterministic)

しかし、`Date` は実行時によって値が変わってしまいますので、ちょっとテストではそのまま使うのは難しく、できれば `Date` をモック化して同じ時間を返してくれると色々都合が良いです。

[^1]: もちろん [moment](https://momentjs.com/) や [dayjs](https://day.js.org/) を使う場合は本記事は関係ないです。

## サンプルコード[^2]

まずはテスト対象ファイルのコードです。

```javascript:datetime.js
const getTimestamp = () => new Date().getTime()
module.exports = getTimestamp
```

シンプルに `Date` オブジェクトのインスタンスを生成し、`getTime()` メソッドを実行してメソッド実行時のミリ秒を取得しています。そもそもこのメソッドならテストする必要なくない？という議論はあると思いますが、サンプルですのでご了承いただけると… :bow:

次に、こちらのファイルをテストするテストコードです。

```javascript:datetime.test.js
import getTimestamp from './datetime'

const mockDate = new Date(1594374371110)
const spy = jest.spyOn(global, "Date")
                .mockImplementation(() => mockDate)
test('get timestamp', () => {
  const actual = getTimestamp()
  const expected = 1594374371110

  // ここはなくても良い
  expect(spy).toHaveBeenCalled()
  expect(actual).toBe(expected)

  // 初期化も忘れずに
  spy.mockReset()
  spy.mockRestore()
})
```

## 解説

一言で言ってしまうと、__`spyOn()` メソッドを使った__ だけです。[公式ドキュメントの `spyOn()` メソッド](https://jestjs.io/docs/ja/jest-object#jestspyonobject-methodname)の説明を見た時「まさにこれやん」と思いました。

[^2]: 今回のデモの環境については割愛します。[Jest の公式ドキュメントのチュートリアル](https://jestjs.io/docs/en/getting-started)通りに作成しました。

本記事の肝はこの３行ですね。説明のため、一部改行しています。

```javascript
// ①
const mockDate = new Date(1594374371110)
const spy =
  // ②
  jest.spyOn(global, "Date")
      // ③
      .mockImplementation(() => mockDate)
```

①で `Date` オブジェクトのインスタンスを、モック用の固定した日付とセットで生成します。

②で `spyOn` メソッドを使い、グローバルオブジェクトの `Date()` メソッドに `spyOn()` メソッドでスパイするように設定しています。

③が最も重要な処理です。ここではスパイした後 `mockImplementation()` メソッドでレスポンスを指定しています。この処理がないと、`new Date()` を実行した場合のレスポンスは `mockConstructor` というモックオブジェクトになってしまい、`getTime()` メソッドが存在しない、というエラーが発生してしまいます。

ちなみにレスポンスを `spy` という変数に格納していますが、ここはなくても良いですが、私は `spy` 系のメソッドを使うならちゃんとコールされているよね？と言うことも確認したいため、受け取っています。

この処理により、datetime.js の `getTimestamp()` メソッド内で行っている `new Date()` は必ず同じ時間でインスタンスが生成されるようになります。誰かの参考になれば。

ではでは(=ﾟωﾟ)ﾉ

__P.S.__

ちなみに以下の記事にもあるように `jest-date-mock` というモジュールを使うという `Ultimate Solution` もありますので、参考までに添付します。

[JS の Date をテスト時にモックしたい（jest-date-mock の紹介）](https://qiita.com/hey_cube/items/30e3301b6edcfa94f378)
[AWS]S3でReact.jsを超爆速簡易型Webホスティングする

Reactを勉強中、それとなくおもしろおかしいWebページをスクラッチで作成することができたので、メンバーに~~自慢~~公開した。

今までメンバーに~~自慢~~公開する際には、Heroku、GitHub ioなどを使用していたが、S3で爆速にできることが判明したので備忘録として残す。

# はじめに
ドメインとの紐付けやSSL対応などは実施しておりません。
なので公開する際には十分に気をつけてください。

# ReactPjの準備
[公式ドキュメント](https://ja.reactjs.org/tutorial/tutorial.html)参照。

```
$ npx create-react-app my-app
$ cd my-app/
$ yarn build
```

# S3で公開するデプロイようのバケットを作成
S3のコンソールから「バケットを作成する」を押下。
![スクリーンショット 2020-07-12 0.04.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/6083a67b-88a1-39b1-8626-364bf593ffa3.png)

バケット名は任意の値を入力。
※ Route53の独自ドメインを割り当てたい場合は、ドメイン名と同じ値を入力すること。
　ドメイン名はアカウント関係なく、プライマリーなので。。。

リージョンは思いがなければ「アジアパシフィック（東京）」を選択。
![スクリーンショット 2020-07-12 0.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/31348d01-5fd5-2a4d-11e6-78932a7c7c18.png)

入力したら「次へ」を押下。
オプションの設定は特に行わないので、さらに「次へ」を押下。
![スクリーンショット 2020-07-12 0.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/12e0bacf-888f-5d5d-37c3-0f573b5b94a2.png)

「パブリックアクセスをすべてブロック」のチェックボックスを外す。
![スクリーンショット 2020-07-12 0.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/543ce7c3-6571-97e0-ea39-38b89c640eb2.png)

「次へ」を押下し、問題がなければ「バケットを作成」を押下
![スクリーンショット 2020-07-12 0.12.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/95f4af79-e552-90af-4467-288cb4aed9f9.png)

バケットの作成は完了。

# S3の設定を変更
先ほど作成したバケットの「プロパティ」を選択。
![スクリーンショット 2020-07-12 0.18.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/3a8c409b-28ca-7b6e-a408-17970c84f49a.png)


Static website hostingを選択し、「このバケットを使用してウェブサイトをホストする」を押下。
インデックスドキュメントに「index.html」と入力し「保存」を押下。
![スクリーンショット 2020-07-12 0.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/f4f29e64-621e-c7b9-c2f7-4a67d31a91c9.png)

次に、「アクセス権限」を選択し、バケットポリシーを押下。
バケットポリシーには下記文字列を入力する。
[BucketName]には今回作成したバケット名を入力すること。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[BucketName]/*"
        }
    ]
}
```
![スクリーンショット 2020-07-12 0.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/e61ed706-84d7-8087-3fba-9aa268893250.png)
「保存」を押下したら、S3バケットの設定は完了。

# ソースコードをアップロード
AWS CLIでやった方がかっこいいけど、手動で。
先ほど作成したReactPJの配下に「build」というディレクトリができているので、開く。

そして、配下のファイルを一括選択して、S3の「概要」めがけてドラッグ&ドロップ。
![スクリーンショット 2020-07-12 0.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/b3abfc2f-40a7-6a0a-8803-6fe593f338c2.png)
そしてアップロード。
![スクリーンショット 2020-07-12 0.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/541af5c6-e597-1899-b5c8-44e8e5a9d6aa.png)

これで、完了。

# 確認
StaticWebsiteHostingに記載のあるエンドポイントのURLにアクセス。
http://[BucketName].s3-website-ap-northeast-1.amazonaws.com/
でも可。
![スクリーンショット 2020-07-12 0.34.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/79acc33d-1d04-4cfa-4473-48034a827cd2.png)
無事ブラウザで表示。

# まとめ

身内で公開してキャッキャうふふするのであればこれでOKかな？と思う。
次は独自ドメイン化してみようかな。
初心者に伝えたい独学勉強の失敗と教訓

## 〜宣伝〜

:::note info
個人開発でエンジニア専門マッチングサービスを開発しましたので、是非未経験からエンジニア目指している人！現役エンジニアで教えたい人！使ってみてください！

β版リリース記念キャンペーン中です！

10名様限定、抽選でお好きな技術本1冊プレゼント！
🎉当選者にはメッセージ差し上げます(送付の際に住所はお聞きしません)
詳しくはこちらから↓

https://x.com/dokupro01/status/1796837336145436846
:::
https://dokupro.dev/

# 目的

- システム開発の前段階にいらっしゃるプログラミング初心者の皆さんの悩みの解決になるかと思い一年弱独学で学んだ時の失敗と教訓をまとめます。
- ※あくまで自分の経験と考えです。方法を強要するものではありません。

# 失敗と教訓

### その１ エラー

##### 失敗

1. エラーが出てしまった→「英語よくわからないし、エラー文をコピーして検索しよう！！」

##### 教訓

1. エラー文を丸々コピーしての検索は最終手段だと考えておきましょう。英語が分からなくてもエラー文を翻訳し、目の前のエラーがどんな物なのか知りましょう。

##### 教訓についての解説

1. エラーメッセージには問題解決の方法が直接記載されている場合が結構あります。
1. 目の前のエラーメッセージを見ただけで問題が解決するなら時間的にも精神的にもコストをかけずに済みます。
1. 勉強の初期状態であまり知識がない状態でエラーメッセージで検索をすると余計に時間がかかってしまったり、問題を解決できず諦めてしまう可能性もあります。
1. 仮に検索にヒットした技術ブログやQiitaの解決方法を理解せずただ実行して問題解決に至った場合、それはあまりみなさんの為になりません。
1. 「ただエラーメッセージを検索して解決した」ことと「エラーメッセージの内容を把握した上で自分なりに検索のワードを考えて解決した」この二つには雲泥の差があります。

### その2 技術書

##### 失敗

1. 新しい技術を勉強しよう→技術書を購入しその内容だけで習得しようとする。

##### 教訓

1. 技術書だけでなく、公式ドキュメントにも目を通してみよう。

##### 教訓についての解説

1. 公式ドキュメントは非常に丁寧、かつ初心者でのわかりやすい様に記載されていることがあります。
1. 技術書の購入の前に一旦公式ドキュメントを読んでみるのもアリかもしれません。公式ドキュメントのみで自分が理解できそうならわざわざ数千円する技術書を買う必要もありません。
1. 「公式ドキュメントが英語しかなく読む気になれない」という方もいらっしゃると思います。ブラウザに付属のページ翻訳機能を用いて少しでもいいので読んでみましょう。
1. 環境構築方法や初歩的な内容は公式ドキュメントの方が簡潔にわかりやすく記載されていることもあります。
1. とはいえ核技術に対してベテランエンジニアさんからもお墨付きを貰える様な技術書も数多く存在します。「公式ドキュメントを最初に読んでみる→ストレスと感じそうならば技術書の購入を検討する」という方法でもいいのかもしれません。

### その3 習得スピード

##### 失敗

1. 「〇〇日でエンジニアになることができる」という情報を元に勉強しているが一切できる様にならないので「自分はプログラミングに不向きなのかもしれない」と考えてしまう。

##### 教訓

1. 習得スピードは人それぞれ、己にあった学習方法も人それぞれ、義務教育での勉強ではないので他人と比べることがそもそもNG！ただ、勉強方法や技術に対するアプローチ方法がずれている可能性もあるので勉強会などに参加して現役のエンジニアの相談することも大切！

##### 教訓についての解説

1. 勉強をサボっていないことが前提であるが、学習初期段階程周りの人やメディアの情報を見て不安になりがちだと思います。隣の芝は青く見える効果なのかもしれませんが「同じくらいに勉強を始めた〇〇君はすごい勉強の進捗がいいのになぜ自分はこんなこともわからないんだろう？」と思うこともあります。
1. 自分がどうやったら理解できるのか、理解にどのくらいの時間がかかりそうなのかが読めない初期段階はこういった不安はつきものです。
1. 勉強会に参加し懇親会で己の勉強方法を相談することもアリかもしれません。(自分の主観ですが勉強会に参加するエンジニアさんは初心者として頑張っている方に優しい方が多いと感じます。)

### その4 タスク分解(これは個人差があるかもしれません)

##### 失敗

1. いきなりWebアプリをAWSやDockerを用いて作ろうとする。

##### 教訓

1. 一気に全てを習得しようとせず段階を踏んで実施する。

##### 教訓についての解説

1. 一気の多くのことを習得しようとすると十中八九うまくいきません。
1. また、たくさんのことを同時に実施しているので何が悪くてうまくいっていないのか切り分けることが難しくなります。
1. 初めての環境構築ではまずうまくできることは稀です。段階を踏んで学んでゆくことにより問題箇所の洗い出しがスムーズになりトータルしてみるとより短い時間で問題を解決することができることもあります。
1. 筆者は下記の様に段階を踏んで実施していました。
    1. Macのローカル環境にて簡単なWebアプリを作成して動作を確認する。
    1. AWSのEC2にてWebサーバの構築を行い、構築したWebサーバを使って簡単なhtmlファイルを表示しブラウザからのアクセスを確認する。
    1. AWSのEC2のWebサーバにWebアプリの作成環境を構築する。
    1. Macのローカル環境にて簡単なWebアプリを作った時と同じ方法でWebアプリを作成する。
Unity 学習　2日目

20.07.11

#挑戦二日目
学習時間は、仕事から帰った後、子供が寝た後の夜中からなので、ちょっとずつしか進めませんが、
きろくとして残していきたいと思います。（完全に趣味です。）
今日は、[ユニティちゃんが教える！初心者向けUnity講座](https://www.udemy.com/course/unity-chan-tutorial-01/)
で学習を進めます！※動画が制作されたのが2年前なので一部機能しないようです。

##セクション2　ベーシックチュートリアルにて学習　前後編　計16分
（最新のUnityでは、ベーシックチュートリアルの提供がないようです。）
見ているだけなので、味気なくちょっとやりたかった。
①コンポーネントって大事だよ
②コンポーネントの調整ってこうやるんだよって
本動画でも言っておりましたが、プログラミングではなくパラメータをによって調整ができるインターフェイスってとても操作しやすい印象です。

![スクリーンショット 2020-07-11 23.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671354/29f30949-bc7a-d894-22fd-562017ef4803.png)


##セッション3　基本のミニゲームをつくろ！
このセクションでは、別のプログラムが必要なようです。
[Downloud先](https://github.com/makoto-Unity/UnityChanballroll)
最終更新が1年前なのでうまく起動するのでしょうか？

こちらの内容を開くと再構築しますか？とし聞かれましたが、気にせず”ＹＥＳ”
再構築から動作確認まで結果30分ほどかかりました。（私のＰＣのスペックが悪いのかも）

しっかり起動しました↓
![スクリーンショット 2020-07-11 23.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671354/25e8aefb-b2f4-02d9-42b2-b3989352cf9b.png)

どうやら最新版までに少なくとも1回は更新されているためか、チュートリアル動画と更新内容が一部異なるようで、
操作するボールが玉乗りUnityちゃんに代わっておりより魅力的に!!

眠たくなってきたので今日はここまで。

##あとがき
アドバイスや参考になる動画ＵＲＬ、ＨＰがあれば教えてください。
最後まで読んでくださりありがとうございます。
明日も頑張ります
Tableau ServerにてAzure ADアカウントでログインした場合にログアウトする方法

## 概要
Tableau Serverにて、Azure ADアカウントによるSAMLでの認証とした場合に、ログアウトする方法を共有します。

ローカル認証であればであれば右上のアカウント情報からログアウトできたのですが、ログアウトボタンが消えてしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/171c7e55-2099-988c-be97-4a167dd8d004.png)

その対応方法として、URLをベタ打ちするというスマートでない方法を共有します。

## 手順
### 1. 下記のURLの一部を変更し、ブラウザから接続

```text
{接続URL}/#/signedOut
```

＜実際の例＞

```text
https://52.155.110.135/#/signedOut
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ab0fc175-f345-afe6-e68e-6b70b9ef4f4b.png)

### 2. ログアウトされてことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a83177f4-0900-22fc-f7a2-4b3a116e6d3d.png)
Dynamo DB ベストプラクティス(個人用メモ)

## 参考サイト

DynamoDBのテーブルを1つだけにする設計のコツ（考え方編）
https://mizumotok.hatenablog.jp/entry/2019/08/13/172430

DynamoDBのテーブルを1つだけにする設計のコツ（汎用的手法編）
https://mizumotok.hatenablog.jp/entry/2019/08/14/175525

多対多の関係を管理するためのベストプラクティス
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-relational-modeling.html

DynamoDB でリレーショナルデータをモデル化するためのベストプラクティス
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-relational-modeling.html

グローバルセカンダリインデックス
ローカルセカンダリインデックス（スパースインデックス推奨）

Partition Keyに一番重要そうなテーブルのプライマリキー、Sort Keyにそのテーブルとリレーショナルなテーブルのプライマリキーを入れることで実現できます。Partition KeyとSort Keyだけを見るとテーブルの関係性を示しています。この設計手法を隣接関係のリスト設計パターン

⇒個別の設計用テーブルと、参照用の結合テーブルを用意するのがよさそう
Open API 3.0の定義からgolangのサーバコードのスケルトンを作成する

# Open API 3.0の定義からgolangのサーバコードのスケルトンを作成する

## TL; DR

1. API定義をSwagger Editorで作成する（Open API 3.0）
2. API定義からGolangのサーバコードのスケルトンを作成する
3. コードを実装し展開する

## 注意

初心者のメモです。まだ途中までしか作成してません

---

## API定義をSwagger Editorで作成する（Open API 3.0）

みんなSwaggerなるものを使っている。
仕様ドキュメントと実装が違うなどということはソフトウェア開発ではたびたび経験しているから、ぜひとも避けたい。

聞くに、`Swagger Editor` というヴィジュアライズしてくれる便利なものもあるらしく、これは便利である
作成した定義は、`[File]` > `[Save as YAML]` で ダウンロードできる。

![Swagger Editor](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133372/adc82bec-6efe-98f3-ad00-fec29e65c36b.png)

どうもSwaggerがデファクトらしいが、標準化された`Open API`という書き方があるのなら、個人的にはデファクトといえどそちらに合わせたほうがよさそうに思う。


## API定義からGolangのサーバコードのスケルトンを作成する

これをやりたかった。なんでGolangかといえば、あとでコンテナ化してデプロイするときに楽そうだからである。そして、数年前からサーバサイドといえばGolangを使うのがよさげらしいので。

さて、スケルトンコードを作成するには、[openapi-generator](https://github.com/OpenAPITools/openapi-generator) を使う。
`jar`ファイルをダウンロードして、適当なところに置けばよろしいらしい。
[2 - Getting Started](https://github.com/OpenAPITools/openapi-generator#2---getting-started)

ちなみに、Node JSのラッパーもあるらしく、フロントエンドはNode JSの力を借りるのだから、`npm` コマンドでインストールした。

```powershell:openapi-generatorのインストール
npm install @openapitools/openapi-generator-cli -g
openapi-generator version
```

スケルトンコードを作成するときに、ついでにGolangのプロジェクトを作成してしまう。
Golangはインストールしておく。`C:\go`なり`C:\Users\foo\go`とか

ちなみに、Golangのプロジェクトのディレクトリ構成は、検索すると**諸説あるように見えるが、そんなことはない。**
プログラミングに関して検索するときは、**Google検索で１年以内を指定する**ようにしたほうが良い。
2020/07の現時点では、[ここ](https://github.com/golang-standards/project-layout)に従うのがよいように思われる

```powershell:スケルトンコードの作成・・・？
# ここで作成
openapi-generator generate -g go-server -i api\openapi.yaml -o myproject
```

上のコマンドを実行すれば、`myproject`ディレクトリ以下ですぐさまGoの開発に入れる。
が、オプションなしのデフォルトで作成したスケルトンコードでは、`go-lint`の命名規則ルールに引っかかる。
特にVS CodeでGolang拡張機能を使うのであれば、デフォルトのlintツールは`go-lint`であるからとてもめんどくさい。

```terminal:Apiが大文字じゃない！と文句を言うgo-lintの図
type ServiceOperationsApiController should be ServiceOperationsAPIControllergo-lint
```

この`Api`という文字列は、どうやら`openapi-generator`がデフォルトでつける他スケルトンと共通のプレフィックスらしい。

```powershell:ヘルプの参照

openapi-generator help generate
～ 省略 ～
        --api-name-suffix <api name suffix>
            Suffix that will be appended to all API names ('tags'). Default:
            Api. e.g. Pet => PetApi. Note: Only ruby, python, jaxrs generators
            suppport this feature at the moment.
```

```powershell:スケルトンコードの作成
# ここで作成
openapi-generator generate -g go-server -i api\openapi.yaml -o myproject --api-name-suffix API
```
django.db.utils.ProgrammingError: relation "" does not exist

Djangoで作ったwebアプリをHerokuでデプロイしようと
heroku run python manage.py migrate
しようとしたところ上記エラーが出てしまいました

公式ドキュメントにはこのエラーはどうやらPostges(本番、loclalはSQLiteでローカルの方は問題なく動いた)にあるあるのエラーらしく
ForeighKeyなどで結びつけるmodelがないことによるエラーらしいのですが、だいぶ昔に作ったそもそもリレーション使ったモデルがないアプリなのでこれは考えられません。

あるあるなのでしょうか？とりあえずネットに書いてあるようなはほとんど試しました。
（localでmakemigrationsしてmigrateして、Heroku masterにpush)
 (モデルにリレーションがないことを確認し、良い方法ではないが全てのmigrateのやり直し）
など行いましたがだめでした。

””に当てはまるモデル自体消してやってみたところ、また別のモデルが””の中に来て同じエラーが出ました。

何日もやってますができません。何かできることはないでしょうか？お願いします。
Webアプリケーションに存在する脆弱性を狙う攻撃手法

#その１.クロスサイトスクリプティング(Cross Site Scripting:XSS)
掲示板サイトのような、ユーザーの入力内容を表示するタイプのWebサイトの脆弱性を突く攻撃。CSRFと違うのは「ユーザーのWebブラウザに悪意のあるスクリプトを送り込む」という点である。


#その2.クロスサイトリクエストフォージェリ(Cross Site Request Forgeries:CSRF)
攻撃者が用意した「ログインが必要なサイトに対して操作を行う」リンクにユーザーがアクセスすることで被害を受ける攻撃。XSSと違うのは「本人になりすましてログインの必要なサイトを操作する」という点である。


#その3.SQLインジェクション
攻撃対象となるWebアプリケーションに対し、不正なSQLの命令をインジェンクション(注入)することによってDBに意図しない動作を行わせる攻撃。
UnknownError: unknown error: cannot find Chrome binarの対処　#初学者　

# 環境
cloud9でUbuntuを使用

# エラー内容
動かすと`chromedriver`が見つから無いというエラーが出た

```
1.2) Failure/Error: Unable to infer file and line number from backtrace
               
 Selenium::WebDriver::Error::UnknownError:
unknown error: cannot find Chrome binar

```
# 対処
cloud9ではchromedriverが入って無いので公式から入れてパスをつなぐ　
https://chromedriver.chromium.org/downloads

```
$ chromedriver -v
ChromeDriver 83.0.4103.39
$ which chromedriver
/usr/local/bin/chromedriver
```
が同じエラー
（この間でいろいろ調べて試した。この記事とか
https://qiita.com/jnchito/items/f9c3be449fd164176efa
）  
chromedriverのバージョンも確認したが確実にあってる
分からないのでもっと調べるとローカルに移動させてる人もいた

今回はとりあえず環境変えようと思い（というよりこの記事どおりしたいと思い）amazonllinuxに変える事にした　　
https://qiita.com/jnchito/items/f03934e8db01aec7cdc8

すると無事実行するができた！！！
【Goのお勉強中】ラップアラウンド(wrap-around)が要注意な件

# 背景
Goの独学を進める中で、ラップアラウンドなるものに出会いました。
こりゃ要注意だぞ...と思ったのでまとめます
※何かしら知見を得られたらその度に更新します

# ラップアラウンドって何？
### ざっくり
桁あふれ(オーバーフロー)の上位互換みたいなやつ。
最大値を超えたら、また最小値からスタートする、みたいな。
反対に最小値を下回ったら、最大値になっちゃう、みたいな。
(C言語でも同じことが発生するとかなんとか)

### 例えば
8ビットで数値を管理保持するint8の型を持つ変数aがあった場合
int8の範囲は-128~127じゃないですか。
すると、
現在 a = 127 だったとしたら、a++ をするとaの値が-128になります。
めっちゃ減っとるやんけ
逆にa = -128 の時に1を引くと127になります。

嘘だと思うならやってみてください

```go:main.go
package main

import "fmt"

func main() {
	var a int8 = 127

	a++
	fmt.Printf("ふつうは127+1=128のはず。でもこの結果は... %d\n", a)
	a--
	fmt.Printf("じゃあ-128-1は... %d\n", a)
}

```

### それでよ
Goの場合、こういった現象が起きても特にエラーは発生しないらしく、ちょっと慎重に実装する必要がありそうです。

# どうやって対策するの？
どうやら演算を行う前に、演算結果がラップアラウンドを起こさないか確認する必要があるみたいです。
なんてこったい。

int64だとこんな感じで事前チェックを入れるのかな...全然足りないので気が向いたら充実させます。

```go:wrapArround.go
func wrapArround(a, b int64) bool {

	if math.MaxInt64-a < b {	// 足し算をして問題がないか？
		return false
	} else if a < math.MinInt64+b || b < math.MinInt64+a { // 引き算をして問題がないか？
		return false
	}

	return true
}

```

# 気になっていること
もしや日付表現とかでも問題になったりする...？

# 参考図書
https://www.amazon.co.jp/dp/B01FH3KRTI/ref=cm_sw_r_tw_dp_x_msCcFb90E9FFA
チーム開発におけるgit commitの粒度とコミットメッセージについての自分なりの考え

## この記事で書くこと
- 自分自身で何を「Commit」という機能に対して考えているかを改めて整理する。
- 自分の現時点での考えを整理して、未来の自分が見直した時に、スタンスに変化があった時に良かれ悪かれ気付くようにする。

#### まず前提としてプログラミングの能力と、Gitでのチーム開発を進める能力といったものは全く別の能力だということが言える。
優れたプログラミング能力を持っていても、そのエンジニアがチーム開発において優れた人間であるという訳では必ずしもない。逆も然り。
「commit」に対して自分とスタンスが異なる開発者と一緒に開発する時には、その意志を最大限尊重しなければならない。ただ制作物としてのプログラムをどのように扱っていくべきか、という点に関してはチームで一度話し合いの場を設けた方がそのプロジェクトに対しては健全ではないかというのが私の考え。
なお、総合力で開発者というものは過去および未来から評価されるものではないかというのが個人的な意見で、その立ち位置からいうと、両方の能力が備わっていることが望ましい。

## gitのCommitの粒度及び、コミットメッセージのエンジニアの開発サイクルにおける役割について
- プログラムの背景を記述することができる。
- 実装者自身が客観的に自身の書いたコードを評価（振り返る）するタイミングをくれる。
- PRに於いて、レビュアーを助ける。
- バグを防げる。
- シンプルで質の良いプログラムを書くことを手伝ってくれる。
- 時期（時間的な差）を超えた普遍的な一定理解を、都度携わっているエンジニアに教えてくれる。

## コミットに関して自分が思う気をつけてること
#### 最低限がんばる（よほど、急ぎでリリースしなければならない時でトチ狂ってなければ実行したい）、と思ってること
- 何をそのコミットでやってるかを動詞+名詞（目的語）で書く
- 一つのコミットでは一つのことだけをやる。(add xx and remove yy とかしない)
- masterの内容をfeature(開発ブランチ)にマージするマージコミットは積まずにrebase。
- 他の開発者が同一ブランチでpushした内容のlocalへのマージコミットは積まずにrebase。
- コマンド実行などで自動で差し込まれたコードと、自分が書いたコードはコミットをわける。特に、コマンド実行で生成されたコードに関しては実行したコマンドをそのままコミットメッセージに入れてコミットしている。(例: rake db:migrate, bundle install ...)

#### ここまでチームでルール化したいけど苦しい部分もあるのかもしれないと思っていること
- 自分の書いたPR内で仕込んだlint系の修正(rubocopやhaml lintなど)はそれを書いてしまったコミットまでrebase -iで戻って直してforce push。もしくは1つのコミットにまとめる。（enableを追加する時とかは、１つのコミットにまとめるときもあるが、基本的には、戻って直してる気が1mmくらいする。）
- masterからみて、「fix(add またはremove/delete/change)」ではないとき（＝開発中の実装の迷い/揺れからくる変更）は、fixは使わない。rebaseして元々の実装コミットを改変する。
そうすると、新しい実装をしたことが理解できる綺麗なコミットがPRを通してmasterにマージされ、
背景を理解するために無駄な時間を未来の開発者たちに使わせることがなくなる。

#### 気をつけているけど、できてないこともあること
コミットにその変更をした理由を記述する。
例）xxページのボタンの色を赤に変更
--> xxページのボタンの色を目立つように赤に変更。CVRの向上に関するマーケティングテストのため。

## チームのメンバーのPRを見ていて気になったらコメントで「もし直せたら直してください :pray: 」と書き込んでるコミットについて

- コミットメッセージとdiffが明らかに異なる
  - 削除してるのに、add xxxx とか　〜を追加

- xxを変更した、しか書かれてない
  - diffを見れば、そのファイルを変更したことは解る。知りたいのは、なぜその変更をしたのか。
 
- コミットメッセージがそれだけで何かのストーリーのようになっている
  - 「xxをまずはじめに修正し、その後、xxを追加、yyにxxを追加し、qqという機能を追加する」というのようなメッセージ。明らかに一つのコミットの粒度ではなく、面倒になって全部のコミットをsquashしたんだろうな、と感じるような一つになっている。

- 実装中の迷いがまざまざとのこるコミットの積み方
  - add fugafuga -> add hogehoge -> remove fugafuga -> refact hogehoge のような、いや、結局何やったのよ、とレビューしづらい。(と個人的に感じる)


## コミットについて自分が重要視する理由のようなもの
バグは直せる。どんなに気をつけていても、プログラムを書いてるのは人間なので、「全くミスがない」は保証できない。もし出てしまったら、できるだけすぐに直せば良いだけ。（インシデント報告の必要があればそれもしっかりやる。
でも一度 `master` に入ってしまった歴史（コミット）は「２度と取り消せない(取り消すプロジェクトもあるかもしれないですが基本的には、という意味)」から、その影響度合い的に見て、自分は重要視しています。
そのノイズはそのプロジェクトが終了するまで、ずっと未来の開発者につきまとうことになってしまいます。（まさか、 `rebase` するとでも。。？？？？ `revert` したものを入れ直すことはあるかもしれませんが。 `reset --hard` も基本しないですね、自分は。）


## 最後に
結構この辺りに関しては自分は多少神経質らしく、なかなかに生きづらい。
人によって色々考えが違うなぁと思う。
なので、「みんな違ってみんな良い」という言葉で締めようと思います。
Promise Test

```js
function sampleResolve(value) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(value);
        }, 1000);
    })
}

function sample() {
    let result = 0;

    return sampleResolve(5)
        .then(val => {
            console.log(result, val)
            result += val;
            return sampleResolve(10);
        })
        .then(val => {
            console.log(result, val)
            result *= val;
            return sampleResolve(20);
        })
        .then(val => {
            console.log(result, val)
            result += val;
            return result;
        });
}

sample().then((v) => {
    console.log(v); // => 70
});
```

```
0 5
5 10
50 20
70

```
【初心者でもわかる】line-heightのせいでデザインを崩さないためのコーディング方法

# どうも、7noteです。今回は初心者が落ち入りやすいline-heightの罠を解説し、対応策についてもしっかり書いていきます。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/line-height/
QuarkusがJava Lambdaを救う！？

すごいですQuarkus!!!!!!
JavaのLambdaのコールドスタートがチョッパヤです！！

以下の公式サイトを参考に試しました。

https://quarkus.io/guides/amazon-lambda#tracing-with-aws-xray-and-graalvm

# テスト対象

前回の[AWS LambdaのJavaは遅い？](https://qiita.com/moritalous/items/632333088948aad7f8c9)とほぼ同じですが、以下が異なります。いずれもQuarkusの制限？制約？です。

* アノテーションが付いてる
* httpClientがUrlConnectionHttpClient

<details><summary>ソース全体</summary><div>

```java
package example;

import javax.inject.Named;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;

@Named("test")
public class TestLambda implements RequestHandler<Object, Object> {

    @Override
    public Object handleRequest(Object input, Context context) {

        String ENV_BUCKET = System.getenv("BUCKET");

        S3Client s3 = S3Client.builder()
                            .region(Region.AP_NORTHEAST_1)
                            .httpClient(software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient.builder().build())
                            .build();

        PutObjectResponse result = s3.putObject(
                PutObjectRequest.builder().bucket(ENV_BUCKET).key("filename.txt").build(),
                RequestBody.fromString("contents"));

        System.out.println(result);

        return "";
    }
}

```

</div></details>

# 検証結果

| 回数 | レイテンシ(ms) | 処理内容 |
| --: | --: | --- |
| 1 |2700|
| 2 | 250|
| 3 | 305|
| 4 | 319|
| 5 | 187|

前回はコールドスタートが6200msだったので、めちゃ早になりました！

# 検証結果（＋Provisioned Concurrency）

こんなチョッパヤなQuarkusさんをProvisionedにしたらどうなるんでしょうね。ワクワクしますね。

| 回数 | レイテンシ(ms) | 処理内容 |
| --: | --: | --- |
| 1 | 417 |
| 2 | 198 |
| 3 | 206 |
| 4 | 270 |
| 5 | 147 |

期待を裏切らない速さ！すごいよ、Quarkus！


# 参考

https://quarkus.io/guides/amazon-lambda#tracing-with-aws-xray-and-graalvm
https://aws.amazon.com/jp/blogs/architecture/field-notes-optimize-your-java-application-for-aws-lambda-with-quarkus/
[VirtualBox]vagrantでローカル開発環境を構築する

# 概要
[VirtualBox](https://www.virtualbox.org/) & [Vagrant](https://www.vagrantup.com/)でローカル開発環境を立ち上げる。

# 環境
macOS Mojave 10.14.6
Vagrant 2.2.6
VirtualBox 6.0.14

※Windowsでもほぼ同じだがSSH接続はコマンドプロンプトからではなく、ターミナルソフトを使うべし

# 手順
以下からvagrantfileを探す。
https://app.vagrantup.com/boxes/search
※どれがいいかわからなければとりあえず[Bento](https://app.vagrantup.com/bento)から任意のOSを選べばよい(と思っている)

使うvagrantfileが決まったら「New」と書かれたタブの下の「vagrant init〜」の行を
仮想環境を構築するディレクトリにコピペする。

・仮想マシンの立ち上げ(&起動)
`<dir>$ vagrant up`

・仮想マシンにssh接続
`<dir>$ vagrant ssh`

・sshから抜ける
ctrl + D

・仮想マシンをシャットダウン
`<dir>$ vagrant halt`

以上。
Pythonの高階関数（デコレータ）のサンプル

自前のマシンではSchemeで各種ツールやWebスクリプトを作ってきたが，昨今の安価・高機能・高性能なPaaS，SaaSでSchemeに対応しているはずもなく，代替言語としてのPythonで，Schemeの特徴のひとつである高階関数を扱うためのサンプルを作成・整理した．

なお，高階関数（Higher-order Function）とは，簡単に言えば『関数自体を値として引数にとったり戻り値としたりする関数』である．詳細は，『[Structure and Interpretation of Computer Programs](https://mitpress.mit.edu/sites/default/files/sicp/index.html)』"1.3  Formulating Abstractions with Higher-Order Procedures"を参照．

#高階関数の定義と利用
Pythonでもlambdaが使えるが単一の式としてしか扱えないため，defでローカル定義した関数を返す書き方が一般的らしい．

```python:higherorder.py
def threetimes(f):
    def retfunc(x, y):
        print(f(f(f(x, y), y), y))
    return (retfunc)

def f(x, y):
    return (2 * x + y)

threetimes(f)(10, 5)
# => f(f(f(x, y), y), y)
# => (2 * (2 * (2 * 10 + 5) + 5) + 5) => "115"

def threetimes_message(mes = ""):
    def _threetimes(f):
        def retfunc(x, y):
            print(mes, end="")
            print(f(f(f(x, y), y), y))
        return (retfunc)
    return (_threetimes)

threetimes_message("Result = ")(f)(10, 5)
# => "Result = 115"

threetimes_message()(f)(10, 5)
# => "115"
```

なお，対応するSchemeコードの例は次の通り．実行は[Gauche](https://www.jdoodle.com/execute-scheme-online/)で確認．

```scheme:higherorder.scm
(define threetimes
  (lambda (f)
    (lambda (x y)
      (print (f (f (f x y) y) y)))))

(define f (lambda (x y) (+ (* 2 x) y)))
((threetimes f) 10 5)
; => (f (f (f 10 5) 5) 5)
; => (+ (* 2 (+ (* 2 (+ (* 2 10) 5)) 5)) 5) => "115"

(define threetimes_message
  (lambda (f . mes)
    (lambda (x y)
      (if (not (null? mes)) (display (car mes)))
      (print (f (f (f x y) y) y)))))

((threetimes_message f "Result = ") 10 5)
; => "Result = 115"
((threetimes_message f) 10 5)
; => "115"
```

#デコレータ
高階関数を使用する際のsyntax sugar．語源は，デザインパターンの一種．Flaskなどのフレームワークを高階関数群として定義し，本来の処理を行うユーザ定義関数に機能追加するようにしたい場合に便利な書き方．

```python:decorators.py
# threetimes，threetimes_message は higherorder.py の定義を使用

@threetimes
def f(x, y):
    return(2 * x + y)

f(10, 5) # => "115"

@threetimes_message(mes = "Result = ")
def f(x, y):
    return(2 * x + y)

f(10, 5) # => "Result = 115"

@threetimes_message()
def f(x, y):
    return (2 * x + y)

f(10, 5) # => "115"
```

#lambda等を使ったその他サンプル
[Wikipediaの記事](https://ja.wikipedia.org/wiki/%E9%AB%98%E9%9A%8E%E9%96%A2%E6%95%B0)（高階関数）にある例をいくつか抜粋．

```python:others.py
def args_10_5(f):
    def _args_10_5():
        f(10, 5)
    return (_args_10_5)

def f(x, y):
  print("x = ", x, ", y = ", y)

args_10_5(f)() # => "x =  10 , y =  5"

def f(x, y, z, w):
  return (4 * x + 3 * y + 2 * z + w)

f(2, 3, 4, 5) # => 30

def f(x):
    return (lambda y: lambda z: lambda w: 4 * x + 3 * y + 2 * z + w)

f(2)(3)(4)(5) # => 30

def unfold(pred, f, update, seed):
    if pred(seed):
        return ([])
    else:
        r = unfold(pred, f, update, update(seed))
        r.insert(0, f(seed))
        return (r)

unfold(lambda x: x > 10, lambda x: x * x, lambda x: x + 1, 1)
# => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
```
C#でショートカットキーで他のコントロールにフォーカスする

# 方法
1. フォームのプロパティで `this.KeyPreview = true;` する
2. `ProcessCmdKey` をオーバーライドするらしい

```C#
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    switch (keyData)
    {
        case Keys.Control | Keys.F:
            textBox1.Focus();
            break;
        case Keys.Control | Keys.R:
            dataGridView1.Focus();
            break;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
```

`MenuStrip` はプロパティから設定するだけでいい。

※
色々と頓挫してから2年も経過しているのでC#がわからなくなっているし、色々変わっているので、もっと良い方法があるのかも。
[.NET Core 3]ライブラリの動的ロード(NativeLibrary)を使ってみた

.NET Core 3から、標準(`System.Runtime.InteropServices.NativeLibrary` クラス)でライブラリの動的ロード、およびエクスポートされた関数のアドレスを取得できるようになったらしいです。

このツイートで知りました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">unsafe だし実質 IntPtr だし、 <a href="https://t.co/hl3GxKI4Mh">https://t.co/hl3GxKI4Mh</a> これとの組み合わせでよろしくやれないかな…</p>&mdash; ++C++; // 管理人: 岩永 (@ufcpp) <a href="https://twitter.com/ufcpp/status/1277621868518752256?ref_src=twsrc%5Etfw">June 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

つまり、Windowsでいうと`LoadLibrary`と`GetProcAddress`のP/Invokeを書く必要がなくなります。
(Linuxでの`dlopen`と`dlsym`は試してません)

動的ロード以外にも、`DLLImport`したメソッドのライブラリの解決も制御できるようになっているようですが、この記事では動的ロードしたライブラリの関数を呼び出すだけです。

## 動的ロードと関数の呼び出し例

```csharp
using System;
using System.Runtime.InteropServices;

class Program
{
    [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
    delegate int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType);

    static void Main(string[] args)
    {
        IntPtr user32 = NativeLibrary.Load("User32.dll");
        var fpMessageBox = NativeLibrary.GetExport(user32, "MessageBoxW");
        var messagebox = Marshal.GetDelegateForFunctionPointer<MessageBoxW>(fpMessageBox);
        messagebox(default, "NativeLibrarySample", "Caption", 0);
        NativeLibrary.Free(user32);
    }
}
```

なんというか、`LoadLibrary`と`GetProcAddress`そのままですね。
P/Invokeの様に末尾の`A`/`W`は自動で検索してくれません。

ポインターが得られるので、`GetDelegateForFunctionPointer`でデリゲート経由で呼び出す必要があります。

`NativeLibrary.Load`の戻り値はせめて`SafeLibraryHandle`とかにくるんで欲しかった。
`NativeLibrary.GetExport`も型引数でデリゲートを指定させて欲しい。

## C# 9.0 Preview

C# 9.0には関数ポインターの構文が入るので、同様のことをしてみました。

```csharp
//    <LangVersion>preview</LangVersion>
//    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
using System;
using System.Runtime.InteropServices;

unsafe class Program
{
    static void Main(string[] args)
    {
        IntPtr user32 = NativeLibrary.Load("User32.dll");
        var fpMessageBox = NativeLibrary.GetExport(user32, "MessageBoxW");
        var messagebox = (delegate* stdcall<IntPtr, char*, char*, uint, int>)fpMessageBox;
        fixed (char* text = "NativeLibrarySample")
        fixed (char* caption = "Caption")
            messagebox(default, text, caption, 0);
        NativeLibrary.Free(user32);
    }
}
```

マーシャリングされないので、文字列も固定しないと行けないのが面倒ですね。
(正式版では関数ポインターの構文は少し変わるようですが。)

## 文字列の渡し方

文字列の渡し方が煩わしいので、下記のようのな方法を考えたが、(「安全」ではなく)動作として保証できるのかちょっとわからない…

```csharp

static class Extention
{
    public static StringHolder Hold(this string s) => new StringHolder(s);

}

unsafe readonly ref struct StringHolder
{
    readonly ReadOnlySpan<char> span;
    public StringHolder(string s) => span = s;

    public char* Pointer => (char*)Unsafe.AsPointer(ref Unsafe.AsRef(in MemoryMarshal.GetReference(span)));
}

...
    messagebox(default, "NativeLibrarySample".Hold().Pointer, caption, 0);
...

```
AtCoder エイシング プログラミング コンテスト 2020 参戦記

# AtCoder エイシング プログラミング コンテスト 2020 参戦記

むちゃくちゃ眠かったので、直前に20分仮眠して頑張った.

## [aising2020A - Number of Multiples](https://atcoder.jp/contests/aising2020/tasks/aising2020_a)

1分半で突破. 問題の条件の通り書くだけ. 時間がかかるので、*O*(1) で解こうとかそういう事は考えない.

```python
L, R, d = map(int, input().split())

result = 0
for i in range(L, R + 1):
    if i % d == 0:
        result += 1
print(result)
```

追記: *O*(1)

```python
L, R, d = map(int, input().split())

print(R // d - (L - 1) // d)
```

## [aising2020B - An Odd Problem](https://atcoder.jp/contests/aising2020/tasks/aising2020_b)

2分で突破. 問題の条件の通り書くだけ.

```python
N = int(input())
a = list(map(int, input().split()))

result = 0
for i in range(N):
    if (i + 1) % 2 == 1 and a[i] % 2 == 1:
        result += 1
print(result)
```

追記: 偶数番目なんてスライスで飛ばせばよかったんや…….

```python
N, *a = map(int, open(0).read().split())

print(sum(1 for e in a[::2] if e % 2 == 1))
```

## [aising2020C - XYZ Triplets](https://atcoder.jp/contests/aising2020/tasks/aising2020_c)

6分半で突破. N≤10<sup>4</sup> だから3重ループでも通ると思った. 実際、通った.

```python
N = int(input())

result = [0] * (N + 1)
for x in range(1, 101):
    for y in range(1, 101):
        for z in range(1, 101):
            n = x * x + y * y + z * z + x * y + y * z + z * x
            if n > N:
                break
            result[n] += 1

print(*result[1:], sep='\n')
```

## [aising2020D - Anything Goes to Zero](https://atcoder.jp/contests/aising2020/tasks/aising2020_d)

突破できず. A = B * C のとき A % m = (B % m) * (C % m) % m を使って大きな数の余りは出せるなあと思って、それを使って組んだけど、TLE は出るし、RE も出るしでよく分からないことに. 最初の1回目の処理は事前計算で *O*(1) に出来るけど、2回目以降はどうするんだろ.

追記: *f*(*n*) の返す値の最大値は log<sub>2</sub>(*n*) なので 2<sup>2×10<sup>5</sup></sup> → 2×10<sup>5</sup> → 17.6 → 4.1 → 2.0 → 1 → 0 とあっという間に収束する. なので最初の1回だけなんとかすればよかった. TLE を見て *f*(*n*) の高速化に走ったのは間抜けだった.

RE が出ていたのはもともとビットが1つしか立ってなかったとき、その唯一立っているビットが反転されると *popcount* が0になることに気づかず0の除算で出ていた. TLE が出ていたのは log<sub>2</sub>(*X*) すら 2×10<sup>5</sup> なことを意識せずに *O*(<i>N</i>log<i>X</i>) で書いていたため.

着想は合っていたものの、ところどころ抜けがあって解けなかった感じ. 残念.

```python
def popcount(n):
    return bin(n).count("1")


def f(n):
    if n == 0:
        return 0
    return 1 + f(n % popcount(n))


N = int(input())
X = input()

c = X.count('1')
t1 = [0] * N
t1[0] = 1 % (c + 1)
for i in range(1, N):
    t1[i] = (t1[i - 1] << 1) % (c + 1)
x1 = 0
for i in range(N):
    if X[i] == '0':
        continue
    x1 += t1[N - 1 - i]

if c - 1 != 0:
    t2 = [0] * N
    t2[0] = 1 % (c - 1)
    for i in range(1, N):
        t2[i] = (t2[i - 1] << 1) % (c - 1)
    x2 = 0
    for i in range(N):
        if X[i] == '0':
            continue
        x2 += t2[N - 1 - i]

result = []
for i in range(N):
    if X[i] == '0':
        n = (x1 + t1[N - 1 - i]) % (c + 1)
    elif X[i] == '1':
        if c - 1 == 0:
            result.append(0)
            continue
        n = (x2 - t2[N - 1 - i]) % (c - 1)
    result.append(1 + f(n))
print(*result, sep='\n')
```
AtCoder生活　88日目

[前回](https://qiita.com/flandrescarlet237/items/2a1bea17e71c2b97d4aa)

#88日目
エイシング プログラミング コンテスト 2020に参加しました。


![スクリーンショット 2020-07-11 22.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/f05a541e-456c-4de0-9c83-68c367fe3a81.png)


##[エイシング プログラミング コンテスト 2020](https://atcoder.jp/contests/aising2020)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int l,r,d;
    cin >> l >> r >> d;
    int ans = r/d - (l-1)/d;
    cout << ans << endl;
}

```

###B

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i,n) cin >> a[i];
    int ans = 0;
    rep(i,n){
        if(i % 2 == 0){
            if(a[i] % 2 != 0) ans++;
        }
    }
    cout << ans << endl;
}

```

###C

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int f(int s){
    int ans = 0;
    for(int i = 1;i < s/2;i++){
        for(int j = 1;j < s/2;j++){
            for(int k = 1;k < s/2;k++){
                if((i*i + j*j + k*k + i*j + j*k + k*i) == s)ans++;
            }
        }
    }
    return ans;
}

int main(){
    int n;
    cin >> n;
    for(int i = 1;i <= n;i++){
        int ans = f(i);
        cout << ans << endl;
    }
}

```

###最後に
Cの問題をACできるように今度復習します
今回はちょっと時間かけすぎた。
OLS,WLS,GLSの比較

## はじめに
この記事では

- OLS(ordinary least squares,いわゆる普通の最小二乗法)
- WLS(weighted least squares, 重み付き最小二乗法)
- GLS(generalized least squares,一般化最小二乗法)

の3つにはどのような違いがあるかを解説します!

## そもそも最小二乗法とは
三者の比較をする前に、一番簡単なOLSの導出を通じて最小二乗法とは何かを確認します。
最小二乗法とは線形回帰モデルを使う際に、残差二乗和を最小にするようなパラメータ$\beta$の推定量を求める方法を指します。

j個の説明変数からなる線形回帰モデルは
$$f(X)=\beta_0+\sum^p_{j=1}X_j\beta_j$$
と表記することができます。

このとき、f(X)を使って目的変数yを予測すると、残差平方和(RSS)は
$$
RSS(\beta) 
=\sum^N_{i=1}(y_i-f(x_i))^2
=\sum^N_{i=1}(y_i-\beta_0-\sum^p_{j=1}x_{ij}\beta_j)^2
$$
と定義されます。

この残差平方和をすっきりさせるため、行列表記に直すと
$$RSS(\beta)=(y-X\beta)^T(y-X\beta)$$
となります。

RSSを最小化するに$\beta$で微分して0とおきます。
$$\frac{\partial RSS}{\partial \beta}=-2X^T(y-X\beta)=0$$

$X^TX$に逆行列が存在するとき、これを$\beta$について解くと
$$\hat{\beta}=(X^TX)^{-1}X^Ty$$
となり、予測値yは
$$\hat{y}=X\hat{\beta}=X(X^TX)^{-1}X^Ty$$
となります。

## OLS推定量
上記のOLSには3つの仮定があります。

- 誤差項uの、Xが与えられた下での条件付き平均は0
- $(X_i,Y_i)$は独立に同一の分布から得られている
- $(X_i,u_i)$は有限の4次のモーメントを持つ

これらが満たされているとき、OLS推定量は不偏性や一致性といった推定量として望ましい性質を持っています。
それに加えて、**もし誤差項が均一分散なら**、OLS推定量はあらゆる不偏で線形な推定量のなかで最も小さい分散を持つことが知られています。(これをガウス＝マルコフ定理といい、OLSはbest linear unbiased estimator,BLUEだと言います)

※ここでいう「分散」は推定量の条件付き分散を指します。分散が大きい事は推定量がブレブレだという意味なので分散は小さければ小さいほど良いです。

## OLSの拡張
誤差項が均一分散ならOLS推定量はBLUEでした。
誤差項が均一分散とは、説明変数が複数の時には誤差項の分散共分散行列が単位行列になるということと同義です。しかし実際にはこのような仮定が成り立つとは考えにくいです。

**そこで、誤差項の分散共分散行列を単位行列以外に拡張したものがWLSとGLSです。**
WLSでは単位行列から対角行列に条件が緩められ、不均一分散に対応できます。
GLSでは対角行列から対象行列に条件がさらに緩められ、誤差項間の共分散が0である必要もなくなります。

## 比較
結論から述べるとOLS,WLS,GLSで得られる$\beta$の推定量は
OLS推定量
$\hat{\beta}=(X^TX)^{-1}X^Ty$

WLS推定量
$\hat{\beta}=(X^TWX)^{-1}X^T Wy$

GLS推定量
$\hat{\beta}=(X^T\Omega^{-1} X)^{-1}X^T \Omega^{-1}y$

となります。
均一分散の仮定が成り立たない時には、Wや$\Omega$に適切な行列を持ってきてあげることでOLS推定量よりも分散の小さな推定量を求めることができます。
Chrome拡張でJSONファイルを手軽に読み込んでみよう！

以下のような構造のChrome拡張のファイルがあったとします。

```
 my-extension
 ├── src
 │   ├── config.json
 │   └── main.js
 └── manifest.json
```
では、`main.js`から`config.json`を読み込んでみましょう。なに、難しいことは考えず、以下の関数をコピペしてください。

#コード
```javascript:main.js
function getJSON(filename) {
    return new Promise(function(r) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', chrome.extension.getURL(filename), true);
        xhr.onreadystatechange = function() {
            if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
                r(xhr.responseText);
            }
        };
        xhr.send();
    });
}

getJSON('src/config.json').then(function(r) {
    //JSONファイルを読み込んだ後の処理
    var config = JSON.parse(r);
    console.log(config);
})
```

チャンチャン。
「ゲームAI技術入門」の要点をまとめる

# 目的
全くゲーム業界で仕事をしてもいないし、そもそも最新のゲームに疎いのですが、[ゲームAI技術入門](https://www.slideshare.net/youichiromiyake/ai-179237998)を読んで面白かったのでメモとして要約してみます。

## ゲームの中の人工知能
環境があるから知性があり、知性があるから環境がある。ゲームという環境の中で状況を認識し判断する人工的な知性をゲームAIとする。大きく以下の3つがある。

- キャラクターAI
ゲーム世界から情報を集めて意志決定するAI。

- ナビゲーションAI
地形やゲーム内のオブジェクトなど、ゲームのしかけや環境を認識するAI。
マップの特徴を解析し、経路や位置取りを検索する。

- メタAI
ゲームをするユーザとゲームコンテンツの境界に立ってゲームをコントロールするAI。
時間軸に沿ってゲーム全体の進行を管理する。

それぞれがゲーム内で違う階層を担当し、ゲームのユーザを楽しませるため別々の問題を解いている。
その中で特ユーザを楽しませるためにキャラクターAIに求められるのはリアリティである。以下の2点。

- 合理的である
 -  ある地点からある地点にキャラクターが移動するときに、わざわざ遠回りするのは理に適わない。行き過ぎた正確な行動もまた合理的ではないが、自然な判断を行わなければリアリティがない。
- 人間的である
  - 戦闘をするゲームで瀕死の仲間をかばったり、一見不合理に見えるが人間的な行動を取るとリアリティが出る。

### まとめ
ゲームAI自体が全人工知能分野の縮図のような分野であり、あらゆる人工知能技術が現れる。現実と似たゲーム世界を作り上げ、その中で人工知能を作る。現実で応用される前のあらゆる人工知能技術がゲームの中で試され鍛えられていく。

## 知能のしくみ

知能を理解するために、エージェントアーキテクチャという世界と知能を結ぶモデルを用いる。
エージェントは「役割と機能を持った」AIであり、以下の特徴を持つ。

- 世界と知能を分離して考える。
- 知能は世界からセンサ(知覚)を通じて情報を得る。
- 知能は世界にエフェクタ(身体、機能)を通じて影響を及ぼす。

知能はセンサから得た情報とこれまでの記憶を合わせて、知識を形成する。知識を基に意志決定を行い、行動を組み立てる。

### 知識を得る難しさ
人間は世界をある型にはめて理解しようとする。視野は130度あっても、集中して見ているのは2度にすぎない。人間であればゲーム世界にスイカがあるとしたら、その重さや動かすことが出来るか、食べることが出来るかを無意識に分類することが出来るが、現在の人工知能にはそのようなバックグラウンドがないため、スイカ側に「食べられる」「持ち上げられる」という許容された情報(アフォーダンス)を埋め込んでいく必要がある。人工知能はこうしてスイカがどのようなものかを理解する。

### ブラックボードアーキテクチャ
ブラックボード(共有読み書きメモリ)と、その周りに専門的な処理機能を持つKS(ナレッジソース)があり、KSがセンサやアクションを分業で担当してブラックボード上のデータを解釈するアーキテクチャ。2000年以降のバーチャルゲームにおけるキャラクターAIとして試行錯誤の上で発表された。その後のAI設計者の基本的な概念として活用された。

### 意識の理論
キャラクターが何かを見ている、聞き耳を立てているとき、ユーザーは「そのキャラクターの意識がそちらに向いている」と感じる。思考モジュールが注意を払っている対象に対して操作を行うというこの意識モデルを`CERE-CRANIUM認識アーキテクチャ`と呼ぶ。

## 知識表現

キャラクターをゲーム世界に配置しただけではキャラクターは何も認識できない。ゲームのグラフィックデータは基本的にユーザがゲーム世界を認識するためのデータであり、キャラクターAIに環境を認識させるには別のデータが必要となる。
人工知能は人間に与えられた問題に対して思考する「問題特化型人工知能」が大半だが、ゲームAIにはゲームという閉じた世界で自分で問いを設定出来る「汎用人工知能」を目指して開発されているが、まだそのように粋には達していない。

### センサの設計
五感の中でも視覚と聴覚以外のセンサはゲーム内で実装される技術がまだ発達していない。この２つのセンサが厳密に必要とされるステルスゲームにて実装技術が発達した。

#### 視野領域
ゲーム内のキャラクターは扇形の「視野領域」を持ち、フィールド上の障害物などに衝突せずに対象のキャラクターが視野領域に入った時を「見えた」状態、衝突しなければ「見えなかった状態」として見做す。この一連の過程を「レイキャスト」(raycast)と呼ぶ。

#### 存在確率マップ
フィールド上をマス目に分割し、兵士キャラクターがフィールド内を見回りのため徘徊してユーザのキャラクターがいないことを確認したマップ上のマスを存在確率ゼロとみなし、マップ内のすべてのマスをゼロにするために徘徊し続けるシステムを存在確率マップと呼ぶ。


### 後半

後半は別途まとめます。
練習のためにSwiftをUdemyで勉強してみた(3日目)

#3日目にやったこと

-APIを叩いてやってきたJSONが Dictionary<String, Any> だったので、ここから必要な要素を取り出す方法の検討
-色々ググってやりかたを検討した

参考
https://qiita.com/t_punch/items/b5c3de88515f95f80195
https://qiita.com/tenten0213/items/707b1bf2cffb8d3a9700
https://qiita.com/ketancho/items/ad2eb36010fcac620425

#現時点での限界
構文なんかを学習せずにケースバイケースでやっていたので、当然ながら何もわからず。
一度しっかりと勉強してから戻ってきたい。


ということで、今日はここまで。
以下は、色々模索する中で作ったViewController.siwftです。
当然動きません。
APIのキーは"hogehoge"にています。



```ViewController.siwft
   func CountCovid(){
        let headers = [
            "x-rapidapi-host": "covid-193.p.rapidapi.com",
            "x-rapidapi-key": "hogehoge"
        ]
        let request = NSMutableURLRequest(url: NSURL(string: "https://covid-193.p.rapidapi.com/statistics?country=japan")! as URL,
                                                cachePolicy: .useProtocolCachePolicy,
                                            timeoutInterval: 10.0)
        request.httpMethod = "GET"
        request.allHTTPHeaderFields = headers

        let session = URLSession.shared
        let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
            if (error != nil) {
                print(error)
            } else {
                let httpResponse = response as? HTTPURLResponse
                //print(httpResponse)
            }
            do{
                let jsonDataA  = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)as! [String: Any]
                let responses = jsonDataA["response"]
                
                print(typeA)
                
                struct Test: Codable {
                    let cases: String
                    let continent: String
                    let country: String
                    let day: Date
                    let deaths:String
                    let population :Int
                    let tests:String
                    let time:Date
                }
                
                let decoder: JSONDecoder = JSONDecoder()
                do {
                    let Testjson: Test = try decoder.decode(Test.self, from: jsonDataA)
                    print(Testjson)
                } catch {
                    print("error:", error.localizedDescription)
                }
    
             }catch {
                 print(error)
                 }
        })
        dataTask.resume()
    }
}
```


#明日やること

とりあえず、このJSON使うぜーってアプリ制作は一旦停止して、他のアプリ制作を優先します。
都度都度、構文についてもしっかりとドキュメント読みつつ学習していきます。
【Salesforce】資源管理／リソース管理(Git flow)

Git flowでは、それぞれ役割が振られているmaster, release, develop, feature, hot-fixの5つのブランチを使い分けて、開発を進めていきます。

feature……開発をおこなうためのブランチで、個々の機能の実装やバグの解決をおこなう
develop……開発をおこなうためのブランチ
release……リリース前に準備、微調整をおこなうブランチ
master……リリースしたデータを置いておくブランチ
hot-fix……リリースされているデータに、緊急の修正対応をするためのブランチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625521/87a5668b-baba-5b88-c434-4f8faad94d38.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625521/5a14052c-21ef-cc25-c4d0-0bb045027638.png)
LPIC level1について軽くまとめてみる(102編)

#まえがき(挨拶)
本日LPIC102に合格したので投稿してみる
#経緯
取得した経緯については前回の投稿をご覧ください
https://qiita.com/M_RK/items/8f26b179a42a93f14fc7
#勉強期間とスコア
・LPIC level1 全体：約3ヶ月
・LPIC102：約1ヶ月

・スコア：640点
・内訳
　シェルおよびシェルスクリプト：75%
　ユーザーインターフェースとデスクトップ：75%
　管理タスク：91%
　Essential System Service：66%
　Networking Fundamentals：92%
　セキュリティ：90%
#試験内容
・シェルおよびシェルスクリプト
環境変数とシェル変数の違い、シェルのオプション(setコマンド)、エイリアスの指定、シェルスクリプトの書き方など

・ユーザーインターフェースとデスクトップ
LinuxでGUIを使用する技術(X Window System)、リモートデスクトップについて、障がい者のための設定など

・管理タスク
ユーザーの作成コマンドやグループの作成と管理方法、cronの設定(スケジューリング)、タイムゾーンの設定

・Essential System Service
システムクロック(dateコマンド)ハードウェアクロック(hwclockコマンド)の設定、NTPサーバからの時刻取得(ntpdateコマンド)、syslogの設定、メールの送受信、プリンタの設定

・Networking Fundamentals
TCP/IPの基礎知識(代表的なプロトコルとポート番号)、IPアドレスについて、ネットワーク関連の設定ファイル、トラブルシューティングに使えるコマンド(ping、traceroute、tracepath)など

・セキュリティ
xinetdの設定(スーパーサーバ)、開いているポートの確認(ssコマンド)、パスワードの有効期限の設定、sshの設定など
##感想
102は101と比べるとインフラについての知識を広く学ぶことができました。
ネットワークの部分は業務でも使用するものが殆どだったので復習になる感じでした。
LPIC level1を総合的にみるとインフラエンジニアとしてやっていくなら学習しておいて良かったと思える内容です。
難易度的にはLinux未経験でも4ヶ月じっくり学習で取得できるような難易度だと思います。
Goでエラーだったときにlogrusでログ出力してみる


## はじめに
[GoでOpenWeatherMapAPI叩いてみた](https://qiita.com/Captain_Blue/items/0cac0253daf14d4c75b9)でやったものをちょっとだけ改良して、エラー時のログ処理を追加してみたものになります。

[GitHubはこちら](https://github.com/captain-blue210/go_api_sample)


## 環境
OS：maOS Catalina 10.15.5
Go:go version go1.14.4 darwin/amd64


## 手順

- logrusをインストールする

※ログレベルを分けたい&速度を気にする必要がない&シンプルに使えそうだったのでlogrusを選択

```
$ go get github.com/sirupsen/logrus
```

- init関数でログ設定を行う


 ```go
 func init() {
	// Info以上のレベルを出力する設定
	log.SetLevel(log.InfoLevel)
 }
 ```

- エラーだった場合にログを出力する
 - APIを叩いたとき

	```go
	res, resErr := http.Get(url)
	if resErr != nil {
		log.Fatalf("Failed to Get API: %v", resErr)
	}
	```

 - レスポンスを取得したとき
 
	```go
	// レスポンスを取得
	defer res.Body.Close()
	body, redErr := ioutil.ReadAll(res.Body)

	// レスポンスを読み込めなかった場合はログを出力
	if redErr != nil {
		log.Warnf("Failed to read response: %v", redErr)
	}
	```
 - JSONをパースしたとき
 
	```go
	// 返却されたJSONをパース
	if paErr := json.Unmarshal(body, &data); paErr != nil {
		log.Warnf("Failed to parse JSON: %v", paErr)
	}
	```

## 課題
- ちゃんとテスト書くとどうやってやるんだろう・・・？
- 全部mainに書いちゃってるので、リファクタリングが必要
- API叩いたときにエラーだったらリトライ処理あってもよい
- Goの例外処理の思想がJavaとだいぶ異なるのでそのあたり整理しておさえたい


## 参考にさせていただいたもの
- [Go言語のエラー処理をエレガントにする](https://qiita.com/wsuzume/items/b6ffd246f62dffb8f666)
- [【Go×ログ】logrusの使い方を簡単に分かりやすくまとめてみた](https://qiita.com/gold-kou/items/3143ab4622acacd33f8d)
PDFtoPNG.exeを使って、Windows10で日本語PDFファイルをPNG画像に変換する

# XpdfReader には、pdftopng.exe が付いてくるけども

>Download the Xpdf command line tools:
> Windows 32/64-bit: download (GPG signature)

http://www.xpdfreader.com/download.html

# そのまま日本語PDFに使っても、変換エラーになる

> $ bin64\\pdftopng.exe  mydata.pdf out.png

> Syntax Error: Unknown font tag 'F4'
> Syntax Error (9891): No font in show
> Syntax Error (9897): No font in show
> Syntax Error (9902): No font in show
> Syntax Error (9907): No font in show
> Syntax Error (9911): No font in show
> Syntax Error (9917): No font in show
> Syntax Error (9922): No font in show
> Syntax Error (9927): No font in show
> Syntax Error (9933): No font in show

# 言語サポートパックを入れる

> Download language support packages for Xpdf:
> Japanese [updated 2017-Jul-25]
> http://www.xpdfreader.com/download.html

> $ cd bin64
> $ mkdir japanese
> $ （ここにダウンロードしたtar ballを展開）

xpdfrc コンフィグを記載する。絶対パスについては、適度に置き換えてください。
ここでは「MSゴシック」を指定しています。

 $ vim bin64\xpdfrc

> textEncoding UTF-8
> psResidentFont   @MS-Gothic MS-Gothic
> fontFileCC	Adobe-Japan1	C:\Windows\Fonts\msgothic.ttc
> 
> cidToUnicode	Adobe-Japan1	C:\pkg\xpdftools\bin64\japanese\Adobe-Japan1.cidToUnicode
> unicodeMap	ISO-2022-JP	C:\pkg\xpdftools\bin64\japanese\ISO-2022-JP.unicodeMap
> unicodeMap	EUC-JP		C:\pkg\xpdftools\bin64\japanese\EUC-JP.unicodeMap
> unicodeMap	Shift-JIS	C:\pkg\xpdftools\bin64\japanese\Shift-JIS.unicodeMap
> cMapDir		Adobe-Japan1	C:\pkg\xpdftools\bin64\japanese\CMap
> toUnicodeDir			C:\pkg\xpdftools\bin64\japanese\CMap

# 日本語PDFがちゃんと変換できるようになった。

> $ bin64\\pdftopng.exe  mydata.pdf out.png


# See also
* https://texwiki.texjp.org/?Xpdf
* http://www.xpdfreader.com/pdftopng-man.html
初心者によるプログラミング学習ログ 367日目

#100日チャレンジの367日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
367日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●ブログ記事1記事作成<br>●プログラミング学習367日目 1.5h<br>・メンターの課題<br>・ナビクリック後のアクション<br><br>とりあえず、暑さがしんどい<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1281684100231774208?ref_src=twsrc%5Etfw">July 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>