OmniAICreator/Qiita-1.07M huggingface dataset:
php-master-changes 2018-11-07

今日はオブジェクト生成時の初期化処理の微妙な最適化、*printf() 系の最適化、ext/opcache に昨日入ったクラッシュするバグの修正、及び不要なメモリコピーの除去、ext/gd ビルド時の freetype2 検出で freetype-config でなく pkg-config を使うようにする修正があった！

# 2018-11-07
## dstogov: Reorder conditions and set expectation.
- https://github.com/php/php-src/commit/c994d90db27ccc36caef32a3abe1ade6e8289ce1
- オブジェクト生成時の初期化処理で行う[オブジェクトストア](http://www.phpinternalsbook-ja.com/classes_objects/internal_structures_and_implementation.html#id6)へのオブジェクト追加処理において、条件分岐の順序変更と EXPECTED / UNEXPECTED の追加

## dstogov: Removed dead checks
- https://github.com/php/php-src/commit/cdbbc802b456119b98134328ff66eff5bddcdfce
- *printf() 系の処理で、不要なポインタチェックの削除

## dstogov: *printf() optimization and v*printf() warning message fix.
- https://github.com/php/php-src/commit/bc53642c05f25dcca79a4fa1d2190dda98cd8b61
- *printf() 系の最適化と v*printf() 系の引数の警告メッセージ修正
- コメントが spintf になってるのは Dmitry 御大のせいでなく昔から同じファイルで複数箇所 spintf になってるもよう

## dstogov: Fixed crash introduced by [bfaf662ac2e58c16208224f32cb8387a35b3da97](bfaf662ac2e58c16208224f32cb8387a35b3da97)
- https://github.com/php/php-src/commit/8c7aa88e2d2ae519160cad7acf220c09ca17f18e
- ext/opcache で、[昨日の修正](https://qiita.com/sj-i/items/3f7ab4a4b5f0fc397da6#dstogov-micro-optimization)で入ったバグの修正

## dstogov: Avoid double copying
- https://github.com/php/php-src/commit/f20029807560677077f3f94764caada869329e26
- ext/opcache のクラスに関連するハッシュテーブルを共有メモリからプロセス内メモリへコピーしてくる処理で、代入と memcpy() で二重に同じデータのコピーを行っていたのを修正

## eli-schwartz: ext/gd: Use pkg-config to detect the availability of freetype2
- https://github.com/php/php-src/commit/2d03197749696ac3f8effba6b7977b0d8729fef3
- ext/gd で、ビルド時の freetype2 の検出に freetype-config でなく pkg-config を使うよう修正
- 最新版の freetype2 では freetype-config はデフォルトでインストールされない
- 詳細は [#76324](https://bugs.php.net/bug.php?id=76324)
ReactOSを使ってみた (0.4.10)

だいぶ安定して利用できるようになった。

## 動作確認が出来たもの

* Virtualbox Guest Additions
    * Virtualbox画面のサイズ変更に対応
* Firefox v48
    * v52は動きませんでした。(自動updateされるので注意)
* Fira font (日本語の表示に必要)
    * `fonts`にコピーすることで有効になる。
* NIC
    * `PCnet-PCI II`を選択すると動作する。

## 動作がおかしいもの

* chrome v49
    * ウィンドウ枠の表示はするがページの表示がされない
f4: slack の内部プロセスについて

.

「サーバー監視などでプロセス異常を検知したら slack に通知する」
ということは皆さま様々な手法で行っており、
今回は その逆で slack 側プロセスでそうなったら、
というお話です

 * 断定事例ではないです
 * 解決方法でもないです
 * ちょっと感じたメモです


[ slack チャンネル内の書き込みが発生 ]
 -> [ Outgoing Webhooks ]
 -> [ 外部へPOST ]
 -> [ php で受け取り ]
 -> [ メール通知 ]

ということをしているのですが、先日、


### **[ こんなことがあったよ ]**

slack チャンネル内の書き込みが発生し、
チャンネル内の書き込みはされているけれど
メール通知が来ないことがありました

### **[ 確認してみたよ ]**

メールフィルターやら php 処理からメール通知側に
何らかの問題があるのかと確認しましたが、
そもそも php への POST が来てない様子でした
(前後の書き込みイベントは POST されていた)

もちろん web サーバー と slack 間の N/W 含む、
他の要因も考えられるのですが、
仮に slack の内部プロセスのジャム
(いわゆるプチハングアップ)となる場合、
上記仕組みでは、その状況に気づけません

### **[ 何か方法ないかな ]**

[ Outgoing Webhooks ] の代替え手段となりえる
[ Events API ] でも投稿イベントを POST 
という同等のことはできるようですが、

[ Outgoing Webhooks ]、[ Events API ] が行う
[ 他のプログラムとの連携アプリ ] の動作レベルとしては、
アプリ層の動作となるようで、
( [ Incoming Webhooks ] もそうですし、多分 [ slash commands ] も同じく)

### **[ うーむ ]**

アプリイベントよりも下位層の
システム / OS レベル の イベント検知は出来るのだろうか
出来たらいいな、と思ってますが、
クラウド上のサービスである Slack の
おなかの中の監視は難しいのかもしれません

できる場合はごめんなさい、深度未調査です
正直、そういった情報は少ないように思います

・無料版
　と
・有料版の スタンダート / プラスプラン
・企業向け(Slack Enterprise Grid)
　で
そういう意味での性能面や監視体制・機能なども
違うのかもしれません

### **[ ちょっと良いかも ]**

[ GAS(Google Apps Script) ] の場合は、
トリガーに失敗した場合は、こんな通知が来ます

![gas_apps-scripts-nortification-18.jpg](https://qiita-image-store.s3.amazonaws.com/0/298080/0220058e-e3d6-1a4f-2e77-f54a6015f4bb.jpeg)

「5分ごとのタスク起動なんかをしていると
そんなこともありますよ、ごめんね」、
といった感じで、失敗ではあるけれど、アラート通知してくれます

### **[ 通知頻度もあるけど、それは置いといて ]**

GAS、Slack ともに、

・どれだけのユーザーが
・どれだけの複数起動をしていて、
・常時どれくらいの多重プロセスが生成され、または常駐しているのか
　(リリースはされているのか、タイムは、などなど)

と考えると
異常なくらい、想像をはるかに超えたところで、となるでしょうから

通知が来たからといって、何がどう と変わるわけではないので、
本来は、ジャムった場合の回避策 がほしいところですけど、
ひとまず、
[ ユーザー ON/OFF 選択型のトリガー失敗通知サービス ] 
みたいなのがあるとありがたいですね

アラートが来たら、同時刻の書き込みを 任意トリガーとして
少々のタイム経過後に、外部 POST のみ行ってみる
なんてことも考えられますし

大量のアラートが来たら、そのことでさらにジャム率アップ！
なんてことにもなりかねないので、むつかしいですけどね

.
コマンドラインからAWSでMFA(多要素認証)する

ブログに書いた記事の転載です。
https://munchkins-diary.hatenablog.com/entry/2018/11/08/034633

さて、技術関連記事の2回目です。  (書き溜めてるので、本当に二番目に公開されてるかは知らない)
最近ちまちまとbashスクリプトを書くのに疲れて来たので、真剣にスクリプト言語を勉強し始めました。  
もともとPHPとnodeは少し書けるんですが、これから解析系の仕事が増えてくるので、Pythonかなぁってことで、Pythonです。  

最初に書くスクリプトどうしようかなぁと思ってたんですが、最近AWSのMFAを自分のスマホからやってる人多くないですか？  
あれBYD禁止の会社でも普通にやってる人いて普通に気持ち悪いなぁと思ったので、コマンドラインから認証、session tokenを取得して環境変数にセットするところまで書いて公開しようかなと考えております。


## 本題へ
さて、タイトルの通り、今回の記事ではまずコマンドラインからAWSの多要素認証をする方法について書こうかなと思います。

やり方は非常に簡単。以下の手順でpipからmfaをインストールします。
pipを使うので、pythonをインストールしておいてください。
 
```bash

$ pip install mfa
```
mfaがインストール出来たら、次のコマンドで秘密鍵を登録します。

```bash
$ mfa set ${key} ${secret_key}
```
ちなみにご存知かと思いますが、秘密鍵はここから取れます。
<img width="1288" alt="スクリーンショット 2018-11-08 2.12.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/272084/4334fb54-4558-0f22-81fc-b016658d904d.png">


これで準備は完了、loginに必要な６桁の認証番号は次のコマンドで取れます。

```bash
$ mfa otp ${key}
123456
```
※otp=One Time Pass。。。かな？

ちなみにmfaはpipが使えることからわかるようにきちんとPyplで公開されてます。
https://pypi.org/project/mfa/
ソースはここ。
https://github.com/limeburst/mfa


Python楽しいですね。
NEONの逆数推定命令の精度 : Accuracy of NEON reciprocal estimation instruction

#背景 / background
最近仕事で浮動小数点除算を含むフィルタ処理の高速化の需要があるらしく、精度もそんなに必要ない処理なので精度を落として高速化できそう。
ARMのNEON命令には除算命令がなく、除算したいときはVRECPE命令で逆数を推定しNewton-Raphson法で必要な精度まで補正するらしい。
精度要求を緩和することによる除算の高速化を目標に以下の項目について調べた。
There are demand for speedup of image filter which include division. The accuracy of filter does not need to meet full accuracy of single precision float. In ARM NEON ISA, there are no division instruction. When it is needed, we can estimate reciprocal value with VRECPE instruction and correct it by Newton-Raphson methods and then multiply. I set speedup of division by reducing its accuracy as the goal, and investigate below things.

- VRECPEの精度 / accuracy of VRECPE
- 初期逆数推定値の補正とその精度 / reciprocal value correction methods and its accuracy
- それぞれの補正方式の速度 / speed of these method

この記事は最初のVRECPEの精度の評価に関して書く。
This article focussed on accuracy of VRECPE.

#調査 / investigation
raspberry pi 3 model b+を使って検証した。
1/2 ~ 1/1048576まで分母を増やしていって真値と推定値との相対誤差の最大値を計算してみた。
検証コードは
https://github.com/sanmanyannyan/neon_div_accuracy_analysis
に置いた。
I used raspberry pi 3 model b+.
I evaluated relative error of 1/2 ~ 1/1048576, and searched maximum relative error of these.

```
max relative difference:0.002853
true value:0.007299 = 1 / 137.000000
 est value:0.007278
true value:0 01110111 1101'1110'0101'1101'0110'111
 est value:0 01110111 1101'1101'0000'0000'0000'000
```

#結果 / result
暗黙の1が入っていることを考えると8bit弱といったところ。
VRECPEの[命令仕様](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ij/CIHCHECJ.html)には精度に関する記述がなかったので実装ごとに精度が違ってるのかも。
知ってる人いたら教えてほしい。
With consideration of leading hidden bit of float, the accuracy is 7bit.
There are no mention about accuracy of VRECPE in ARM manual, so this result may differ from other CPUs.
UITextViewでHTMLテキストを表示させてみる

# はじめに
HTML形式の文字列をNSAttributedStringに変換して、UITextViewで表示させるサンプルはネット上にたくさん上がっていますが、システムフォントとは異なるフォントで表示されてしまって少しハマりました。

# TL;DR
GitHubにサンプルソースを上げました。
https://github.com/Todate/HtmlTextViewSample

# 確認環境

Xcode 10.1
swift 4.2.1

# ソースコード

パースする前に全体をシステムフォントを使う事を書いたspanタグで囲んでいる所がミソです。

```swift
class HtmlTextView: UITextView {
    
    /// HTML形式の文字列を解析して表示する
    ///
    /// - Parameter sourceText: 変換する文字列
    func setHtml(_ sourceText: String) {
        self.dataDetectorTypes = [.link, .phoneNumber]
        self.attributedText = parseHtmlString(sourceText)
    }
    
    /// HTML形式の文字列をNSAttributedStringに変換する
    ///
    /// - Parameter sourceText: 変換する文字列
    /// - Returns: HTMLドキュメントに変換されたNSAttributedString
    func parseHtmlString(_ sourceText: String) -> NSAttributedString? {
        
        let fontSize = self.font!.pointSize
        let useSystemFontSpanFormat = "<span style=\"font-family: '-apple-system', 'HelveticaNeue'; font-size: \(fontSize)\">%@</span>"
        let modifiedFont = String(format: useSystemFontSpanFormat, sourceText)
        
        guard let encodeData = modifiedFont.data(using: .utf8) else {
            return nil
        }
        
        let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
            .documentType: NSAttributedString.DocumentType.html,
            .characterEncoding: String.Encoding.utf8.rawValue
        ]
        
        guard let attributedString = try? NSAttributedString(data: encodeData, options: options, documentAttributes: nil) else {
            return nil
        }
        
        return attributedString
    }
    
}
```

# 注意点

- サンプルソースでは、個人的に主要と思われるタグをピックアップして、表示の確認を行なっています。
使用可能なタグと不可能なタグがあるので、使用する時は注意が必要です。
- `isSelectable`を`true`にしないと、`<a>`タグでのブラウザ起動・電話発信ができません。
- ScrollViewの中に入れて、TextView自体はスクロールさせたくないケースもあるかと思いますが、動的に高さを求めてサイズを固定してしまう方法で解決できます。

```swift
// 仮で付与した高さの制約を解除
textViewHeightConstraint.isActive = false

// 高さを求めて固定
let height = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude)).height
textView.heightAnchor.constraint(equalToConstant: height).isActive = true

// スクロール禁止
textView.isScrollEnabled = false
```

仮の高さを指定しないスマートな方法を知りたい...
（スクロールするコンテンツの高さが決まらないとInterface Builderさんに怒られる）

# おわりに

TextViewなのに、imgタグで画像表示できたり、tableタグで表組みができたり...
お主、本当に**TextView**なのか？(´･ω･`)
2018年のお仕事の振り返り

決算期
まず　うちの会社の決算期は 5月末締めなので、一般的な年周期と半年ずれてますが
ここでは 会社でなはく2018年を４Qとして記します

#2018年の仕事の振り返り
2018年は去年に比べると少し落ち着き、仕事自体も少し減らし
身の丈かな～　というところ
ただ2019年にむけて 新しいことを始めたり事務所借りたり スタートの年でした
日本の税制上、利益の半分は税金になるので、利益分は先行投資に回し次期に期待ですね
2019年に向けて力を貯めます！

1月から3か月ごとの クォーターで振り返ります

#1Q
前年より継続し、超大型ソーシャルゲームのサーバインフラ案件を担当させてもらいました
（案件名は言えないけど大人気IPで世界トップのIT会社も絡む大きな案件でした）
Goの勉強ついでに チャットBOTを作ってAWSを操作したり
大量リクエストさばくために、KinesisやらHadoopしたりサーバレス設計にしたり
未経験なことが出来てありがたかった
やっぱ これからは人が足りなくなるので DevOps、RPAは重要だと思った

また前年より継続し、ソーシャルゲームの開発を行いました
クライアントからサーバインフラまで、気が付けば全部を面倒みていました
最初はクライアント技術者として参入したんだけど、現場にサーバインフラ強い人がいない
という　なんとも悲惨なプロジェクトでして・・

あとは 知人のスタートアップで WebGLを使ったゲームエンジンの開発を手伝いました
WebGL以外にも RustからEmscriptenでAsm.jsはいたり
あの会社は絶対伸びるので今後にも期待です！
また　挨拶に行かなきゃ

#2Q
新しいメンバーも入りました
以前 ソーシャルゲームの運用やCSメインだった子で、サーバインフラ技術者になりたい
という事です
やる気あって真面目なので　ぜひ育てていきたいと思います

海外の仮想通貨取引所案件を手伝いました
色々とチームメンバーも増え、仮想通貨取引所も自力で開発可能になりました
もし　取引所のご用命は　ぜひうちにｗ
セキュリティの固い取引所の開発 フルセット  　2億〜　でオッケーです

#3Q
だいたい案件が一区切りします
仮想通貨、３Dライブラリは継続

新規のコンシュマーゲームの開発を手伝います
メインプログラマとしてプリプロから関わる事になりました
ナンバリングタイトルで　今まで愛されてきた作品なので　ほんとうにうれしいです

#4Q
3Qの案件に加え

超大手ソーシャルゲームの新規開発にジョイン
今回はクライアントで、シェーダーや負荷対策などの　コアな部分をメインに行います
私自身 そのIPが大好きでグッズもたくさん持っているし ライブも何度も行っているし
聖地巡礼も当然してあるので
ほんとうに　嬉しいです

VTuber案件が何個か。私のやりたい事の１つが アバターです。VTuberはそれに近く楽しみ

そして、昔から念願だった「幼女研究所」を設立しました！
昔から　プリキュアやプリパラ、アイカツなどの 女児向けコンテンツの３Dを作りたかった
３DCG業界なら　プリキュアのエンディングダンスが 日本の３DCGのベンチマークだと思ってるはず
その　プリキュアと戦いたかったのです
具体的には リアルタイム３DCGアニメーションのクオリティーを上げたいと思ってます
同人で漫画が描けるようになり数十年経過したが
いまだに　同人でアニメを作るのは難しい
２０２５年には　同人アニメが普通に観られる世の中になっているでしょう

#2019年に向けて
事務所が ほぼ決定して審査待ちですが
事務所を一刻も早くビルドアップしたいと思います

VTuberも専門スタッフ集めてがんばる

コンシュマー向けのIPものは 本プロを私がリードして開発します
規模も大きいのでやりごたえあります

スマホ向けの大手タイトルも完成のため 勉強しながら頑張っていきます

来年よりソーシャルゲームのサーバー開発が始まります
こちらもチームリーダーとしてちゃんと　すごく良いものを提供します

あとはWebの細々としたプロダクト、社内DevOpsの充実、仮想通貨取引所、ECパッケージ
色々と話しが来ているので 人集めに翻弄されそうですが
とりあえず　今年をちゃんとFinishさせてから　考えよう！
S3のストレージタイプ(標準, 低頻度,1ゾーン低頻度)を使い分けてストレージコストを最小化する

# 追記

# 概要

S3には4つのストレージタイプがあり用途によって使い分けることでコストを最小化できます。

例えばWebサービスで配信する画像のように「頻繁にアクセスする」用途では「標準」が最適ですが、バックアップデータ（データベースダンプやサイトを構成するファイル群）やログファイルのように「**たまにしか使わないけど、必要になった場合はすぐに取り出したい**」というような用途の場合は「低頻度ストレージ（標準 or 1ゾーン）」を利用することでストレージコストを低減できます。

この記事では、以下について検討してみました。

- 低頻度ストレージを利用するとどれくらい料金が節約できるのか？
- どのような用途の時に利用すればよいのか？
- 留意点（落とし穴）は何か？

[(公式)ストレージクラス - Amazon S3（クラウドストレージ）｜AWS](https://aws.amazon.com/jp/s3/storage-classes/?nc=hl&pg=ft)

# ストレージタイプの比較

| ストレージタイプ | 識別子 | 用途 | レイテンシ | 保管されるゾーン数 | 最小ストレージ期間  | 可用性 | 保管料金([^price]) | 標準を100とした場合の料金 |
|:--|:--|:--|:--:|:--:|:--:|:--:|:--:|:--:|
| 標準 | STANDARD | 配信画像・映像、分析データなど | ミリ秒 | 3以上 | ー | 99.99% | 0.025 | 100 |
| 標準/低頻度 | STANDARD_IA | バックアップ | ミリ秒 | 3以上 | 30日 | 99.90% | 0.019 | 76 |
| １ゾーン/低頻度 | ONEZONE_IA | ログ | ミリ秒 | 1 | 30日 | 99.50% | 0.0152 | 60.8 |
| Glacier | REDUCED_REDUNDANCY | 長期アーカイブ | 分または時（選択） | 3以上 | 90日 | 該当なし | 0.005 | 20 |

※低頻度ストレージタイプの識別子に含まれる"IA"は**Infrequent Access（まれなアクセス）**の略です。

なお、本記事の投稿後(18/11/08)に以下の記事がAmazon公式ブログで公開されてました。日付は2018/11/27。こちらもストレージタイプの違いや用途・留意点について記載されていますのでご覧いただくと良いかと思います。

[新機能- Intelligent TieringによるAmazon S3の自動的なコスト最適化( | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/new-automatic-cost-optimization-for-amazon-s3-via-intelligent-tiering/)

# 低頻度ストレージを利用するとどれくらい料金が節約できるのか？

「保存」に関してだけで考えると約25%～40%の低減が可能です。（上述した比較表の「標準を100とした場合の料金」を参照）

ただし、「データの保管期間が短い場合」や「取り出し頻度が多い場合」は「低頻度ストレージ」のほうが「標準ストレージ」より高額になることもありえるので注意が必要です。詳しくは後述。

# 低頻度ストレージ検討時の留意点（落とし穴）

低頻度ストレージを選ぶ場合は、「最小ストレージ期間」に注意が必要です。
これは１日や１週間しか保存しないデータでも30日分の料金が請求されるという意味です。
例えば毎日上書きするデータや１週間しか保存しないデータは「標準」で保存したほうが有利です。
(具体的には、毎日上書きする場合は1ヶ月で30オブジェクトx30日分の課金発生！！）

【2021年3月1日追記】この料金仕様は直観と違うので、たぶん苦情が多かったのだと思いますが、[S3の料金(AWS公式ページ)](https://aws.amazon.com/jp/s3/pricing/)に明記されるようになっていました。

> S3 Intelligent Tiering、S3 標準 – IA、S3 1 ゾーン – IA のストレージには、最低 30 日間のストレージ料金が課金されます。
> 30 日が経過する前にオブジェクトが削除された場合、その 30 日の残りのストレージ料金が日割りで請求されます。
> 30 日が経過する前にオブジェクトが削除されたり、上書きされたり、別のストレージクラスに移行されたりした場合、
> 通常のストレージ利用料金に加えて、その 30 日の残りのリクエスト料金が日割りで請求されます。

また保管料金そのものは「標準ストレージ」と比べると安いですが、データの取り出し時に料金が加算されることの考慮も必要です。（目安としては0.01USD/GB） 
[料金（低頻度アクセス） - Amazon S3（クラウドストレージ）｜AWS](https://aws.amazon.com/jp/s3/pricing/?nc=sn&loc=4)

表現を変えると「取り出し時課金」がないので、頻繁にアクセスされるデータは「標準ストレージ」を選択します。

以上より以下のような特徴のある場合は低頻度ストレージで保管するのに適していると言えます。

- 頻繁にはアクセスしない
- 必要になった場合は迅速に取り出したい
- 30日以上保管する[^2]
- （さらに1ゾーンの場合は）重要度が低い（万が一消えても復元できる）

# AWS CLIでの利用

aws cliで利用する場合は、 ```--storage-class <識別子> ``` と指定することでストレージクラスを指定できます。
以下は、1ソーン/低頻度を指定した例です。（指定しない場合は「標準(STANDARD)」と扱われます）

```bash
aws s3 cp /path/to/object s://bucket/path/to/ --acl private  --storage-class ONEZONE_IA
```

※識別子ONEZONE_IA は aws-cliのバージョン1.15.83以降でないと利用できません。(1.14だと以下のエラーが発生します。）

```
aws: error: argument --storage-class: Invalid choice, valid choices are:

STANDARD                                 | REDUCED_REDUNDANCY                      
STANDARD_IA                             
```

[^price]: GBあたりの単価で単位はUSD。東京リージョンの最初の50TB

# 追記

S3上のオブジェクトの「ストレージクラスの変更」ダイアログでの表示

![](https://i.gyazo.com/fbc4d94d1909b14aaf2f3de7cc74ed3e.png)
Generatorを用いたレンダリングループが簡単な実験に便利なんじゃないかって話

グラフィクスAPIを用いるプログラムを多数書くとちょっとした実験を回して試してみたいことが度々ある。僕が少し実験するときによく使っているジェネレーターをもちいる方法をここでは紹介しよう。
レンダリングループという概念を一種のジェネレータとして見てみると様々な便利な点が見えてくる。
(Unityを知っている人ならコルーチンの話をしているだけじゃんっていうしょうもない記事である)

# 前提(ジェネレータ関数の話)

あたかも途中で止められるように振る舞う関数のことをジェネレータ関数という。例えば、Javascriptでは以下のような`function`の末尾に`*`のついた関数を定義すると途中で止められるように振る舞う。

```javascript:main.js
function* test(){
  yield 1;
  yield 2;
  yield 3;
}
```

この関数に対して以下のような呼び出しを行えば、`1,2,3`と順番に表示されて終わる。

```javascript:main.js
for(let i of test()){
   console.log(i);
}

```

これは以下と同じ。

```javascript:main.js
let itr = test();
while(!itr.done){
   console.log(itr.next())
}

```

# レンダリングループとして使う

これが強いのは無限ループをジェネレータに普通に書いた場合。

```javascript:main.js
function* test(){
   while(true){
      yield 1;
   }
}
```

この関数を普通に呼び出したらフリーズしてしまうがこういうふうに書くと無限に続くがフリーズしないジェネレータとして用いれる。

```javascript:main.js
let iterator = test();
function onloop(){
   iterator.next();
   requestAnimationFrame(onloop);
}
```

さて、この関数の便利さは何だろうか。ループの外が最初のタイミングしか呼ばれないことを考えるとこれは初期化処理として使える。

```javascript:main.js
function* test(){
   let buffer = gl.createBuffer();
   gl.bindBuffer(gl.ARRAY_BUFFER,buffer);
   // ....
   // 様々な初期化処理

   while(true){
      // 各レンダリングループ
   }
}
```

こうして書くと各レンダリングループ内で初期化時に使った変数を参照できる。updateやstartなどの関数を定義して毎フレーム呼び出すような仕組みを考えてメンバ変数に代入するような機構を書かなくても、ジェネレータを用いるとこういう構造がスマートにかける。

# シーン遷移として使う

遷移の必要な複数個のiteratorがあって、順番に再生したいならJavascriptのイテレータは便利だ。`yield*`と書けばそのイテレータが終わるまで`yield`し続けてくれる。これを用いるとシーン遷移が楽にできる。

```javascript:main.js
function* main(){
   var scenes = [scene1(),scene2(),scene3()];
   scenes.forEach(s=>s.next()); // 最初だけ初期化のために呼んでおく
   for(let scene of scenes){
      yield* scene;
   }
}
```

一番メインのイテレータをこう書けば、scene1,scene2,scene3のイテレータを順番に再生してくれる。

```javascript:main.js
function* scene1(){
   while(true){
      // scene1の更新処理
      if(/*scene1の終了判定*/){
         return;
      }
   }
}
```

# アニメーションの合成に使う

複数個の物体がシーンの中を動いているとき、しっかりと書くならそれぞれのアニメーションを管理するクラスなどを設計して、ちゃんと毎回アップデートされるような構造をつくるべきだ。しかし、ちょっとした試作でせいぜい数個の物体を動かしたいだけならそれは不便だ。シーン中のアニメーション全体のイテレータを含む配列が一つあればこれは解決ができる。

```javascript:main.js
function* main(){
   let animations = [anim1(),anim2(),anim3()];
   while(true){
      animations.forEach(a=>a.next());
      yield;
   }
}
```


# 最後に

レンダリングループは無限に続くループに見えるが、実際にはwhileでループを回していたらフリーズしてしまう。だからこそrequestAnimationFrameを用いるが、これだと全体のループとしての構造が見えにくい。
必要なのは初期化と更新だけでほとんどの場合十分なのだ。このプリミティブなレンダリングループにおけるそれぞれの構成要素は初期化とループでのアップデートだけ取れれば良いように思える。
であるならば、これらはジェネレーターとよくフィットするような構造であるはずだ。無限回の取り出せる操作という無限ループのイテレータはまさにこのような用途としてよくふっとしたものなのではないだろうか。
MySQL8.0からMySQL5.7に戻す

## 背景
この前brew upgradeをしたら、MySQLのバージョンが8.0に上がってしまっていて

```
$ mysql.server start
Password:
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/****.local.pid).
```

と起動しようにもできなくなった。
MySQLを急ぎで使う必要があったため、もともと使っていたMySQL 5.7に戻すことにしたのだが、ググると様々な情報があり惑わされたので、自分が行ったことをここにメモる。
（自分が調べた中には、一度`/usr/local/var/mysql`以下の削除を伴う方法などもあったのだが、自分は特に削除などは行わずに復旧できたので、データを消したくない場合にも有効）



## 環境
- macOS Sierra(10.12.4)
- Homebrew(1.8.0)
- MySQL(5.7.12 -> 8.0.12にしてしまった)


## 注意事項

念の為、事前に/usr/local/var/mysql以下のバックアップを忘れずに行う。


## 手順

```
$ mysql --version
mysql  Ver 8.0.12 for osx10.12 on x86_64 (Homebrew)
```
として、MySQLのバージョンが8.0系であることを確認したら

```
$ brew uninstall mysql
```

として、MySQL 8.0をアンインストール。

すると

```
Uninstalling /usr/local/Cellar/mysql/8.0.12... (255 files, 233.3MB)
mysql 5.7.12 is still installed.
Remove all versions with `brew uninstall --force mysql`.
```

と言われ、MySQL5.7がまだインストールされていることに気づき

```
$ brew link mysql
Linking /usr/local/Cellar/mysql/5.7.12... 93 symlinks created
```
としてmysql5.7のsymlinkを再設定。あとは


```
$ mysql --version
```

としてmysqlのバージョンを確認し、mysql5.7になっていればok。


```
mysql.server start                                                                                                                                                                                          [/usr/local/var]
Starting MySQL
........ SUCCESS!
```
無事起動することができた。



## 最後に
brew upgradeは慎重に。

## 参考
- [macのmysqlがmysql8.0になってたので、mysql5.7に戻したときのメモ](http://mashup.hatenablog.com/entry/2018/06/26/132536)
Rubyで時刻の書式化の色々まとめ

#背景
Ruby技術者認定試験の勉強をしていて、毎回間違える時刻の書式化（特にstrftimeメソッドの書式設定）をこの際まとめて自己満足してしまおう、あわよくば色々な人に見てもらいたいな、というもの。

#Timeクラス
Timeクラスは、OSが提供するシステムの時刻機能をRubyから使用するものです。もっとも基本的な機能として`Time.now`または`Time.new`で現在時刻を得る機能があります。ただし、Timeクラスは時刻は提供しますが日付まで提供することはできません。

```ruby:main.rb
p Time.now  #  => 2018-11-07 23:07:30 +0900
```

#(おまけ)Dateクラス
`require 'date'`を実行することによって、日付を表現するDateクラスと、日付と時刻を表現するDateTimeクラスを使用することができます。Dateオブジェクトは、年月日から日付オブジェクトを得ることで様々な使い方をすることができます。また、閏年判定や現在日時を得る機能などもあります。

```ruby:date.rb
require 'date'

date = Date.new(1995,12,21) #年月日から日付オブジェクトを生成
p date

p Date.leap?(date.year) #1995年がうるう年かどうかを判定

today = Date.today #現在の日付を日付オブジェクトとして生成
p today #執筆当時の日時

p today.sunday? #今日が日曜日かどうかを判定
```

実行結果

```
#<Date: 1995-12-21 ((2450073j,0s,0n),+0s,2299161j)>
false
#<Date: 2018-11-07 ((2458430j,0s,0n),+0s,2299161j)>
false
```

#Time#strftime メソッド

`Time#strftime`は、Timeオブジェクトが保持する時刻を書式文字列で指定した形式で書式化して文字列に変換するメソッドです。

```ruby:time.rb
p Time.now.strftime("%x") # =>"11/07/18"
```

Date、DateTimeクラスについても同じ使い方です。

#書式設定の文字列フォーマット

strftimeメソッドで、書式文字列として使われるもの（time.rbで言う「%x」）が結構種類が多くややこしいので（個人的な感想）まとめてみます。

##よく使いそうなもの

- `%Y` ...西暦
- `%y` ...西暦の**下２桁**（00-99）
- `%m` ...月（01-12）
- `%d` ...日（01-31）

```ruby:time.rb
p Time.now.strftime("%y/%m/%d") # => "18/11/08"
p Time.now.strftime("%Y-%m-%d") # => "2018-11-08"
```

##知っておくといいもの

- `%A` ...曜日の名称（Sunday, Monday, ...）
- `%a` ...曜日の**略称**（Sun, Mon, ...）
- `%H` ...時（24時間表記。00-23）
- `%I` ...時（12時間表記。01-12）
- `%M` ...**分**（00-59）月と間違えやすい。
- `%S` ...**秒**（00-60、60はうるう秒）大文字です。
 - `%s` ...1970年1月1日0:00:00からの経過秒数

```ruby:time.rb
require 'date'

p DateTime.now.strftime("%Y/%m/%d(%a) %H:%M:%S")
# => "2018/11/08(Thu) 01:21:16"
```

##便利な表現

- `%c` ...日付と時刻。小文字。
 - `%C` ...西暦の上２桁

```ruby:time.rb
p Time.now.strftime("%c")
# => "Thu Nov  8 01:27:13 2018"
```

- `%D` ...日付。**`%m/%d/%y`**と同じ。順番に注意。
- `%F` ...日付。`%Y-%m-%d`と同じ。
- `%X` ...時刻。`%H:%M:%S`と同じ。
- `%R` ...時刻。`%H:%M`と同じ。（@scivolaさんより。ありがとうございます！）
- `%x` ...時刻。`%D`と同じ。

##その他
strftimeメソッドの文字列の中で%を単独で使いたい場合は`%%`と表記します。

```ruby:time.rb
p DateTime.now.strftime("%Y/%m/%d(%a) %H:%M:%S　There is a 40%% chance of rain today.")

# => "2018/11/08(Thu) 01:55:52　There is a 40% chance of rain today."
```

他にもたくさんのフォーマットがあります。もっと知りたい方は[Rubyリファレンスマニュアル（class Time）](https://docs.ruby-lang.org/ja/latest/class/Time.html#I_STRFTIME)を見てみてください。

#まとめ

なかなか多くの種類のフォーマットが用意されていて、まとめたつもりが逆に混乱を招きそうです。いい覚え方や誤字脱字、指摘訂正などどんどんお待ちしています。
円周率チャレンジにアルゴリズムでチャレンジ

[円周率チャレンジ](https://rirosi.net/plus2/) というゲームが流行中です！

プログラムを使って良い解法を探索してみたので、考えたことを書いていきます。

## 円周率チャレンジとは

> ## 円周率チャレンジ
>
> 「円周率チャレンジ」は，「ルートをとる(sqrt)」「2を足す(+2)」の２種類のボタンを使って，
> 数字を円周率に近づけていくゲームです。できるだけ少ない回数でハイスコアを狙いましょう！

例えば +2, √, +2 という手順で操作を行うと、数値は:

0 → 2 → 1.41421.. → 3.41421..

と変化して、円周率 π = 3.141592.. に近い数値になります。

もっと手数を増やせば、 **さらに円周率に近づけられるはず** 。その最良手順を探すゲームです。

## 解法1: ビット全探索

やはり最初に試すのは全探索でしょう！

手数 N の最良手順を探すことを考えます。ここで手順とは「ルートをとる」と「+2 を足す」の2種類の要素からなる長さ N の列です。手順をすべて列挙して、計算結果と円周率を実際に比べてみれば、何が最良か分かるはずです。

2種類の要素を 0, 1 で表せば、手順はビット列として扱えて、配列を使うより経済的に全探索できます。参考: [ビット演算 (bit 演算) の使い方を総特集！ 〜 マスクビットから bit DP まで 〜 - Qiita](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361#bit-%E5%85%A8%E6%8E%A2%E7%B4%A2)

操作列の「実行」は次のようなコードです。下位ビットから順番にみていき、 0 なら +2 の操作を、1 ならルートをとる操作を実行して、最終結果を得ます。

```rust
fn eval(ops: i64, n: usize) -> f64 {
    let mut value = 0.0_f64;

    for i in 0..n {
        if (ops & (1 << i)) == 0 {
            value += 2.0;
        } else {
            value = value.sqrt();
        }
    }

    value
}
```

これをすべての操作列に適用して、円周率の差が最小のものを探します。抜粋:

```rust
    //..
    let mut best_diff = 1e9; // 最小の差
    let mut best_ops = 0; // 最小の差を達成した操作列

    for ops in 0..1 << n { // 操作列の全列挙
        let value = eval(ops, n); // 操作の実行
        let diff = (value - PI).abs(); // 円周率との差

        if best_diff > diff { // 最小値の更新
            best_diff = diff;
            best_ops = ops;
        }
    }
    //..
```

[コード全体はこちら](https://play.rust-lang.org/?version=stable&mode=release&edition=2015&gist=61011280947f9a6641333f63bc0b90cb)

時間がかかるのでリリースモードを使って (`cargo run --release`) 実行すると、こんな感じで手数ごとの良い操作列を出します:

```
手数 数値                差                 操作
#00 0.0000000000000000 3.1415926535897931
#01 2.0000000000000000 1.1415926535897931 +
..
#27 3.1415927103795092 0.0000000567897160 +/++ +/// //// //// ++// +/++ ++/
#28 3.1415926624518788 0.0000000088620857 +//+ ++// //// //// /++/ /+/+ +++/
```

これで手数 N=28 ぐらいまでの最良(?)手順が求まりました。それ以上は時間がかかりすぎるので、別の方法で探索したほうがよさそうです。

## 解法2: 半分全列挙

全探索では 0 から π に近づけましたが、逆に π から 0 に近づける操作列も考えられます。つまり、

> π から始めて、「2を引く」と「2乗する」を組み合わせて 0 に近づけるゲーム

をやってもいいです。このことから、0 と π の **両端から良い手順を探して繋ぐ** という解法が出てきます。いわゆる半分全列挙です。

具体的には:

- 手数 N/2 の操作 F をすべて列挙して、その結果の数値を A とするとき、(A, F) というペアをすべて記録しておく。
- 次に、手数 N/2 の操作 G をすべて列挙して、それを π から逆算したときの数値を B とする。
- メモから (B, F) に最も近いものを探して操作 F+G を作れば、これは π に近い数になる。

```
        F            G
    0   →   A ≒ B   →   π
```

計算量はどうでしょう。

- メモ ((A, F) の配列) を A についてソートしておけば、メモから探すのは二分探索ができます。
- ソートを工夫しなければ、全体として O(2^(N/2) log N) です。
    - これなら **N = 50 ぐらいまでいけそう** 。

[コード全体](https://play.rust-lang.org/?version=stable&mode=release&edition=2015&gist=17cf3535110ee76685581525e57cad15)

しばらく待つと、53手のかなり強い手順が得られます。小数点以下15桁まで一致。

## 終わりに

執筆時点で1位の (手数 53, スコア Infinity) には及びませんでした。おそらく二分探索の段階で近似的になりすぎてしまうからかなと思います。ヒューリスティックなアルゴリズムや数学的なアプローチの余地がまだまだありそうです。

なにはともあれ、半分全列挙のよい練習になりました。

## 参考

- [プログラミングコンテストチャレンジブック \[第2版\]【委託】 - 達人出版会](https://tatsu-zine.com/books/procon-challenge)
    - 通称蟻本。半分全列挙が載っていました
単語ベクトルのコサイン類似度行列を簡単に求める

## はじめに
[word2vec](https://code.google.com/archive/p/word2vec/)や[fasttext](https://fasttext.cc/)などで得られた単語ベクトルから類似度の高い単語をランキングする際に，コサイン類似度の行列があれば楽そうなので勉強がてら実装してみた．

## 参考
- [コサイン類似度について](http://www.cse.kyoto-su.ac.jp/~g0846020/keywords/cosinSimilarity.html)
- [Qiitaの数式チートシート](https://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)

## コサイン類似度とは
２つのベクトルのなす角θのコサインの値を求めている．

```math
\cos{(\vec{p},\vec{q})}= \frac{\vec{p} \vec{q}}{|\vec{p}| |\vec{q}|} = \frac{|\vec{p}| |\vec{q}|}{|\vec{p}| |\vec{q}|} \cos\theta = \cos\theta
```

## コード
単語ベクトルのコサイン類似度の行列を計算する関数．単位ベクトルに正規化した後に，全ての単語の組み合わせの内積を計算してコサイン類似度を計算している．．

```python
import numpy as np
def cosine_similarity_matrix (vectors):
    unit_vectors = vectors / np.linalg.norm(vectors, axis=1, keepdims=True)
    return np.matmul(unit_vectors, unit_vectors.T)
```

## 実行例
コサイン類似度が高い順に単語を出力する例．

```python
import numpy as np
import pandas as pd

# 10,000語の単語とベクトル（２５６次元）
words = ['word_{}'.format(i) for i in range(10000)]
vectors = np.random.rand(10000, 256)

# コサイン類似度行列を計算
matrix = cosine_similarity_matrix(vectors)
df = pd.DataFrame(matrix, index=words, columns=words)

# word_1と類似度が高い順に単語を出力
result = df['word_1'].sort_values(ascending=False).drop(index='word_1')
print(result)

# word_6049    0.809170
# word_7033    0.808725
# word_8884    0.805947
# word_6607    0.805759
# word_8257    0.805468
# word_1865    0.805220
# word_5849    0.805014
# word_4910    0.804502
# word_4079    0.804210
# word_6249    0.803592
# ...
```

## さいごに
コサイン類似度は２つのベクトルの成す角のみを考慮しているが，ベクトルの大きさは関係ないのだろうか？と疑問に思った．今後時間があるときに実際に単語ベクトルを求めて適用してみようと思う．
javascript node と browser と worker での挙動を比較してみた

# はじめに
今更感はありますが、まとめてみようと思いました。

# グローバルスコープが保持しているオブジェクトの違い
node.js: Object
browser: window
worker : workerGrobalScope

node.jsは、シンプルにオブジェクトです。
browserは、開いているウインドウを意味するインスタンスになっています。
workerのグローバルスコープは意識することが無いと思います。

# 必要不可欠な記述の差
## node.js: サーバーを記述するという書き方。
ライブラリの読み込み

~~~javascript
const server = require("http").createServer()
~~~
何かが起こったら何かをするという考えでイベントハンドラーを記述する。

~~~javascript
server.on("get", (req, res) => {
  res.writeHead(200, {'Content-Type' : 'text/html'});
  res.end("hello world");
})
~~~
サーバーなのでtcp udp のポート番号とIPアドレスの指定をして、
通信を待ち受ける。

~~~javascript
server.listen(8080)
~~~
ここまでがnode.js上での主要な書き方です。


## browser: ビルトインオブジェクトが多い
HTMLElementの扱いとイベント処理を記述することがメインです。最近では端末のデバイスにアクセスできる方向もあります。

エレメント

~~~javascript
const myArt = document.createElement("article");
myArt.id = "today";
myArt.class = "main article";
myArt.appendChild(new Text("hello world"));
document.body.appendChild(myArt);
~~~
イベント処理

~~~javascript
myArt.addEventListener("drop", ((e) => e.style.backgroundColor = "#880088"));
~~~

以上がbrowserでの主要な書き方です。

## worker: browser側でインスタンスを作成
インスタンスからのメッセージを受け取れるように、addEventListenerを記述します。

~~~javascript
//browserから、workerを作成。
const worker = new Worker('worker.js');
worker.addEventListener("message", (e) => alert(e.data));
worker.postMessage('Hello World!');
~~~

~~~javascript
self.addEventListener('message', (e) => {
  console.log(e.data + "from View");
  self.postMessage(e.data + "from worker");
});
~~~

worker内では、基本的にすごく遅い計算結果やpromiseの結果を返却したりします。
serviceWorkerの場合は、利用方法が違うようです。

よくまとまっている記事がありましたので、　[こちら](https://qiita.com/y_fujieda/items/f9e765ac9d89ba241154)　をどうぞ…

以上、javascriptの言語としての違いというより、実行環境の違いをまとめてみました。
シェルスクリプト　雑多メモ

## 環境
* os : mac 10.13.6
* シェル :　zsh

## 基本
`cd xx` :      ディレクトリ移動
`cd ~` :      ホームディレクトリに移動
`cd ..` :       一つ上のディレクトリに移動
`ls` :         ディレクトリ内のファイル一覧表示
`ls -a` :隠しファイル含めて表示
`pwd` :カレントディレクトリ表示
`⌘+r` :入力履歴を検索
`mkdir` :ディレクトリ作成
`touch` :ファイル作成
`rm` :ファイル削除
`mv` :ファイル移動

## `unzip`
```shell
unzip hogehoge
```


## peco
めっちゃ便利

```
#以下でインストール
brew install peco
```

```shell
#lsの出力結果をpecoに渡して、それを検索できる
#try now!!!!
ls | peco
```

## `pbcopy`

```shell
#クリップボードにコピーするスクリプト
#標準出力の結果をコピーする
echo hoge | pbcopy # "hoge" をコピー
cat hoge.txt | pbcopy #ファイル内容をコピー
Ionic/Angular で GoogleMaps (AGM)

# はじめに

Angular Google Maps というライブラリをつかって、Ionic で Google Maps を使ってみたので、まとめます。

# AGM とは

Angular で簡単に Google Maps JS API が使えるライブラリです。

https://github.com/SebastianM/angular-google-maps

# セットアップ

インストール

```
npm install --save-dev @agm/core
``` 

なお、Angular 5 では、beta.2 を使用しないと落ちます https://github.com/SebastianM/angular-google-maps/issues/1511

`app.module.ts` で `AgmCoreModule.forRoot()` を import

```app.module.ts
@NgModule({
  // ...
  imports: [
    AgmCoreModule.forRoot({
      apiKey: 'Google Maps の api key'
    }),
  ]
// ...
});
```

(Ionic のみ) 使用する Page で `AgmCoreModule` を import

```page.module.ts
@NgModule({
  // ...
  imports: [
    AgmCoreModule
  ]
// ...
});
```

# 使い方

## 基本的な使い方

```html
<agm-map [longitude]="135" [latitude]="35" [zoom]="16"></agm-map>
```

高さを css で指定する(必須)。

```css
agm-map {
  height: 200px;
}
```

[![Image from Gyazo](https://i.gyazo.com/cc6f75b9edd80765825e52199ef795d5.png)](https://gyazo.com/cc6f75b9edd80765825e52199ef795d5)

## マーカーを表示

https://angular-maps.com/api-docs/agm-core/directives/agmmarker

```html
<agm-map [longitude]="135" [latitude]="35" [zoom]="16">
  <agm-marker [longitude]="135" [latitude]="35" label="P"></agm-marker>
</agm-map>
```
[![Image from Gyazo](https://i.gyazo.com/1ae9f73a741a4c229a8c3ac4781edc54.png)](https://gyazo.com/1ae9f73a741a4c229a8c3ac4781edc54)

## 円を表示

https://angular-maps.com/api-docs/agm-core/directives/agmcircle

```html
 <agm-map [latitude]="35" [longitude]="135" [zoom]="16">
    <agm-circle
      [latitude]="35" [longitude]="135" [radius]="20"
      srokeColor="white" [strokePosition]="0" [strokeOpacity]="1.0" [strokeWeight]="2"
      fillColor="white" [fillOpacity]="1.0" ></agm-circle>
  </agm-map>
```

[![Image from Gyazo](https://i.gyazo.com/fababd45a8d50f3d0cbab41ea2294b32.png)](https://gyazo.com/fababd45a8d50f3d0cbab41ea2294b32)

strokeWeight は px ですが、radius は地図上での大きさなので、ズームすると相対的に線が細くなります(円は大きくなるが、線の太さは変わらない)。

strokeWeight を単独で指定すると落ちます。`[strokePosition]="0"` を追加すると直ります（原因はよくわかりませんでした）。https://github.com/SebastianM/angular-google-maps/issues/770　

## 線を表示

https://angular-maps.com/api-docs/agm-core/directives/agmpolyline

```html
  <agm-map [latitude]="35" [longitude]="135" [zoom]="16">
    <agm-polyline [strokeWeight]="2">
      <agm-polyline-point [latitude]="34.999" [longitude]="134.999"></agm-polyline-point>
      <agm-polyline-point [latitude]="35" [longitude]="135"></agm-polyline-point>
      <agm-polyline-point [latitude]="34.999" [longitude]="135.001"></agm-polyline-point>
    </agm-polyline>
  </agm-map>
```

[![Image from Gyazo](https://i.gyazo.com/9ccd4b23c66de85ebfdd030f7d2c1cf4.png)](https://gyazo.com/9ccd4b23c66de85ebfdd030f7d2c1cf4)

## 多角形を表示

```html
<agm-map [latitude]="35" [longitude]="135" [zoom]="16">
  <agm-polygon
    fillColor="white" fillOpacity="1.0"
    [paths]="[{ lat: 34.999, lng: 135 }, { lat: 35, lng: 134.999 }, { lat: 35, lng: 135.001 }]"></agm-polygon>
  </agm-map>
```

[![Image from Gyazo](https://i.gyazo.com/7fbd22782b632d04da36bf2757532a29.png)](https://gyazo.com/7fbd22782b632d04da36bf2757532a29)
エンジニアリング　雑多メモ

順番や内容は全く整理されてません
自分の勉強メモです

## 勉強サイト
[エンジニアの入り口](https://eng-entrance.com/)
ここすごくいい！！初心者に概念を構造化して丁寧に教えてくれます


## コンピュータ歴史リンク集
[３分間で人に説明できるようになるUnixとLinuxの違い](https://eng-entrance.com/unix_linux)
[【初心者向け】Linuxの歴史解説！ OS誕生からLINUXへ](https://eng-entrance.com/linux_birth)


## コンピュータアーキテクト

* OS：コンピュータ全体
    * シェル：人間の命令をカーネルに伝えるもの
        * カーネル
            * OSの中核をなしてるソフトウェア
            * システムのリソース（CPU,HD,ネットワーク接続など）を管理

つまりシェルとは、コンピュータと人間の仲介役
多くのシェルが存在

## シェル
* sh系
    * sh
    * bash :linuxのデフォルト
    * ksh
* csh系
    * csh
    * tcsh
* どちらも
    * zsh


[ここに整理するまでもなく、こちらのリンクが非常に勉強になりました。](https://qiita.com/ycoda/items/87d23b818cb06ba1c348)

## webフレームワーク
* 各言語の便利機能群
JS,CSS,rubyなどなどなど、多様な言語で多様なフレームワークが存在

## git
* 名前はよく聞いてたが、使い方を教えていただいてその思想に度肝を抜かれた
* これ作った人、変態
* しかも、その人がlinuxも作ってるとか・・・



*** githubから適当にmaster落としてきて以降の手順 ***

|手順|操作|スクリプト|
|:--|------------------:|------------------:|
| 1 |ブランチを切って移動 |`git checkout -b hoge`|
| 2 |編集|　普通に編集する|
| 3 |アド|git add .|
| 4 |コミット|git commit -m 'commit message'|
| 5 |プッシュ|git push origin hoge|
jQuery学習２

#jQuery初歩の初歩２

jQueryファイルの読み込み

```
#bodyタグの終了直前で読みこむ
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js</script>
</head>

  
<script src="script.js"></script>
    
</body>
```

jQueryの型（基本形）

```
$(document).ready(function(){
     //jQueryコード//
});
```

短縮系

```
$(function(){
    //jQueryコード//
});
```


モーダルの表示(イベントが)

```
.login-modal-wrapper {
   display: none;
}
```

```
$('#login-show').click(function(){
    $('#login-modal').fadeIn();
});
```

複数の要素に対して同じjQuery動作を設定したい場合はIDでなくclassを用いる。


モーダルを隠すには、閉じるボタンにfadeOutメソッド等を用いる



hoverイベントの準備

```
$('.lesson-hover').hover(
   function(){
     マウスを乗せた時の操作
　},
function(){
     マウスが外れた時の操作
　}
);
```

addClassメソッド（イベント時にclassを追加する）
removeClassメソッド（イベント時にclassを外す）

```
$('.text-contents').addClass('text-active');#クラス名の前にドットは不要
```

hasClassメソッド（オブジェクトが引数に指定したクラスを持っていればtrue、そうでなければfalseを返す）

```
$('.answer').hasClass('open');#true
$('.answer').hasClass('close');#false
```

if文を用いた操作

```
if($('.answer').hasClass('open')) {

    trueの操作
} else {

    elseの操作
}
```
Tkinterを用いたBlackJackの作成

#はじめに
[プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし](https://qiita.com/hirossyi73/items/cf8648c31898216312e5)に影響されて、ブラックジャックのゲームを作成しました。GUIには、Tkinterを使用してみました。

##環境
- Ubuntu 18.04
- Python 3.6.5
- Tkinter 8.6

##ゲームのルール
- Aは「1」としてのみ扱う（後日、改修予定です。。。）

##スクリーンショット
![Screenshot from 2018-11-08 01-09-48.png](https://qiita-image-store.s3.amazonaws.com/0/219051/4c1c1508-2102-0e0b-ce34-aec636e57213.png)


##ソースコード
以下にGithubで公開中です。
[https://github.com/type89/black_jack_GUI.git](https://github.com/type89/black_jack_GUI.git)
AWSでネットワーク構築について (VPC-サブネット)

#はじめに
初投稿ぴょん。
ぴょんぴょんうさみと申します。

自分の知識を、qiitaで記事にしてみようと思います。
内容誤りありましたら、ご指摘お願いします。

# AWSでネットワーク構築
ここではAWS上でネットワークを構築する方法を解説します。
ネットワークを構築しないとサーバを作ることは出来ません。
私の運用視点も入れ込んで紹介していきます。

## 1．VPC構築
最初に作るのはVPC(Virtual Private Cloud)になります。
イメージとしては、ネットーワークの大きな箱です。
この中に、サブネットを切っていきます。

画面上部 サービス → VPCを選択で、VPCの構築画面に遷移します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/250058/e2286e6e-2ef3-f9dd-6b8c-81118c681029.png)

ここで「VPCの作成」をクリックすると、VPCの作成を行えます。
が、その前に、上記画像右上の赤丸に注意してください。

こちら、リージョンの指定となります。
ここで選択されたリージョンにVPCが構築されます。
画像では東京が指定されているため、東京リージョンにVPCが構築されます。
サービス展開する国にあわせてリージョンを選択しましょう。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/250058/0e95262e-573e-89f9-9af2-642fb19df4e4.png)
「VPCの作成」をクリックすると上記のポップアップが表示されます。
VPC作成のおすすめとしては、各サービスと環境ごとに、それぞれ作成することをお勧めします。
特に環境は、ネットワークが分離されるためお勧めします。
※検証から商用に対して、アクセスをしていた等の事故を防止できます。
※また、開発環境を外部会社に公開する場合など、商用環境に対して気を使わなくてよいのでお勧めです。

**名前タグ：**
VPCに名前をつけましょう。
個人的に、名前の付け方としておすすめなのが、「サービス ＋ 環境レベル」を付与です。
*例*：qiita管理システム-開発

**IPV4 CIDEブロック：**
VPCのサイズを決めます。IPV4でサイズを記載してください。
大きめのサイズで作って良いと思います。私は「/16」のサイズで作っています。
環境レベルが違っても大きさは合わせましょう。
*例*：192.168.0.0/16

**IPV6 CIDEブロック：**
IPV6を使う場合は、有効化しましょう。

**テナンシー：**
ハードウェアを物理的に確保します。デフォルトにすると占有しません。

必要な設定を入れたら、「はい、作成する」ボタンを押下してください。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/250058/2e1ea9fa-cb17-a64d-00ca-db740b8a4d8a.png)

これでVPCの作成が完了です。簡単ですね！

## 2．サブネット構築
VPCを構築したら、VPCの中にサブネットを構築しましょう。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/250058/6a6c94c8-00b1-414c-87e9-fb97c5c10dfc.png)

**名前タグ：**
サブネットの名前です。どんな用途のサブネットなのか、わかりやすい名前をつけましょう。

**VPC：**
サブネットを構築するVPCを選択してください。

**アベイラビリティーゾーン：**
リージョン内のゾーンを選択
ap-northeast-1a、ap-northeast-1c、ap-northeast-1dから選択します。
※ap-northeast-1は東京リージョンでの名称です。他のリージョンでは、別の名称となります。

a、c、dでデータセンターが分けられているイメージです。
※東京リージョンで、ap-northeast-1bがある場合は選択しないこと。

**IPv4 CIDR ブロック：**
サブネットのサイズを指定


「作成」ボタンを押下するとサブネットが構築されます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/250058/8717ec9e-c35c-7961-f519-89d364fff010.png)
※dev-ap2は、ap-northeast-1cに作成しています。


###個人的にサブネット構築する際のコツ。
**配置するサーバの用途ごとにサブネットを準備**
webサーバと、DBサーバはサブネットを分離する。
webサーバと、webサーバ用のLBは分離する。といった具合です。
サービス用件や、セキュリティレベルに応じて分けましょう。

**サブネットを作成する場合、1リージョンのみでなく最低2リージョン準備する**
AWSに障害が発生した際の対策です。
例えば、ap-northeast-1aが障害に利用不可の状態になっても、
ap-northeast-1cにもサービスを構築することで、サービスを継続します。

**ルートテーブルの設定で、DMZと非DMZは分けること**
サブネットはルートテーブルの設定で、DMZ、非DMZに分けることが可能です。
DMZのサブネットは最低限のして、DBサーバ用のサブネットなどは非DMZとすることをお勧めします。
ルートテーブルの設定については、別途記事を作成する予定です。

**ネットワークのサイズはある程度余裕を持たせる**
ここでは「/24」のサイズでサブネットを作っていますが、ある程度余裕を持たせた大きさで作成することをお勧めします。
AWS側が、最初の4つのIPアドレスと、最後のIPアドレスの合計5IPは使ってしまうので、
想定されるサーバ台数ギリギリで作成するのは危険です。

以下のイメージで構築しています。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/250058/47a6825f-1ad3-d5fd-e94a-664e7a60b51b.png)


以上、AWSネットワークの構築でした。
ことりんと一緒 Springもね - 3. 関数から波括弧省略

## 概要 / 説明
[ことりんと一緒 Springもね - 2. RestController と Data Class](https://qiita.com/shinyay/items/38c5520ec5336be6de0f)で、REST API アクセスが出来るようにコントローラクラスを追加しました。
ただし、追加した API は GET アクセスができるもののみの、非常に単純なアプリケーションでした。

今回は、PUT / POST / DELETE でのHTTP メソッドでのアクセスができるように API を追加してみます。

その中で、Kotlin での関数の書き方の１つで波括弧の省略を紹介します。

## 前提 / 環境
### ランタイムバージョン
- Kotlin : 1.3.0
- SpringBoot : 2.1.0.RELEASE

### Spring Dependencies
- Web

### 開発環境
- OS : Mac
- IDE : IntelliJ IDEA
- Build : Gradle

### その他
- APIデザイン
    - 分かりやすくするため、きちんとしたAPIデザインはしてません。GET/PUT/POST/DELETEのそれぞれのAPIに、それぞれのアクセスパスを付与しています。

## 手順 / 解説

以前に GET アクセス用に用意した API では、以下のように`@GetMapping` アノテーションを使いました。

```kotlin
@GetMapping(value = ["/display"])
fun getMessages() : List<Message> {...}
```

PUT/POST/DELETE も同様にそれぞれ `@PutMapping` / `@PostMapping` / `@DeleteMapping` を使って定義します。

```kotlin
@PutMapping(value = ["/insert"])
fun insertMessage(@RequestBody message: Message) : Message {...}

@PostMapping(value = ["/update"])
fun updateMessage(@RequestBody message: Message) : Message {...}

@DeleteMapping(value = ["/delete/{id}"])
fun deleteMessage(@PathVariable(name = "id") id: String): Boolean = {...}
```

### 関数から波括弧の省略
通常、関数を定義するときは `{...}` **波括弧** で囲み、その中に処理する式を記述します。
Kotlinでは、その式がただ1つの場合、波括弧を省略して記述する事ができます。
よって、次の2つの関数は同じ意味となります。

```kotlin:波括弧あり
@DeleteMapping(value = ["/delete/{id}"])
fun deleteMessage(@PathVariable(name = "id") id: String): Boolean {
  return true
}
```

```kotlin:波括弧省略
@DeleteMapping(value = ["/delete/{id}"])
fun deleteMessage(@PathVariable(name = "id") id: String): Boolean = true
```

## まとめ / 振り返り
今回は関数で波括弧を省略する記述を紹介しましたが、Kotlin では他にもいろいろな省略する記述ができ、簡潔にコードを書く事ができます。

今後も Spring でアプリケーションを作っていく中で簡潔に記述出来る箇所を説明していこうと思います。


### 今回のソース
- [spring-just-rest-kotlin/tree/first-rest-methods](https://github.com/shinyay/spring-just-rest-kotlin/tree/first-rest-methods)
ES6 の書き方

# はじめに
ES6 を勉強して知らないことがたくさんあったので忘れないようにまとめておきます。

## let/const
今の JavaScript は、極力 `var` ではなく `let` と `const` を使います。`var` を使うと変数の巻き上げが起こり、スコープが分かりにくくなります。

[var の巻き上げについて](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/var#var_hoisting)

- `let`: ブロックスコープの局所変数を宣言する
- `const`: 再代入禁止の変数を宣言する

```JavaScript
const N = 5;
for(let i = 0; i < N; i++) {
  console.log(i);
}
```

## アロー関数
次のような書き方をした関数を `アロー関数` と呼びます。

```JavaScript
const func = () => {
  console.log("アロー関数");
};

func();
```

関数の呼び出し方や挙動は `function` と変わりないですが、関数内での `this`　の扱いが異なります。

```JavaScript
const func = (() => {
  this.name = "aa";
  return {
    func1: function() {
        console.log(this.name);  // undifined
    },
    func2: () => {
        console.log(this.name);  // "aa"
    },
    func3() {
        console.log(this.name);  // undifined
    }
})();

func.func1();
func.func2();
func.func3();
```

`function` の中で `this` を使うと関数の中を指すので、外で宣言している `name` は `undifined` になります。対して、このアロー関数の `this` は `window` を指し `this.name` の `this` と同じになります。

`function` で同じようなコードを書くには次のようにする必要があります。

```JavaScript
const func = () => {
  this.name = "aa";
  const self = this;

  return {
    func1: function() {
      console.log(self.name);
    }
  }
}
```
[python]アインシュタインの縮約記法

学習したことはアウトプットしないとだめだということで
記事にしてみます

アインシュタインの縮約記法
物理学をやった人には馴染みがあるようですが
私は疎遠だったので実際にはやってみます

##単体演算
```
a = np.arange(9).reshape(3,3)
```
>array(
[[0, 1, 2],
>       [3, 4, 5],
>       [6, 7, 8]])

```
display(np.einsum("ii",a))
```
>対角部分を足しあわせる
12

```
display(np.einsum("ii->i",a))
```
>対角成分を残す
array([0, 4, 8])

```
display(np.einsum("ij->i",a))
```
>i方向（行）に足しあわせる
array([ 3, 12, 21])

```
display(np.einsum("ij->j",a))``
```
>j方向（列）に足しあわせる
array([ 9, 12, 15])

```
display(np.einsum("ij->ji",a))
display(a.T)
```
>転置
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])

## ベクトル演算
```
c = np.arange(4).reshape(2,2)
d = np.arange(6).reshape(2,3)
display(c,d)
```
>c = array([
[0, 1],
       [2, 3]])
d=array([
[0, 1, 2],
       [3, 4, 5]])

```
np.einsum("ij,jk->ik",c,d)
```
>c@dと同じ
array([
[ 3,  4,  5],
       [ 9, 14, 19]])

```
np.einsum("ij,jk->ki",c,d)
```
>(c@d).Tと同じ
>array([
[ 3,  9],
       [ 4, 14],
       [ 5, 19]])

```
np.einsum("ij,ij->ij",a,a)
```
>アダマール積（同じ場所の要素積）
array([
[ 0,  1,  4],
       [ 9, 16, 25],
       [36, 49, 64]])

参考
- http://www.procrasist.com/entry/einsum
Javascriptのオブジェクト初期化で知らなかった構文


[meteorのチュートリアル](https://www.meteor.com/tutorials/blaze/forms-and-events)をやっていると、次のようなコードに遭遇しました。

```javascript
{
  'submit .new-task'(event) {
    // some code here
  },
}
```

オブジェクトリテラルなのは予想がつきますが、文字列のあとに無名関数みたいなものが続いていているパターンは初めて見ました。
[オブジェクトイニシャライザーに関するMDNのドキュメント](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#Method_definitions)を読んでみたところ、次のコードと同値だということがわかりました。

```javascript
{
  'submit .new-task': function(event) {
    // some code here
  },
}
```

慣れたら読みやすいのかもしれませんが、今の所違和感しかありません。
Uipathの変数は大文字 / 小文字を区別するのか

# 初めに
1ヶ月かけて作ったRoboのソースをきれいにしてたら、使っていない変数だけ消えるはずなのに使っている変数まで消える現象に出くわしたので備忘録がてら書いてみます。

# 環境
- UipathStudio CE v2018.3.2
- OS : Windows7 Pro 
- メモリ : 16GB

# 前座：Activityで使われていない変数を一括削除する方法
（周囲に聞いたら意外と知られていなかったので、メモ。）

1. DESIGNタブの「Remove Unused Variables」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79318/6665cd2f-e6f5-6220-1a0f-9bb2ab32ae4f.png)

2. Assignに紐づいていない変数が削除された。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79318/0401437a-6263-7fa4-33c6-1a9e2c0b8782.png)

# 本題：Uipathの変数は大文字 / 小文字を区別するのか
1. 先ほどの変数に...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79318/8669981c-f5bc-283f-dae2-9ce402310c87.png)

2. 大文字にしただけの変数を増やして先ほどの機能を使って変数を一括削除してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79318/d49833da-51c7-5649-813f-b75035b15b50.png)

3. 両方問答無用で消え...なかった

- 小文字のほう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79318/1900e1c4-ed2b-6a65-a348-78bb83ce3ad3.png)

- 大文字のほう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79318/e5913974-5a42-7baf-a0db-1ab2b2e94b25.png)
最新のUipathでは使われていない変数を削除するときは特に問題はないみたい...

# でもやっぱり変数の大文字小文字は区別されていない様子...
- こんな感じで検索する場合は両方検索結果に出てくる  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79318/40c4a70f-432a-ddae-91da-6c09aa49bbd0.png)

# 結論
***Uipathではアルファベットの大文字 / 小文字は区別しない***
（Uipathというより.NETの仕様なのかな。）

以上！
【webpack】json-loaderで『Module parse failed: Unexpected token m in JSON at position 0 while parsing near 'module.exports = [{"...'』の解決方法

# Module parse failed: Unexpected token m in JSON at position 0 while parsing near 'module.exports = [{"...'

## エラーについて

webpack で `json-loader` を用いて JSON ファイルを読み込む際に、

```javascript
const json = require("data.json");
```

以下のエラーが出ることがある。

```bash
ERROR in ./src/data.json
Module parse failed: Unexpected token m in JSON at position 0 while parsing near 'module.exports = [{"...'
You may need an appropriate loader to handle this file type.
```


## 解決方法

`webpack.config.js` の JSON ファイルに関する rules を、以下のように記述すると解消される。

```javascript
module: {
  rules: [
    {
      test: /\.json$/,
      loader: "json-loader",
      type: "javascript/auto"
    }
  ]
}
```

`type: "javascript/auto"` の部分が必要だったようである。


## 補足： `json-loader`

require から JSON の読み込みを可能にする loader である。


1. インストール方法

    ```bash
    # npm の場合
    npm install json-loader --save-dev
    
    # yarn の場合
    yarn add json-loader --dev
    ```

2. webpackの記述方法

    ```javascript
    module: {
      rules: [
        {
          test: /\.json$/,
          loader: "json-loader",
          type: "javascript/auto"
        }
      ]
    }
    ```
[暗算] 特定日時の曜日暗算方法

# 豆知識。飲み会ネタ。

[R.I.P.(COVID-19)](https://en.wikipedia.org/wiki/John_Horton_Conway)
<hr/>

## キーワード:doomsday rule, john conway doomsday algorithm
[ggr](https://www.google.com/search?q=john+conway+doomsday+algorithm&oq=john+conway+doomsday+algorithm)


## 暗算方法
1. doomsday を求める
  計算基準となるdoomsdayをまず求める。
  1. 西暦の末尾2桁 ( exp. 2018 ⇒ 18 )
  1. 項1が奇数の場合のみ、+11する
  1. 項2を÷2する
  1. 項3が奇数の場合のみ、+11する
  1. 項4を7で割った余りを求める
  1. 余りを[西暦1900 ～ 1999まで](https://qiita.com/fujisystem/items/171a949c58561dbd5046#%E8%A5%BF%E6%9A%A61900--1999%E3%81%BE%E3%81%A7) または [西暦2000 ～ 2999まで](https://qiita.com/fujisystem/items/171a949c58561dbd5046#%E8%A5%BF%E6%9A%A62000--2999%E3%81%BE%E3%81%A7) の一覧から曜日を求める


1. doomsday からの差分で対象日付の曜日を求める
  1. doomsdayから ±7 * n で対象日付の直近を求める
  1. 項1からの差分から曜日を求める

### 代表的doomsday
| No. | 日付     |
|-----|----------|
| 1   | 4月4日   |
| 2   | 6月6日   |
| 3   | 8月8日   |
| 4   | 10月10日 |
| 5   | 12月12日 |
| 6   | 5月9日   |
| 7   | 9月5日   |
| 8   | 7月11日  |
| 9   | 11月7日  |
※4月からの偶数日と、5/9 と 7/11で覚える

### 西暦1900 ～ 1999まで

| 計算値 | 対応曜日 |
|--------|----------|
| 0      | 水曜日   |
| 1      | 火曜日   |
| 2      | 月曜日   |
| 3      | 日曜日   |
| 4      | 土曜日   |
| 5      | 金曜日   |
| 6      | 木曜日   |
水曜始まりの0起源で覚える

### 西暦2000 ～ 2999まで

| 計算値 | 対応曜日 |
|--------|----------|
| 0      | 火曜日   |
| 1      | 月曜日   |
| 2      | 日曜日   |
| 3      | 土曜日   |
| 4      | 金曜日   |
| 5      | 木曜日   |
| 6      | 水曜日   |
火曜始まりの0起源で覚える

### doomsday計算
<p data-height="265" data-theme-id="dark" data-slug-hash="QJEZPa" data-default-tab="js,result" data-user="fujisystem" data-pen-title="Get day of Doomsday." class="codepen">See the Pen <a href="https://codepen.io/fujisystem/pen/QJEZPa/">Get day of Doomsday.</a> by fujisystem (<a href="https://codepen.io/fujisystem">@fujisystem</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Python 雑多メモ

# Pythonについての個人メモ
**随時更新中**

## 環境
python 3.7.0
基本Jupyter Notebook使って書いてます
(主にデータ分析用に利用中)

## 基礎文法
#### `print`
```python
#3系ではかっこ必須
print("Hello!") 

#string型の変数入れる場合は%s
hannin="お前"
print("犯人は%sだ！" % hannin) 

#int型の変数入れる場合は%d
shinjitsu=3
print("真実はいつも%dつ" % shinjitsu) 
```
#### `locals`
```python
#変数を動的に生成
i=1
locals()["data_%d" % i] = 1

#for文と組み合わせたり
for i in range(7):
    locals()["df_%d" % (i+1)]=pd.read_csv("reportdata00"+str(i+1)+".csv")
```

* `locals()` は保存されてる変数名と中身を辞書型で返してくれる関数

## `pandas`
#### `pandas.concat`
```python
import pandas as pd

#縦
#columnsは引数に含まれるdfのcolumnsの和集合
pd.concat([df1,df2,df3,df4])

#横
#indexは引数に含まれるdfのindexの和集合
pd.concat([df1,df2,df3,df4],axis=1)
```
`join='inner'` で和集合から積集合に変更可能
デフォルトは `join=outer`

## Jupyter Notebook
### ショートカットキー
#### コマンドモード 
`v` : ひとつ戻る
xamppでLaravelの環境構築しようとして躓いた

備忘録。おそらく超初心者向け。

[xamppでLaravelの環境構築](https://qiita.com/maruyama42/items/43d7029d7e00e587bf0b)
こちらを参考に環境を構築しました。
途中必要な部分を読み飛ばしたりphp.iniの設定で躓いたので書きます。
注:上記記事はなにも悪くありません。

#躓いてた場所
php.iniの設定
laravelのインストール先

##Composerのインストールが出来ない
インストールしていると「指定されたモジュールが見つかりません。」とのエラーが。

```
PHP Warning:  PHP Startup: Unable to load dynamic library 'php_pdo.dll' (tried: C:\xampp\php\ext\php_pdo.dll (指定されたモジュールが見つかりません。), C:\xampp\php\ext\php_php_pdo.dll.dll (指定されたモジュールが見つかりません。)) in Unknown on line 0
```
確認したけどそのモジュールあるよね、、？と思ってたらさらにその中で読み込もうとしてるなにかしらが読み込めないとかなんとかっぽい？のでエラーが表示されてる部分についてphp.iniの中身をコメントアウト。
extension=php_pdo.dll → ;extension=php_pdo.dll
対応が正しいのかはわからないけれど取り敢えずインストール出来た。
少し前にphpのバージョンを5.6から7.2に上げてたからその名残かしら。

##初期ページが表示されない
調べてもそんなことで躓いてる人が見当たらない。その他のページが表示されない人はいるみたいだけど、初期ページが表示されないってどういうこと？バーチャルホスト色々と弄ってるからその辺り？
と色々確認した結果、インストール場所間違えてました。
コピペしてインストールしたのですがhtdocsに移動するのを忘れてました。

#まとめ
たまにこういう躓き方をします。
参考にする記事はきちんと読みましょう。自戒。