OmniAICreator/Qiita-1.07M huggingface dataset:
Google検索結果をスクレイピングするときは、User-Agentの設定に気をつけよう

[自分のブログ](https://yuya-tequila.hatenablog.com/entry/2019/02/03/125739)の転載記事です。

## TL;DR
User-Agentの設定に気をつけないと、Google検索結果のスクレイピングがうまくいかないかもしれません、というお話です。
ついでに、Google検索結果のスクレイピングはグレーっぽいというお話です。

## やってみて失敗したこと
Googleの検索結果をスクレイピングするなら、あなたはどのようなコードを書くでしょうか。
私はこんな感じで書きます。

```ruby
search_url = "https://www.google.co.jp/search?hl=jp&gl=JP&"
query = URI.encode_www_form(q: "日本M&Aセンター")
search_url += query

charset = nil

html = open(search_url) do |f|
  charset = f.charset
  f.read
end

doc = Nokogiri::HTML.parse(html, nil, charset)
```

人によって細かい違いはあるかもしれませんが、上記はごく普通のNokogiriでのスクレイピングだと思います。 
ここから、最初の検索結果に現れたサイトのURLを取得したいとします。
<img width="1387" alt="スクリーンショット 2019-02-03 11.57.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/222253/671edbb7-0dca-0f3a-0bff-f49d08dc58d6.png">
xpathでの指定が簡単そうでしたので、要素のxpathを指定し、そこからリンクテキストをスクレイピングするとします。

```ruby
link = doc.xpath('//div[@class="r"]/a')
link[0].attribute('href').text
```

そうすると、変数linkには何が入っているでしょうか。

```ruby
puts link
=> nil
```

何も入っていません。何故でしょう。
  
結論から言うと、xpathの指定が間違っているからです。
そしてなぜxpathが間違っているのかというと、User-Agentを指定していないからなのです。

## User-Agentの検証
実際に検証してみましょう。
まずはUser-Agentの設定を何も変えずに検索してみます。
(User-Agent設定はChromeのdeveloper toolから見られます)
<img width="1387" alt="スクリーンショット 2019-02-03 12.12.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/222253/beb3513c-3c20-b0da-c29a-9e89e2a7261e.png">
この場合、自分の環境ではUser-Agentは以下のような設定になっています。

```
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36"
```

では次にUser-Agentに意味のない文字を設定して、同じ画面を表示してみます。
<img width="1387" alt="スクリーンショット 2019-02-03 12.12.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/222253/ebc075dd-c052-9e58-d0ac-f16dc0b7bfb2.png">
検索結果の画面が変わったことがわかるでしょうか。
表示されている内容が大きく変わったわけではありませんが、レイアウトやスタイルが変更されています。

これがUser-Agentを設定せずにGoogle検索をおこなった場合のレスポンス、というわけです。
この状態でもスクレイピングは可能なのですが、要素のxpathが変わってしまうため、Chromeを見ながらスクレイピングするということがやりにくく、非常に開発がしづらくなってしまいます。

## 対策
対策としては、User-Agentを明示的に設定してあげればよいです。
というわけで修正したソースコードがこちら。

```ruby
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36"

search_url = "https://www.google.co.jp/search?hl=jp&gl=JP&"
query = URI.encode_www_form(q: "日本M&Aセンター")
search_url += query

charset = nil

html = open(search_url, 'User-Agent' => user_agent) do |f|
  charset = f.charset
  f.read
end

doc = Nokogiri::HTML.parse(html, nil, charset)

link = doc.xpath('//div[@class="r"]/a')
link[0].attribute('href').text
```

これで、自分の使用しているChrome環境と同じレスポンスを取得できるようになります。
スクレイピングのマナーとしてもUser-Agentは設定するべきですので、良いことづくめですね。

## 余談
ちなみにGoogleの検索結果をスクレイピングするにあたっていろいろ調べたのですが、Googleは検索結果のスクレイピングを認めていないようですね。
robots.txtにも、以下の記載がありますので。

```
User-agent: *
Disallow: /search
```

とはいっても、実際はある程度黙認されているようです。
何にせよ、スクレイピングは自己責任で行うべきですね。
lxmlメモ

# はじめに
今回の内容はスクレイピングする上で用いたとあるライブラリについての個人的感想です。
どんなことができるのか、使ってみた感想をつらつらと書いていきます。
# スクレイピングとは
Web上のページから情報を引き抜くこと。機械学習など大量のデータが欲しい時に、データの取得をプログラミングで自動化できるのでとても便利なものである。
# lxmlとは
スクレイピングを実現するためのPythonモジュールのひとつ。他にもhtmllibやBeautiful Soupなどがある。
## 特徴
- **とにかく高速**、おそらくモジュールがCを使って書かれたため?
- HTMLの要素をDOM(Document Object Model)構造に変換する
- XPath(次で説明)というものを使って抜き取る要素を指定

## 使い方
lxmlで要素を抜き取りたいときは、XPathというもので要素の場所を指定する必要がある。
XPathの使い方は[こちら][sansyou1]のものを引用しつつ説明する。
> XPath(XML Path Language)とは、XML形式の文書から、特定の部分を指定して抽出するための簡潔な構文(言語)です。HTML形式の文書にも対応します。
>CSSではセレクタを使ってHTML文書内の特定の部分を抽出しますが、XPathはより簡潔かつ柔軟に指定ができるとされています。

例としてbody以下のリンク要素(hogeクラス)を取り出す書き方を挙げる。

- CSSセレクタ: ``html > body a.hoge``
- XPath:     ``/html/body//a[@class="hoge"]`` または ``//a[@class="hoge"]``

このようにXPathは要素を**階層的に**指定できる。
さらにXPathでは絶対パス形式と相対パス形式で要素を指定できるので**柔軟に**要素を抜き取ることができる。

具体例として以下のようなHTMLファイルから要素を抜き取るとする。

~~~html:sample.html
<html>
<head>
    <title>sample page</title>
</head>
<body>
    <div class="test1">
        <h1>Hello World!!</h1>
    </div>
    <div class="table">
        <table border="1">
          <tr>
            <th>名前</th>
            <th>一言</th>
          </tr>
          <tr>
            <td>サンプル1</td>
            <td>よろしく</td>
          </tr>
          <tr>
            <td>サンプル2</td>
            <td>はじめまして</td>
          </tr>
　　　　　　　　　　　　　　　　　　　　<tr>
            <td>サンプル3</td>
            <td>これはテストです</td>
          </tr>
        </table>
    </div>
</body>
</html>
~~~
このとき、テーブル内の一言を抽出したい場合は、次のようにXPathを指定する。

```
//table/tr/td[2]
```
もしサンプル2が発している「はじめまして」を抽出するなら``//td[4]``と指定しても良い。
ただし、tdの数の変動を考慮するならば次のように指定する。

```
//table//td[contains(*,'サンプル2')]/following-sibling::td[1]
```
こうすることで中身がサンプル2であるtdの後ろにある要素(今回はtd)を抽出することができる。
XPathにはこうした細かい条件を指定できる関数もあるので、非常に便利である。
ここまでをコードとしてまとめる。

```python
import lxml.html
import requests                        # Webページのソースを取得するのに用いる。今回はこれについての説明は省く

url = 'http://example.com/'            # URLの一例、今回は上のsample.htmlを指すものとする

r = requests.get(url)                  # URLにあるページのソースを取得
html = lxml.html.fromstring(r.text)    # 取得したソースをHtmlElementオブジェクトに変換

td = html.xpath("//table//td[contains(*,'サンプル2')]/following-sibling::td[1]")
# >>> print(td)
# '<td>はじめまして</td>'
```

指定された要素の中身(ex.文字列やURL)を抽出するには以下の文を最後に追加する。

```python
text = td.text()
```
ただし、もしtdの中身が``はじめまして<br />僕はサンプル2です``の場合、text()ははじめましてしか抽出できない。そういったときは次のようなメソッドを使う。

```python
text = td.text_content()
```
こうするとtextには``はじめまして僕の名前はサンプル2です``が代入され、要素内の全文字列を取得することができる。
その他様々なデータの抽出方法は[こちら][sansyou2]を参考に
# 感想
大量のデータをとるときでもわずか数分で取得できたのは神だった。
スクレイピングする際は「とりあえずlxml」の気持ちで生きていきたい。
# 参考文献
[XPathのまとめ、要素の参照方法いろいろ][sansyou1]
[Python(lxml)でhtmlを処理する まとめ][sansyou2]
[sansyou1]:https://webbibouroku.com/Blog/Article/xpath
[sansyou2]:http://www.cafe-gentle.jp/challenge/tips/python_tips_003.html
自分用メモ(v-if、v-show)

## v-ifとv-showの違いと使用する判断基準
- 表示／非表示を頻繁に切り替えるコンテンツにはv-show → displayプロパティで非表示にしてる。
- 最初に表示（非表示）にしたら滅多に変更しないものはv-if → DOMを破棄してる。

他にも判断基準はあるはずなので、追記していく。
P2Vした際にBSoD STOP 0x0000007Aでハマった

#はじめに
まあ、こんな記事誰も読まんと思うが、忘備録として残しておく

以下の環境をP2Vしようとしてハマった。
Boot時にBSoD STOP 0x0000007Aか0x0000007Bが発生し、ググってもレジストリをハイブ修正しろやゴラーみたいな記事し引っかかりませんでした。
その手順で修正してもWindows Server 2003とXPはBootできたが、2008R2はBootせず(泣)。途方に暮れました。

レジストリ修正の記事をよく読むとレジストリをいじって最初に読み込むドライバを設定することが書いてあったので、2008R2についてもドライバを読み込ませればOKとの予想の元やってみたら何とかなったのと、誰もこの方法で修正した記事はなかったので、書き記しておきます。

||内容|
|:-----:|:-----:|
|移行元OS|Windows Sever2008R2|
|移行先OS|Proxmox VE5.3(KVM)|
|移行方法|移行元からHDDをひっこ抜き、USB接続してDD|

#確認
ほんとにBoot Sequenceまで行っているよね？->Windows起動時のアニメーションは一瞬でもみたよね?
BSoD STOPは一瞬で消えるけどスマホなりで録画確認して、0x0000007Aであること確認したよね?
DDなどで、ほかにバックアップイメージ取ってあるよね?

これらが確認出来たら次へGO

#ドライバをGETする
KVMの場合以下から、FedoraのページからISOを入手します。
https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html

VMwareの場合VMware ToolsのISOを入手します。
https://kb.vmware.com/s/article/1036810?lang=ja

Xenも以下同文。
https://www.xenproject.org/developers/teams/windows-pv-drivers.html

#なんとかしてシステム回復オプションの画面までたどり着く
Windowsのインストールメディアを用意したり、上記ドライバを読み取らせたりしながら、なんとかしてシステム回復オプションまでたどり着いてください。ここは試行錯誤すればなんとかなると思います。
Windows7やServer2008R2だと以下の画面
![system_recovery_options.jpg](https://qiita-image-store.s3.amazonaws.com/0/253664/93421d9d-47da-67cc-b906-397e706e4803.jpeg)
Windows10だと以下の画面
![888cc9c0-bc2a-436e-ad6d-57dc1a14efa0.png](https://qiita-image-store.s3.amazonaws.com/0/253664/02f462cc-e113-a12b-73d7-852f5c1779b9.png)

#コマンドプロンプトからDISMコマンドを実行し、システムにドライバを追加。(削除もできるよ)
どうせ最後はSCSI環境にすることがほとんどだと思うので、SCSIドライバをインストールします。
環境によってCドライブ、Dドライブは変わると思うので随時確かめてください。CドライブはWindowsフォルダがあるドライブ。DドライブはISOをマウントしたCDドライブです。dirコマンドでファイル一覧を取得しながら探してください。下の例では2008R2のドライバを読み込んでいますが、ほかのOSのドライバは違うパスにあります。

```
Dism /image:C:\ /Add-Driver /driver:D:\vioscsi\2k8R2\amd64\vioscsi.inf
```

まちがったドライバは削除してください。ドライバがバッティングして起動しない時も、このコマンドは使えると思います。

```
Dism /image:C:\ /Remove-Driver /driver:vioscsi.inf
```

#再起動すればBootするはず
KVMではvioscsiドライバの追加のみで起動しました。
起動してしまえばデバイスマネージャーからエラーが出ているドライバを追加すれば操作は終了です。
RunwaymlならAttnGANが数分で試せる

同僚のリサーチャーがthesisをスタートアップにして、最近正式版をリリースしました。

Runway
https://runwayapp.ai/

マシンラーニングを齧ったことがある人なら環境設定等で苦労したことが一度はあると思います。
Runwayはその部分をすっ飛ばしてくれて、プレトレインモデルを簡単に使う環境を提供してくれます。
早い話、プレトレインモデルをAPIのような形で使えるようにしてくれるアプリ。
http、osc、websocket、local 

こんな感じ
https://www.instagram.com/p/BtCrYfvHqDY/

やってる事はとてつもなく簡単です。
Postリクエスト投げて、JSON形式でbase64形式のデータを受け取って、デコードして表示。

現状、oscは問題あるみたいで、Processingだと動くんですが、oF（試したけどダメでした。）とMax（Slackでとある人が動かないと）だと同じ手順踏んでも動かないみたいです。

モデルのインポートはまだ試していないんですが、結構簡単に出来るみたいです。
Outlookで指定した名前のフォルダを一括で作る

自分用。多分すでに同名のフォルダが存在するとエラーになると思う。

```
Public Sub CreateFolders()
Dim CurrentFolder As Outlook.MAPIFolder
Dim Subfolder As Outlook.MAPIFolder
Dim List As New VBA.Collection
Dim Folders As Outlook.Folders
Dim Item As Variant

List.Add Array("あいうえお", olFolderInbox)
List.Add Array("かきくけこ", olFolderInbox)

Set CurrentFolder = Application.ActiveExplorer.CurrentFolder
Set Folders = CurrentFolder.Folders
For Each Item In List
    Folders.Add Item(0), Item(1)
Next
End Sub
```
GAS×Uipath Orchestratorでいろいろさせる

#はじめに
本ページは***GAS***(Google Apps Script)で***Uipath orchestrator(以下OC)***を扱う上で調べた範囲で書いています。

OCのAPI Referenceは下記になります。※英語
https://orchestrator.uipath.com/v2018.4/reference#api-references

英語が苦手な人やAPIをあまり触ったことない人向けに書いていくつもりです。
もっとスマートな方法あるよ！という方は教えてください。
時間があるときに随時加筆していきます。

###加筆予定
・ロボットの状態監視
・Google formやメールなどリクエストをトリガーにJobの開始


## authentication(認証)

#####何故必要か？
OCから情報を取得するにはTokenが必要です。
IDとかパスワードが無いのに機密情報が見れたら問題ありますよね？
怪しいものじゃないですよーって証明してる、そのくらいの認識で大丈夫です。

英語のリファレンスはこちら
https://orchestrator.uipath.com/v2018.4/reference#authenticating

#####GASコード
function Auth(Token){
  
  //Tokenを手に入れるためのリクエストURL
  //ここではOC community Editionの場合を書いています。正式版の場合は変更してください。
  var OCAuthURL ='https://platform.uipath.com/api/account/authenticate'
  
  //ここにコンテナ名、ユーザーネーム、パスワードを入れる
  var data = {
    "tenancyName" : "テナント名",
    "usernameOrEmailAddress" : "ユーザー名",
    "password" : "パスワード"
}

  //トークンを取るときはpost。getじゃないので注意。
  //payloadでdataをJSON形式にする
  var Tokenoptions = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(data)
  };
  
  //httpリクエスト
  var Authresponse = UrlFetchApp.fetch(OCauthURL, Tokenoptions);

  //Json形式で取得
  var json = JSON.parse(Authresponse.getContentText());

  //JsonのresultにTokenが入っているので変数に入れる
  var Token =json["result"]
  
  //returnで指定した部分を返す。これを他のfunctionで使用する。
  return Token
}
今スク　全てのコンポジションの中にあるエフェクトにエクスプレッションを追加

#レイヤーのエフェクトにエクスプレッションを追加し忘れた・・・
今大量のコンプがあり、中には写真+コメントの素材が入っています。
その中のテキストレイヤーにエクスプレッションを追加し忘れました。
コンポジションが50個近くあるのでエクスプレッションで一括変更。

#やりたい事
コンポジション内のテキストのレイヤースタイル（光彩）にエクスプレッションを追加。

#今日のスクリプト
```jsx
var selectItems = app.project.selection;

app.beginUndoGroup("undo");

for (var i = 0; i < selectItems.length; i++) {
    var myItem =  selectItems[i];//選択したオブジェクト
    var myComp = selectItems[i]; // 選択したオブジェクトの名前を取得
    for ( var j = 1 ; j < myComp.numLayers+1 ; j++){
        $.writeln(j)
        try{
            myComp.layer(j).property("ADBE Layer Styles").property("outerGlow/enabled").property("outerGlow/blur").expression='footage("common.json").sourceData.text.光彩.サイズ;'
        }catch(e){
        }
    }
}
app.endUndoGroup();
```

#注意点
今回はコンポの中の全てのレイヤースタイルを対象にしているので、もし他のレイヤースタイル光彩がアクティブになっているとそれも変更されます。
今回はテキストレイヤーにしかレイヤースタイルは適用されていないので、とりあえず、他のレイヤーはtry{}catch(e){}でエラーを回避しています。


#さらに追加で・・・
前回のものにさらに追加が出てきたのでそのスクリプトも。
今回はちゃんとテキストレイヤーか判定(instanceof TextLayer)させています。
内容はテキストレイヤーのフォントやサイズ、塗りを変えた後にドロップシャドウも追加しました。
んで、気付いたのが、コマンドでドロップシャドウを追加するのですが、コンポジションをビューワーに表示させないとエラーにでシャドウが追加できませんでした。
どういうことだろう。
もしかしたらセレクトしている状態にしないといけないかもしれません。
とりあえず、これでも大丈夫なのでこのまま張っておきます。

#今日のスクリプト
```jsx
var selectItems = app.project.selection;

var fonts =["HGPMinchoB","HGPMinchoE"]

app.beginUndoGroup("undo");

for (var i = 0; i < selectItems.length; i++) {
    var myItem =  selectItems[i];//選択したオブジェクト
    var myComp = selectItems[i]; // 選択したオブジェクトの名前を取得
    myComp.openInViewer()
    for ( var j = 1 ; j < myComp.numLayers+1 ; j++){
        if ( myComp.layer(j) instanceof TextLayer ){
            var textLayer =  myComp.layer(j);
            var td = textLayer.property("ADBE Text Properties").property("ADBE Text Document").value;
            td.fontSize = 85;
            td.font =fonts[1];
            td.fillColor = colorSetToRgb("ffffff")
            textLayer.property("ADBE Text Properties").property("ADBE Text Document").setValue(td);
            textLayer.selected = true;
            app.executeCommand(9000);//ドロップシャドウ追加
            textLayer.property("ADBE Layer Styles").property("dropShadow/enabled").property("dropShadow/distance").expression =　'footage("common.json").sourceData.text.ドロップシャドウ.距離;';
            textLayer.property("ADBE Layer Styles").property("dropShadow/enabled").property("dropShadow/chokeMatte").expression =　'footage("common.json").sourceData.text.ドロップシャドウ.スプレッド;';
            textLayer.property("ADBE Layer Styles").property("dropShadow/enabled").property("dropShadow/blur").expression =　'footage("common.json").sourceData.text.ドロップシャドウ.サイズ;';
        }        
    }
}
app.endUndoGroup();


function colorSetToRgb(set){
    var bigint = parseInt (set, 16);
    var r = (bigint >> 16) & 255;
    var g = (bigint >> 8) & 255;
    var b = bigint & 255;
    return [r/255,g/255,b/255];
}

```
npmでのinstallコマンドに失敗する＠Mac

mac環境にてnpmを使用してyarnをインストールしようとした時に発生
エラー内容を確認すると
installコマンドを使用した際にディレクトリに対する権限がない為に発生しているエラーであった為

npmのディレクトリを確認し、権限を付与する下記のコマンドを実行


npmのディレクトリの確認

```
emueshioMacBook:~ mac$ npm config get prefix
/usr/local
```


ディレクトリに対する権限の付与

```
emueshioMacBook:~ mac$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
```

パスワードを要求される

```
Password:
```

確認の為、yarnをインストール

```
emueshioMacBook:~ mac$ npm install --global yarn
/usr/local/bin/yarnpkg -> /usr/local/lib/node_modules/yarn/bin/yarn.js
/usr/local/bin/yarn -> /usr/local/lib/node_modules/yarn/bin/yarn.js
+ yarn@1.12.3
added 1 package in 1.676s
emueshioMacBook:~ mac$ 
```

インストールが完了し、正常に動作した事を確認。
samtools が「libcrypto.so.1.0.0 => not found」で実行できなかった件

samtools をcondaインストールした実行しようとしたら，以下のエラーが出た．

```bash
$ samtools
samtools: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
```
`libcrypto.so.1.0.0`が無いようなので，探してみると，

```bash
$ ldd $(which samtools)
libcrypto.so.1.0.0 => not found
```
見事に"not found" になっている．
ほかのpath はしっかりminiconda の`lib/`にあるようなので中を少し見てみる．
`libcrypto.so.1.1`ってのがあったので，こいつを`libcrypto.so.1.0.0`のリンク先に指定してあげれば良いなとなる．

```bash
#lib/ に移動して，
ln -s libcrypto.so.1.1 libcrypto.so.1.0.0
```
すると，

```
libcrypto.so.1.0.0 => $HOME/miniconda3/bin/../lib/libcrypto.so.1.0.0 
```

みたいなかんじなので，解決．
XLSX を PDF に変換　(openpyxl,reportlab)

openpyxl と reportlab を使って、XLSX を PDF に変換します。
pandas と FPDF を使う例はこちら
[XLSX を PDF に変換　(pandas,FPDF)](https://qiita.com/ekzemplaro/items/f1da8a55c224c747735a)

```py:xlsx_pdf_simple.py
#! /usr/bin/python
#
#	xlsx_pdf.py
#
#					   Feb/03/2019
# ------------------------------------------------------------------
import sys
from openpyxl import Workbook
from openpyxl import load_workbook
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
# ------------------------------------------------------------------
# [4]:
def pdf_gen_proc(file_pdf,ws):
	doc = SimpleDocTemplate(file_pdf, pagesize=A4)
	fontname_g = "HeiseiKakuGo-W5"
	pdfmetrics.registerFont(UnicodeCIDFont(fontname_g))
	elements = []
#
	data = []
	for row in ws.rows:
		unit_aa = []
		print(row[0].value)
		for col in row:
			unit_aa.append(col.value)
		data.append(unit_aa)
	tt=Table(data)
	tt.setStyle(TableStyle([('BACKGROUND',(1,1),(-2,-2),colors.cyan),
		('TEXTCOLOR',(0,0),(1,-1),colors.red),
		('FONT', (0, 0), (-1, -1), "HeiseiKakuGo-W5", 20),
		('GRID', (0, 0), (ws.max_column, ws.max_row), 0.25, colors.black),]))
	elements.append(tt)
#
	doc.build(elements)
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
file_xlsx = sys.argv[1]
file_pdf = sys.argv[2]
#
wb = load_workbook(filename = file_xlsx)
ws = wb.active
print("ws.max_row = %d" % ws.max_row)
print("ws.max_column = %d" % ws.max_column)
#
pdf_gen_proc(file_pdf,ws)
#
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./xlsx_pdf_simple.py cities.xlsx out01.pdf
```
C++からC#のDLLを呼ぶ方法

以下を参考にして実際に試してみる予定です。

# 参考サイト
http://www.84kure.com/blog/2014/07/17/c-c%E3%81%8B%E3%82%89c%E3%81%AEdll%E3%82%92%E5%91%BC%E3%81%B6%E6%96%B9%E6%B3%95/

https://knowledge.rinpress.com/index.php/%EF%BC%A3%EF%BC%8B%EF%BC%8B%E3%81%AE%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%8B%E3%82%89%EF%BC%A3%EF%BC%83%E3%81%AE%EF%BC%A4%EF%BC%AC%EF%BC%AC%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B

# 環境
Visual Studio 2017 Community

# C#のプロジェクト作成
・クラスライブラリのプロジェクトを作成する
・プロジェクトのプロパティを開いて「アプリケーション」のタブで「アセンブリ情報」のボタンをクリックして「アセンブリをCOM参照可能にする」のチェックボックスにチェックを入れる
・プロジェクトのプロパティを開いて「ビルド」のタブで「COM相互運用機能の登録」にチェックを入れる
※ビルド時にレジストリへの登録に失敗するエラーが発生することがあるが、その場合はVisual Studioを管理者権限で実行すれば登録できる
プログラミング超初心者の学び

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている**くぼた**です。


今回はプログラミング超初心者の僕が、ProgateのHTML & CSS 初級編に取り組むにあたっての学びについて書いていきたいと思います。

##適当にやることはNG
僕がやっていたのは初級編だったので、最初の方は「簡単やし、なんかできそう」って思っていました。しかし、途中あたりからだんだん複雑になってきて、ミスは増え、クリアに時間がかかるようになりました。
どうしてうまくいかないのかと考えた結果、答えが見つかりました。

それは、**説明をちゃんと読まないで、ノリで進めていた**からなんです。

Progateは説明や解説がしっかりされているのに知識不足、経験不足でミスするのは考えられません。つまり、自分の取り組み方に問題があったのです。

思い返すとミスする時は、

・焦って速さだけを重視していた。

・集中できていなかった。

・文字の打ち間違い。

・説明をちゃんとよんでいない。

共通しているのは**適当になっていた**ことです。
プログラミングでは、一つの打ち間違えが大きく左右するので、特に影響を受けたと思います。

ただ、これらって意識を変えるだけで直せるものですよね(笑)
これに気づいてからはミスも格段に減って、生産性も上がりました。

##まとめ
プログラミングをしている人からしたら当たり前すぎるかもしれませんが、プログラミングの知識や経験が全くなかった僕にとっては非常に大事だなと思いました。

次回の記事には専門的な学びについて書きたいので、当たり前のことを大事にして、もっと深く学んでいきたいと思います。
セキュリティ関連の情報収集サイト

# 概要

セキュリティ関連の情報収集サイトのまとめ。

# 脆弱性情報データベース

>
脆弱性情報データベース（ぜいじゃくせいじょうほうデータベース）とは、脆弱性情報をデータベース化し、一般向けに公開されているものを指す。

by [脆弱性情報データベース](https://ja.wikipedia.org/wiki/%E8%84%86%E5%BC%B1%E6%80%A7%E6%83%85%E5%A0%B1%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)

## 日本

[JVN - Japan Vulnerability Notes](https://jvn.jp/)

脆弱性検索のフィルタ機能がイマイチ。

## アメリカ

[NVD - National Vulnerability Database](https://nvd.nist.gov/)

脆弱性検索のフィルタ機能が充実。使い勝手が良い。

# 情報セキュリティ施策

## IPA

IPAの一般向けのセキュリティ情報サイト。

[IPA - ここからセキュリティ](https://www.ipa.go.jp/security/kokokara/)

## 警視庁

[警視庁 - @police](https://www.npa.go.jp/cyberpolice/index.html)

>
本Webサイトでは、サイバー犯罪・サイバーテロの未然防止及び被害の拡大防止を図るべく、ネットワークセキュリティに関する様々な情報を提供します。

by [警視庁 - @police - このサイトについて](https://www.npa.go.jp/cyberpolice/about.html)

## 経産省

[経済産業省 - 情報セキュリティ政策](http://www.meti.go.jp/policy/netsecurity/)

>
経済産業省 商務情報政策局 情報セキュリティ政策室では、「コンピュータセキュリティ早期警戒体制の整備事業」、「企業・個人の情報セキュリティ対策促進事業」を通して情報セキュリティ政策を推進しております

by [経済産業省 - 情報セキュリティ政策](http://www.meti.go.jp/policy/netsecurity/)

## JPCRET

[JPCERT/CC](https://www.jpcert.or.jp/)

>
JPCERTコーディネーションセンター（JPCERT/CC）は、インターネットを介して発生する侵入やサービス妨害等のコンピュータセキュリティインシデント*1(以下、インシデント) について、日本国内のサイトに関する報告の受け付け、対応の支援、発生状況の把握、手口の分析、再発防止のための対策の検討や助言などを、技術的な立場から行なっています。特定の政府機関や企業からは独立した中立の組織として、日本における情報セキュリティ対策活動の向上に積極的に取り組んでいます。

by [JPCERT/CC - about](https://www.jpcert.or.jp/about/)

# その他

[OECD Guidelines for the Security of Information Systems and Networks: Towards a Culture of Security](http://www.oecd.org/sti/ieconomy/oecdguidelinesforthesecurityofinformationsystemsandnetworkstowardsacultureofsecurity.htm)
Python初心者のメモ1

# はじめに
ブログを書く習慣がなく、まずはメモとして自分の確認用として作っていく
Pythonは初心者で、現在[PyQ](https://pyq.jp/ "PyQ")を使って学習中
メモになるので、書きたいものを書いていきます。

## 文字コード
Pythonの文字コードはutf-8が主流である。
文字化けが起こってしまった場合にどのようなアプローチをとるか。

### Python実行環境の文字コードの確認
```Python:getpreferredencoding
import locale
print(locale.getpreferredencoding())
```
## ファイルの読み込み
Pythonでファイルを読み込みするときは、
open関数を使用する。
ファイル数、サイズによりメモリが食われてしまうので、
ファイル開いて、必要なくなったら、必ず閉じるようにする。
with構文を使うと、そのスコープ外になると、
自動的にファイルを開いたオブジェクトはcloseされるので、基本的にwith構文を用いる

```Python:with_open
with open('test.txt', encoding='utf-8') as fp:
    s = fp.read()
#ここで、with構文の外になるので、ファイルは閉じられる
print(s, end='')
# 1行ずつ読み込み
with open('test.txt', encoding='utf-8') as fp:
    for s in fp:
        # 改行をいれない場合は、endを指定する
        print('s', end=' ')
```
vscodeでファイルタイプごとの設定を作る

## 操作の流れ
コマンドパレット→ "Preferences: Configure Language Specific Setting..." → 言語名を選択→ setting.json内に設定を記述 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84845/d73103e9-bbf5-9f33-8d7c-bca77d330319.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84845/b73247a1-9deb-46d5-9562-747273dc348f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/84845/c6ff4ac3-9f6c-c8ec-4291-59cb1d84c4fe.png)

### プレーンテキストの場合
コマンドパレットの一覧からは出てこないが,`[plaintext]{}`として直接setting.jsonに書き込むことで設定できる.
LaTeX備忘録 #表

# セル内改行をしたい．

https://tgnx8810.wordpress.com/2014/11/29/latexで表のセル内改行はtabularx環境を使うと楽/

# \longtable環境下でセル内改行をしたい（tabularxを使いたい）．

http://mrikc.hatenablog.com/entry/2015/09/04/020128
仕事でHadoopを使うことになったので備忘録（製品の概要）

# Hadoop とは？
- ビッグデータを分散処理を支えるオープンソースのソフトウェアフレームワーク
- Java言語で作られている。
- 2019/02 現在バージョンは 3.2.0
- 大きく分けてMapReduceとHDFSで構成されている
- MapReduce
 - Mapとは入力を受け取り、それを変換しkey-valueの形式で出力を行う処理を実装するためのもの
 - ReduceではMapで出力したkey-valueのペアのうち同じkeyを持つものを集約して処理を行う
- HDFS(Hadoop Distributed File System)
 - データを複数のディスクから並行して読み、処理の多重度を上げることが可能
 - NameNodeにデータの格納先を記録しておき、DataNodeにデータを格納

## Hive とは？
HiveはHDFS上に保存されたデータをテーブルとして扱い、
HiveQLと呼ばれる、SQLライクなDSL言語を使うことで、
MapReduceを意識することなく、データを操作することができる。

## Yarn とは？
- Yet-Another-Resource-Negotiatorの略
- Hadoopクラスタのリソース管理、ジョブスケジューリングを担当する。バージョン2.2からYarnが組み込まれている。
- ResourceManager, NodeManager, ApplicationMaster で構成されている。
 - ApplicationMaster が必要なリソース割り当てをResourceManager に依頼
 - ResourceManager がリソース割り当てを実施し、ApplicationMaster がNodeManager に処理の実行を依頼

## Apache Spark とは？
- HadoopがJava言語で作られているのに対してSparkはJavaの派生言語であるScalaで作られている。
 - Java, Python, R言語等昨今広く使用されている言語に対応したAPIがある。
- インメモリによる高速化が可能
- データの格納先がHDFS以外にも対応
 - Cassandra, OpenStack Swift, Amazon S3等

## CDH(Cloudera Distribution for Hadoop)とは？
- Apache Hadoopや関連製品を含むClouderaのソフトウェアディストリビューション
- CDHのおかけで環境の構築が容易となった。
- Apache Flume や Hive や Spark、Kudu などを含む。
Google Spreadsheetでランダムに出力するオミクジ的なサイトを作る(2)createTemplate編

[Google Spreadsheetでランダムに出力するオミクジ的なサイトを作る(1)
](https://qiita.com/usop4/items/20878f6aeed0d2a4b2c7)では、Google AppScriptの`HtmlService.createHtmlOutput()`を試したが、HTMLをハードコーディングするのも気持ち悪いので、`HtmlService.createTemplateFromFile()`を使ってみる。

まず、テンプレを作る。

```html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <? var data = getData(); ?>
    <h1><a href="<?= data[0] ?>" target="_top"><?= data[1] ?></a></h1>
  </body>
</html>
````

そして、今までdoGet()の中に詰め込んでたものを分割して、doGet()はcreateTemplateFromFileだけにして、データ生成はgetDataの中で行う。

```js
function doGet() {
  return HtmlService
      .createTemplateFromFile('index')
      .evaluate();
}

function getData(){
  var spreadsheet = SpreadsheetApp.openById('シートID');
  var sheet = spreadsheet.getSheetByName('list');
  var lastRow = sheet.getLastRow();
  var rand = Math.floor( Math.random() * lastRow ) + 1;
  var url = sheet.getRange(rand,1).getValue();
  var title = URLtoTitle(url);
  return [url,title];
}

function URLtoTitle(url) {
  var response = UrlFetchApp.fetch(url);
  var myRegexp = /<title>([\s\S]*?)<\/title>/i;
  var match = myRegexp.exec(response.getContentText());
  var title = match[1];
  title = title.replace(/(^\s+)|(\s+$)/g, "");
  return(title);
}
```

一瞬、「このアプリケーションは、Google ではなく、別のユーザーによって作成されたものです。」という表示を消せるかな？と期待したが、結局、iframe構造は変わらないのでタイトルを設定しても反映できないがJavaScriptぐらいは使えるようになった。
eclipseでC言語はじめました！

おはよーございます。
こんにちは！
こんばんわん！　

初の投稿です。

機械設計が本業なのですが、仕事の幅を増やすべくC言語を修行中です。

スキルとしては、
-arduinoでセンサーからデータを取得とかモータ動かしたりとか
-windowsでbat形式のファイルを作ってみたりとか

そんなレベルですが、頑張ってQiitaに投稿！

本日のメニューはコチラ！！
eclipseを使ってHello worldしてみる！！

なぜ、eclipseなのか？
なんとなくです（笑）

ぼくは超初心者だったのでeclipseをダウンロードするにもドキドキでしたので、そんな人にも安心して進めて行けるように手順を書いていきたいと思います。

いきますよー！

①eclipseをダウンロード、そしてインストール

これは下記ページを参考にすると分かりやすいです。
https://qiita.com//nenimigi/items/48fcf6f4c9408820266d

②作ってみる

IDEを立ち上げたら、Ctr＋Nでプロジェクトを新規作成。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/2bdf6ca7-d1d2-5480-922f-76c5e298269a.png)

プロジェクト名を決めて完了してください。

プロジェクトフォルダができると、ツリーがこんな感じになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/ee0d724e-53de-cd6c-e28d-65aed7d8ca23.png)
このツリーフォルダから右クリックして新規→ソース・フォルダーをクリック。
フォルダー名はsrcにしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/8a664bcd-0760-a096-9eab-320592dd7bda.png)

これでsrcフォルダができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/f93322f4-43f5-b196-3fb9-3e516f993854.png)

次にsrcフォルダを右クリックして、新規→ソース・ファイルをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/f4c6fbeb-72a9-3a22-2c7c-5d983cdb7e73.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/6f0faf00-f354-04e9-8f08-1fb50bb73bdb.png)
こんな感じでファイル名を決めてください。
ファイル名の最後に必ず.cが必要です。
（日本語もOKなようですが、最後に.cの拡張子を必ず付けてください。）

これで必要なファイルができました。
で、次に良くわかってませんが、次の設定が必要です。

プロジェクトフォルダを右クリックして実行→実行の構成をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/83cd2f80-8350-067f-8811-86f28f0ca328.png)

C/C++アプリケーションをダブルクリックしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/31de447d-d8b1-2dfd-1459-0ac4e2fe065f.png)

これで実行構成ウィンドウは閉じてOK。
これでテキトーにコードを書いて実行。

すると、こんなエラーが出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/67b53aad-83d1-0478-ad16-217fa15aaa78.png)

OKを押して閉じる。
（ここで新しいファイルができているようです。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/ade470e6-13d8-f452-47b4-6f09f9f25f21.png)

srcフォルダと同列にアプリケーションファイルができています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/670afd6e-804e-b97c-ea48-38628baac0c1.png)

再び実行構成を開いて、上図のように参照してあげてください。
これで実行すると、プログラムが走ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172184/f026a2e1-b24c-0f86-d34c-debcc38083a4.png)

以上です。
実行の構成のところが良くわかってませんが、面倒ですね。。。
[RubyMine]現在のファイルをツリーウィンドウ上でアクティブにしたい

ツリーウィンドウのセッティングボタンから`Autoscroll from Source`

<img width="933" alt="Screen Shot 2019-02-03 at 11.15.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/34733/3c3c4aee-bf3e-959c-6126-e1a8ab7e8af1.png">
UbuntuのGPUを換装する

UbuntuのグラフィックカードをradeonからNvidiak差し替えたときに以下の画面から進まなくなり、ログインできなくなった。

問題の解決の記録。
♯ TL;DR
Ubuntuをリカバリーモードで起動してグラフィックドライバーをアンインストール
標準のドライバで低画質で起動するようになるので、システム設定からプロプライエタリなドライバをインストール
オブジェクト指向の説明について[面接対策]

<h2>はじめに</h2>

私は未経験エンジニアで転職活動をしている身です。選考が進むにつれて技術的な質問をされます。
今回は実際に面接でされた質問をもとに復習をかねて記事にします。

今回の質問は「オブジェクト指向について教えてください」です。
オジェクト指向ってすごく難しいですよね、ググっても明確な答えが見つからないというか。。。

これはオブジェクト指向と言う概念がそもそも抽象度が高いからです。

<h2>オブジェクト指向とは</h2>
結論から言うと、オブジェクト指向とは**「開発を効率化するために作られた概念」**とのことです。

オブジェクト指向を知ることで３つのメリットがあります。
・開発を効率化できる
・プログラムの設計ができる
・他人が書いたコードが読める

では、オブジェクト指向という概念はなぜ生まれたのでしょうか？
それは開発中に発生した諸問題からきているそうです。

・バクが発生する
・仕様書の変更に時間がかかる
・どこに何のコードが書いているかがわからない　・・・

といった問題があるためです。
個人の趣味程度のアプリなら少しのt調査時間で解決しそうですが、大規模案件の場合はオブジェクト指向がないと解決にすっごい時間が掛かりそうなのは容易ですよね。

<h2>オブジェクト指向型言語のプログラミングとは</h2>
モノを組み立てるように表現して、コンピュータが動作をさせるものです。

上記の通り、オブジェクト指向型言語を理解することで、コードが管理しやすく、バクを発見しやすくなりました。

どうでしょうか、僕自身何となくの理解しかしていませんが、未経験ですのでこれから実務を積むことで理解できると考えています。笑


今回はここまでにします。
俺流 Markdownでのノートの取り方

こんにちは。
本記事は、最近[HackMD](https://hackmd.io)を用いて複数人で作業することが増えてきたので
自分流のコマンドの使い方を備忘録としてまとめたものです。
尚、書きたいことが増えたタイミングや書き方が変わった場合に追記や修正を加える場合があります。
（最終編集：2019/04/15）

## 前提
基本的なmarkdown記法はわかっているものとします。
今回は記法をどのような用途で使っているかの説明です。

(追記：2019/04/15)
書くネタが少なく感じたのと、学校に新入生も入ったということで記法も書きます
細かいのは[Qiita マークダウン記法 一覧表・チートシート](https://qiita.com/kamorits/items/6f342da395ad57468ae3)がわかりやすいので見てください

## 章、節、項について
```js:sample.md
# タイトル
## 1

### 1.1
***

### 1.2
#### 1.2.1

---

#### 1.2.2

***

### 1.3

---

## 2
```

#### ポイント
内容が変わるごとに`***`や`---`でラインを入れるとわかりやすいかも（自分はそう）

## 基本記法
|記法|表示|
| -------- | -------- |
|`**太字**`|**太字**|
|`*イタリック*`|*イタリック*|
|`~~伏せ字~~`|~~伏せ字~~|
|`<u>下線</u>`|<u>下線</u> |
よく使うのはこの辺かと

## 箇条書き

### 記法
```
* 1つ目
    * 1.1つ目
    * 1.2つ目
- 2つ目
```

### 表示
* 1つ目
    * 1.1つ目
    * 1.2つ目
- 2つ目

`*`、`-`が使えるって覚えてたらいい
見たらわかるように`Tab`でいい感じにできる（~~語彙力~~）

## 連番
### 記法
```js:number.md
1. ひとつめ
    2. aasas
1. ふたつめ
2. みっつめ
```
### 表示
1. ひとつめ
    2. aasas
1. ふたつめ
2. みっつめ

`1.`や`2.`のように数字+`.`でできる
番号は関係ない

## 注釈、tips、備考などについて
```
##### `注釈`：用語の解説
##### `備考`：ちょっと気を付けた方がいいもの
###### `tips`：ためになる一言
```
##### `注釈`：単語の解説
##### `備考`：ちょっと気を付けた方がいいもの
###### `tips`：ためになる一言

#### ポイント
講義などのノートの場合、教授が言ったものは`#`が5個
自分で勝手に思ったメモは`#`が6個（文字の大きさが変わるため）
備考などの文字はバックフォート（JISキーボードだと`shift` + `@`）で囲むこと

## 数式について
### 矢印
文中で矢印を使いたいときはインライン数式の`$~$`で以下のコマンドを挟む。

|コマンド|表示|コマンド|表示|コマンド|表示|
| -------- | -------- | -------- | -------- | -------- | -------- |
|\rightarrow|$\rightarrow$|\Rightarrow|$\Rightarrow$|\longrightarrow|$\longrightarrow$|
|\leftarrow|$\leftarrow$|\Leftarrow|$\Leftarrow$|\longleftarrow|$\longleftarrow$|
|\uparrow|$\uparrow$|\Uparrow|$\Uparrow$|\Logrightarrow|$\Longrightarrow$|
|\downarrow|$\downarrow$|\Downarrow|$\Downarrow$|\Longrightarrow|$\Longleftarrow$|
[Swift] ~個飛ばし数字などをループさせる方法！ex) ４飛ばしでprintしたい

#　Stride 型を用いよう！
とりあえず、サンプルコードを見てみましょう！

```swift:ex
for x in stride(from:0, to:20, by:4){
     print(x, terminator:" ")
}//0 4 8 12 16 " と表示される。
```
***
###上記の例文のようにstride型はfor分と組み合わせることが多い！
####サンプルコードを見てわかるように　stide型は指定した範囲の中で~ごとに値を増やしながらループすることができます！
短いですが今回はこれで終わりです！
ドメインモデリングの練習

ドメイン駆動設計の勉強をするために、仮想のシナリオ、業務を用意してドメインモデルの作成やロバストネス図の作成をしてみました。
まずは作ってみることを優先したので、正しい文法で図が描けているかどうかはひとまず置いておきました。

# シナリオ概要
自社商品をインターネット経由で注文を受けて販売・配送する会社。
顧客から注文された品物を物流センターで梱包し、発送する。
複数の注文をまとめて発送する。(ロットで発送する)

# 業務の流れ
顧客がECサイトにアクセスする。
顧客が購入したい商品をカートに入れる。
顧客は注文確認画面で購入したい商品を選択している事を確認し、注文を確定する。
注文が確定されると、システムにより購入された商品の在庫が引当られる。
在庫引当が完了後、システムにより売掛金が計上される。
在庫引当が完了後、システムから商品が保管されている倉庫に出荷指示が出される。
出荷指示と同時に、システムから物流センターに配送指示が出される。
倉庫オペレーターは、出荷指示確認画面を見て出荷する商品を確認し、物流センターに送る。
物流センターオペレーターは倉庫から出荷された商品が届いたら、出荷品受領画面から商品を受領した旨を登録する。
物流センターオペレーターは、配送準備画面を確認し、配送する商品を確認して配送準備を行う。
物流センターオペレーターは、配送準備が完了した後、運送会社に配送依頼をする。
経理担当者は、クレジットカード会社からの入金情報を元に売掛金の消込を行う。

## 補足
- ECサイトはクレジットカード決済のみとする
- 物流センターからの配送はすべて外部の運送会社に依頼している
- 顧客は個人も法人も存在する

# ドメインモデル
![DDD-ドメインモデル_0.4.png](https://qiita-image-store.s3.amazonaws.com/0/133936/174b859f-ce48-505f-79fa-de12adf3bd31.png)



# ロバストネス図
コントロールはアクターからのリクエストを受け付けるものとドメインを表すものに分けています。
一旦、ドメインが持つ複数の振る舞いをひとつのコントロールにまとめました。
![DDD-ロバストネス図_v0.2.png](https://qiita-image-store.s3.amazonaws.com/0/133936/78a8d28e-f5f9-11ce-5fd5-8c97f0777851.png)
Qiitaのトレンド表示機能についての考察

トレンド評価は、トータルのビュー数に対するいいね獲得数の割合だということに気づく。

```
トレンド評価ポイント＝いいね数÷トータルビュー数
```

やはり、エモくて万人受けする記事以外はトレンド入りするのは難しい。
ちなみに私の記事が今日トレンド入りしたときの状態は、

5いいね÷80view＝打率6%

でした。
日を追うごとにランク外になる記事が量産されるのは、時間が経てば経つほど1viewあたりのいいね獲得確率がどんどん下がるから、だと推察します。
つまり、viewに対するいいねの打率が下がるとおのずとトレンドから消える、と。
おそらく公開からの経過時間は関係ないです。
なぜなら私の記事は公開から１日以上経過したあとにトレンド入りしたからです。
トレンド入りした瞬間、いいね獲得数よりも相対的にviewの伸びが激しいため、万人受けしない記事は短命に終わる理由が分かります。
おおむね打率5%からトレンド入りの可能性がありそうです。
また、足切りラインとして「最低５いいね」という制限もあるように見えます。

トレンドの最下位にギリギリ滑りこんだからこそ分かったことでした。
以上、しょうも無い考察でした。

2019.02.06 12時
33いいね÷1424view＝2.3%
トレンド入りから３日半経過し、トレンドから消え去るどころか逆に中間あたりまで順位が伸びています。一見するとviewの伸び率も加味されているように見えます。ここまで来ると、いいねの伸びよりviewの伸びのほうが効いているようです。今晩あたりに消えると予想。プログラミングネタとはかけ離れた内容だけに、技術とは関係能無い内容を揶揄されそうで怖いです。そうなると本意ではないです。本当は目立たなくても良いと考えて投稿したネタで、同じような志向の方々のモチベーションアップに繋がれば嬉しい、というレベルで投稿をしたつもりでした。

2019.02.06 17時
トレンドから忽然と消えました。
35いいね÷1550view＝2.3％

一度トレンド入りすると、viewが伸びている間は一定期間生存する仕組みなのでしょうか。
あるいは、いいねの獲得件数が１２時間以内に◯件、というような一定の基準があるのかもしれません。
ASUS U38NにLubuntu 18.10 を入れる

ASUS U38NにLubuntu 18.10を入れたときのメモ

# Preface

+ Lubuntu: https://lubuntu.net
+ U38N: https://www.asus.com/jp/Laptops/U38N/
+ この作業の前にHDDはWD製の500GBのSSDに交換した
  + バッテリー側のネジも外さないと交換できないので注意 
+ インストールはDVDから実行 (ポータブルDVDライターを使用)
  + Ubuntu18.04なマシンでXfburnを使ってisoを焼いた 

# BIOS設定

+ 一番最初に必要なはず(自分は少なくともこれで行けたというだけ）
 + Fast Boot [Disable]
 + Secure Boot Control [Disable]

# インストール中

+ Wi-FiはONにした状態でインストールを始めた
+ キーボードは105Keyを選ぶ (デフォルトのはず)
  + (キーボードのイメージ画像に"z"がないので違うやつなのかなと思ってしまったが、デフォルトで良い) 

# インストール後

## Mozcを入れて日本語入力できるようにする

+ fcitx-mozcを入れる
+ 
```
$ sudo apt-get install fcitx-mozc
$ sudo shutdown -r now
```

+ [fcitxの設定]->[入力メソッド]->(左下の)[+]経由でMozcを追加
+ (あとWeb検索のサジェストとバッティングして多分うざいので、Mozcのサジェスト関係の設定をすべてOFFにする)

## タッチパッドのスクロール方向の変更

+ MacBookとかと一緒にする

+ 下記のコマンドを実行(もしかしたらこのドライバーはすでに入っていて、いらないかも。細かい話は失念。)
  + https://askubuntu.com/a/809040 

+ タッチパッドのidをメモ(xxxは数字)

```
$ xinput | grep ETPS
ETPS/2 Elantech Touchpad id=xxx
```

+ `~/.xinitrc` を設定。下記の行を追加(xxxは数字に置き換え)して保存。

```
xinput set-prop xxx 'libinput Natural Scrolling Enabled' 1
```

+ chmod +x

```
$ chmod +x ~/.xinitrc
```

+ LXQtセッションの設定 -> 自動起動 -> LXQt自動起動 に ~/.xinitrc を追加 (ファイルはみえないが、直接ファイル名をうちこんでエンターを押せば登録できる）

+ 再起動

```
$ sudo shudown -r now
```

## 内蔵カメラの動作確認

+ Muon Package Manager経由で"cheese"と"cheese-common"を選択
+ Apply Changesを適用
+ cheeseを起動してカメラが写ってるかチェック

## HDMIポートの動作確認

+ TVのHDMIにつなぐ
+ 適当な動画サービスを流して、画像だけじゃなくて音声もTVから出てくるかチェック

## Caps lockをCtrlにする

+ 下記の記事と同様の方法でOK
  + https://qiita.com/hirooooooaki/items/f404e76c6f171769412a

## 蓋を閉じたときにサスペンドするように変更

+ 設定 -> LXQt settings -> 電源管理 -> フタ
+ バッテリー動作時の値をサスペンドに設定
+ （BIOSの設定によるのかもしれないが、おそらくハイバネートは効かないので注意）

# おわりに

自分のU38Nの場合たまたまうまくいきましたが、市販ノートブックへのLubuntuのインストールはとても危険な作業だと思います。
インストールの際は自己責任でお願いします。
AKSのチュートリアル

「しくみがわかるKubernetes」に沿って進める
AzureContainerRegistry（以下「ACR」）にビルドする。

**セットアップ　**

```bash
$ brew update && brew install azure-cli
$ az login
$ az provider register -n Microsoft.Network
$ az provider register -n Microsoft.Storage
$ az provider register -n Microsoft.Compute
$ az provider register -n Microsoft.ContainerService
$ brew install kubernetes-cli
```

**リソースグループの作成とレジストリへのビルド**

```
$ az group create --resource-group test --location japaneast
$ az acr build --registry testr --image kusakari:v1.0 src/
The resource with name 'testr' and type 'Microsoft.ContainerRegistry/registries' could not be found in subscription '無料試用版 (XXXXX)'.
```

無料のサブスクリプションでは、ビルド不可？
サブスクリプションを従量課金に更新して、続行する。

**レジストリへのビルドと結果確認**

```
$ az acr build --registry testr --image kusakari:v1.0 src/
$ az acr repository show-tags -n testr --repository kusakari
[
  "v1.0"
]
```

いけました。
aws周りのメモ4



https://blog.adminfactory.net/allow-access-to-s3-bucket-only-from-ec2-instances.html

s3を限定的にホスティングとしてつかう


http://www.apro-soken.co.jp/blog/yonesaka/2012/11/s3sphinx.html

sphinx

## AWS CDK

awslabs/aws-cdk： The AWS Cloud Development Kit is a framework for defining cloud infrastructure in code
https://github.com/awslabs/aws-cdk

AWS CDK (AWS Cloud Development Kit) がとても便利そうなので触ってみた - YOMON8.NET
https://yomon.hatenablog.com/entry/2018/08/14/AWS_CDK%28AWS_Cloud_Development_Kit%29%E3%81%8C%E3%81%A8%E3%81%A6%E3%82%82%E4%BE%BF%E5%88%A9%E3%81%9D%E3%81%86%E3%81%AA%E3%81%AE%E3%81%A7%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F

AWS CDKをKotlinで試した - Qiita
https://qiita.com/tiibun/items/7d3a06c5b2eb672d6e1d

kotlinもつかえるのか

AWS Lambda ( Typescript ) の Lambda Layers 活用、開発、デプロイ考察 ｜ DevelopersIO
https://dev.classmethod.jp/server-side/serverless/aws-lambda-typescript-lambda-layers-deploy/

layersを使う例

AWS CDKでサーバーレスアプリケーションを構築する - kentarom
https://scrapbox.io/kentarom/AWS_CDK%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B

シンプルで試すのに良かった

## lambda

### アプリケーションという概念についてキャッチアップ

［アップデート］Lambdaコンソールにアプリケーションの管理とモニタリングをするメニューができました ｜ DevelopersIO
https://dev.classmethod.jp/cloud/aws/aws-update-lambda-application-console/

AWS Lambda アプリケーション - AWS Lambda
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/deploying-lambda-apps.html

lambdaのデプロイやリリースなどをひとまとめに管理する箱的なことか。。

## lambda@Edgeまわり

AWS CloudFront Lambda@Edge の罠たち | d.sunnyone.org
http://d.sunnyone.org/2018/03/aws-cloudfront-lambdaedge.html

リージョンが違うとレプリカ関数というのが作られたりするのね

ダイナミック レンダリングの使用方法  |  検索  |  Google Developers
https://developers.google.com/search/docs/guides/dynamic-rendering?hl=ja

GAになったLambda@Edgeを使ってSPAをSSR無しでOGPとかに対応させてみる - Qiita
https://qiita.com/kiida/items/17e804765f424fd990db

## AWS Toolkit

新発表 – AWS Toolkits for PyCharm、IntelliJ（プレビュー）、Visual Studio Code（プレビュー） | Amazon Web Services ブログ
https://aws.amazon.com/jp/blogs/news/new-aws-toolkits-for-pycharm-intellij-preview-and-visual-studio-code-preview/

便利。。

Installing the AWS SAM CLI on macOS - AWS Serverless Application Model
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html

samを入れ直す
想定外にいろいろと連動して依存ブツがインストールされだした。。

Installing the AWS SAM CLI on macOS - AWS Serverless Application Model
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html

cdkで作ったやつをtoolkitに紐づけたい
template.yamlが接点になってる気がするのだけど。。
`AWSTemplateFormatVersion: '2010-09-09'`をテンプレートに追記してみたりしてちょっと進んだけどうまくいかず。
うーん。。ひとまずcdkでいいかな。

## sam

aws-sam-local 改め aws-sam-cli の新機能 sam init を試す - Qiita
https://qiita.com/hayao_k/items/841026f9675d163b58d5
VirtualBoxチートシート

# macOS上のVirtualBoxでWindows10を動かす

## コマンドラインから操作する

### 仮想マシンを起動する（bash）
```bash
VBoxManage startvm Windows10
```

### 仮想マシンのリストを取得する（bash）
```bash
VBoxManager list vms
```

## マウス関係

### 右クリックをする
トラックパッドを二本指でタップすると右クリックになります。
CakePHPをインストール

Cakephpを使う際にインストールするものなどの設定を忘れないように簡単にメモ。

#Composerをインストール
WINDOWS10の場合　ctrl + r でコマンドプロンプトを起動

下記のコードを入力しcomposerをインストール。

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```
composerのDLページ
https://getcomposer.org/download/

#プロジェクトを作る

まずコマンドプロンプトでデスクトップに移動

```
cd　desktop
```

その後、書きを入力。プロジェクト名は任意。

```
php composer.phar create-project --prefer-dist cakephp/app[プロジェクト名]
```

##エラーが出た場合はphp.iniを修正
；を削除。記述がない場合は記述すること。

```
;extension=php_intl.dll
↓
extension=php_intl.dll
```

以上。随時追記していく予定。
recaptchaの画像認証

##なんで
recaptchaの画像認証が毎回でるユーザーとそうでないユーザーがいるので調査。

##原因
使用ブラウザでgoogleアカウントにログインしてるかどうかで変化する。

##未ログインの場合
・同一セッションにおいて初回の回答時に画像認証が出る。
・セッション情報が変わると、また回答時に画像認証が出る。

##ログイン済みの場合
・初回のみ画像認証が必要
git 困った場合のメモ


## 状態を把握するコマンド

### status
~~~
git status 
~~~
commitとuntrackedの状態を確認できる

### log
~~~
git log
~~~
commitの履歴を確認できる

### ls-files

~~~
# 全ての管理済ファイルを表示
git ls-files -c

# ワークツリーで変更済のファイルを表示
git ls-files -m

# ワークツリーで削除済のファイルを表示
git ls-files -d

# 無視リストに載っているが管理済のファイルを表示
git ls-files -i --exclude-standard

# 全ての未管理ファイルを表示
git ls-files -o

# ワークツリーで新規作成されたファイルを表示
git ls-files -o --exclude-standard

# 無視リストに載っていて未管理のファイルを表示
git ls-files -io --exclude-standard
~~~

## add の取り消し

~~~
git rm [file-name]
~~~

ローカルのファイルごと削除する。慎重に。

~~~
git rm -r --cached .
~~~
addの履歴のみ削除する


## 100MBを超えるサイズのファイル、ファイル群をpushしてしまいrejectされたとき

### commitの履歴を調べる

~~~
git log
~~~

commitIDを確認
### commitされる前の状態までさかのぼる

~~~
git reset --soft [commitID]
~~~

いつでも戻れるように、一番最初のcommitはreadmeだけにした方が良い。最初からメインのcommitするとそこでrejectされた場合戻れなくなる。

その場合は

~~~
git commit --amend 
~~~
でcommitを上書きする

### gitignoreに100MB超えのファイル、ディレクトリを記載してcommitしなおす


~~~
git add .
git commit -m "commit modified"
git push origin master
~~~
はじめての非同期処理 call backは，送信機と受信機のイメージで．(OcuGo.Games)

##1. 非同期処理とは。

このボタンが押されたら、とか。

敵が３体倒されたら、とか。

一般論でいうと、この人から電話がきたら、とか。

自分のタイミングではなく、外部からのトリガーで処理を実行したい際に「非同期処理」を使います。


##2. 送り手と受け手がいる．


送り手：　条件を満たしました！
![keitai_mukashi.png](https://qiita-image-store.s3.amazonaws.com/0/274029/ed868179-f729-caab-9096-fa2d8cee7fca.png)




受け手: 条件満たしたのね．連絡ありがと！　次の処理流そっと．
![denwa_business_woman.png](https://qiita-image-store.s3.amazonaws.com/0/274029/2c9770e7-63ec-ab95-d470-9c02d1922232.png)






##3. callbackは System.Action型
C#では、System.Action型の Callback　という関数が用意されています．
以下では、「スペースキーが３回押されたら」という条件をトリガーに、次の処理を流すという設定でコードを紹介します。

###送り手側

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CountSpace : MonoBehaviour {
    System.Action Callback;
    int spacenum = 0;
   // Update is called once per frame
    void Update()
    {    //スペースキーを押すとspacenumをカウントアップする．
        if (Input.GetKeyDown(KeyCode.Space)){
            this.spacenum++;
        }
          //スペースキーが３回押されたら
        if (spacenum == 3) {
            this.Callback();  //送信機を使用して連絡をする．
        }
     }
    
    //送信機の設置
    public void SetCallback(System.Action Callback) 
    {
        this.Callback = Callback; //
    }



```




###受け手側

```C#
  public CountSpace A; //CountSpaceという classの Aという変数

    // Use this for initialization
    void Start () 
   {     //電話が来たらカッコ内の処理を流す．
        A.SetCallback(連絡を受け取ってから流したい処理);
    }

```
ここでは仮に変数名をAとしましたが，なんでも構いません．
イメージ的にはAさんからかかってきたらということですが，そのAさんが誰であるか限定する必要がないためです。
【R】相関係数を求める方法

以前に書いた[【R】散布図を描く方法](https://qiita.com/nkojima/items/c008adec58c7834edfc1)では、2つのデータ（二変量）の相関関係を図示しましたが、今回は2つのデータの相関係数を求めたいと思います。

# 解析に使うデータ

* 以下のデータは、ある山の東側（east）と西側（west）の様々な標高で測定した樹高（m）です。
 * direction列：斜面の方角（east/west）
 * altitude列：測定地点の標高
 * tree_height列：測定された樹高

```:tree_height.csv
direction,altitude,tree_height
east,260,12.1
east,320,12.3
east,390,8.2
east,430,9.8
east,470,7.9
east,500,6
west,280,15.3
west,330,11.9
west,380,11.2
west,410,9.3
west,440,7.9
west,500,6.8
```

# 相関係数を求める

* 相関係数の算出には、cor関数、もしくはcor.test関数を使います。
* 相関係数を算出する手法については、methodパラメーターで指定します。
 * ピアソンの積率相関係数：method="pearson"
 * スピアマンの順位相関係数：method="spearman"
 * ケンドールの順位相関係数：method="kendall"

## ピアソンの積率相関係数の算出

## 相関係数の算出＋無相関検定

* 下記の結果を見ると、相関係数(cor)が-0.915107となっているので、標高と樹高との間に「強い負の相関」があることが分かります。
 * つまり、「標高が上がるほど、樹高が低下する」ということ。
* 相関係数の値は、一般的には以下のような区分がされているようです。
 * 0.0～±0.2：ほとんど相関がない
 * ±0.2～±0.4：弱い相関がある
 * ±0.4～±0.7：相関がある
 * ±0.7～±0.9：強い相関がある
 * ±0.9～±1.0：非常に強い相関がある
* p値(3.007e-05)は無相関検定の結果なので、標高と樹高との間に有意な相関関係があることが分かります。

```r:Rのコンソール
> tree_height <- read.table("C:\\tree_height.csv", header=TRUE, encoding="CP932", sep=",")
> cor.test(tree_height$altitude, tree_height$tree_height, method="pearson")

        Pearson's product-moment correlation

data:  tree_height$altitude and tree_height$tree_height
t = -7.1769, df = 10, p-value = 3.007e-05
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.9762830 -0.7186016
sample estimates:
      cor 
-0.915107 
```

## 相関係数の算出のみ

* 相関係数しか必要としない場合は、cor関数を使うと相関係数のみのシンプルな結果を得られます。

```r:Rのコンソール
> cor(tree_height$altitude, tree_height$tree_height, method="pearson")
[1] -0.915107
```
Rust で Windows プログラミング - MessageBox編

##環境
toolchain: stable-i686-pc-windows-msvc
rustc 1.32.0 (9fda7c223 2019-01-16)
[winapi 0.3.6](https://github.com/retep998/winapi-rs)

##Hello, World!
MessageBox を呼び出すサンプルアプリを作ってみます。

Cargo.toml の編集から始めます。 
必要に応じて features に使用する module を追加していきます。
version 0.3 から kernel-sys 等の -sys が付く crate は不要になっています。

```toml:Cargo.toml
[package]
name = "hellow_world"
version = "0.1.0"
authors = ["benki"]
edition = "2018"

[dependencies.winapi]
version = "0.3"
features = ["winuser"]
```

続いて main.rs。以前は一行目に `extern crate winapi;` を書いていましたが、edition = "2018" では不要になりました。

```rust:main.rs
use winapi::um::winuser::{MessageBoxW, MB_OK};
use std::ptr;

fn main() {
    unsafe {
        MessageBoxW(
            ptr::null_mut(), //hWnd: HWND
            encode("Hello, World!").as_ptr(), //lpText: LPCWSTR
            encode("こんにちわ、世界！").as_ptr(), //lpCaption: LPCWSTR
            MB_OK); //uType: UINT
    }
}

fn encode(source: &str) -> Vec<u16> {
    source.encode_utf16().chain(Some(0)).collect()
}
```

`MessageBoxW`の第一引数は親ウィンドウの`HWND`ですが、今回は使用しないので `ptr::null_mut()`を渡しています。
第二、第三引数は`LPCWSTR`型なので UTF-16 文字列へのポインタを渡せば良いのですが、Rust の文字コードは UTF-8 なので変換する必要があります。そこで`encode`関数で変換しています。`std::str::encode_utf16()`で UTF16 へ変換。`.chain(Some(0))`で NULL 終端文字を追加。`.collect()`で`Vec<u16>`にまとめて戻り値としています。

次回はウィンドウを作ります。
[Rust で Windows プログラミング - CreateWindow編](https://qiita.com/benki/items/c01f7da1e1a71cc91d11)
[備忘]AWS認定クラウドプラクティショナー受験→取得した

いつか、知り合いにも受ける人が出てくるかもしれないので、備忘の意味で残しておきます。

#きっかけ
転職した先で、「今後、オンプレのサーバ全部クラウド(AWS)に移行していくから勉強してね」と言われたので。
これまでの職歴でインフラ周りは一切触ったことありませんでした。(基本情報取るとき勉強した位)


#勉強方法
後述の参考先に書かれていた勉強方法とほぼ同じですが、

・[Amazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443/)を見ながら、実際にサーバ立ててみる
→なんか難しいなとなって、[AWSをはじめよう](https://booth.pm/ja/items/1032590)に切り替え。インフラ初心者には、こっちの方がオススメです。
・[青い本](https://www.amazon.co.jp/%E5%90%88%E6%A0%BC%E5%AF%BE%E7%AD%96-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E5%A4%A7%E5%A1%9A%E5%BA%B7%E5%BE%B3-%E6%97%A5%E7%AB%8B%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%83%BC/dp/486594043X/)を読む
・公式のサンプル問題(Blackbeltの[後半スライド](https://aws.amazon.com/jp/blogs/news/webinar-bb-practitioner-2018/))解く
・他、各種blackbelt読む
・模擬試験受ける

を2ヶ月くらいかけてやって、受かりました。
試験時間90分を30分くらいで解き終わって、855/1000点だったので、
もっと早く受けても大丈夫だったなと思います。

いろんなサイトに書いてあった通り、模擬試験より遥かに出題方法が難しめでした。
(模擬試験・・どういう形式で出てくるかということがわかるだけなので、ぶっちゃけ2000円勿体無いし受けなくてもよかったなぁと思います。)
一通りサービスの名称と概要覚えておけば消去法使って何とかなると思います。
(Amazon Inspectorって何！そもそもサービスにあったか？　とならないように。)


#参考
公式の試験ガイド等は割愛。(もちろん、一番最初に読みましょう！)

AWS 認定クラウドプラクティショナー 合格しました！
https://server-recipe.com/334/

【合格体験記】AWS 認定クラウドプラクティショナー試験（AWS Certified Cloud Practitioner）
https://saikyouse.com/aws-cloud-practitioner-review/

AWS Cloud Practitioner取得時のおすすめ学習法など
https://qiita.com/marbledmeat/items/c2903d6cb165aeaee1d2

AWS Black Belt Online Seminar AWS 認定クラウドプラクティショナー取得に向けて
https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-aws-124130272

AWS White Belt Online Seminar AWS利用開始時に最低限おさえておきたい10のこと
https://aws.amazon.com/jp/blogs/news/aws-white-belt-online-seminar-aws-10/


#その他

どんな試験でも言えることですが、不測の事態がおきても落ち着きましょう。
今回は、30分前に着いて受付はじめたのに、テストセンターからのアクセスが繋がらない？とか言われて、もう一人の人と一緒に1時間以上待たされました。ワンオペでやってて、ほかの試験の人たちの受付にも影響出てて気の毒でした。


次は、４月にソリューションアーキテクトーアソシエイトを受ける予定です。
(ちょうど[黒い本](https://www.amazon.co.jp/徹底攻略-AWS認定-ソリューションアーキテクト-–-アソシエイト教科書/dp/4295005495/)出ましたね。)
Fish, ghq, peco導入

SourceTreeが苦手なのでgitコマンドを使いこなせるようになりたいです。
リポジトリが沢山あって大変なのでターミナル環境含めて環境構築をしました。
# 出来るようになること

1. リポジトリを一つのディレクトリ配下で集中管理する(ghq)
1. Ctrl+Gでリポジトリ一覧表示、検索、ディレクトリ移動(fish-ghq + peco)
1. Ctrl+rでコマンド履歴検索(plugin-peco)
1. fish_configなどカスタマイズはお好みで

## 手順

1. fishインストール
1. pecoインストール
1. ghqインストール
1. ghqで管理するgitディレクトリを設定する
1. fisher(fisherman)インストール
1. oh-my-fish/plugin-pecoインストール
1. コマンド履歴検索のキーバインドを追加(Ctrl+r) (oh-my-fish/plugin-peco)
1. decors/fish-ghqインストール(キーバインドは標準でCtrl+g)
1. fish-ghqで利用するSELECTORをpecoに切り替える
1. ログインシェルを変更する(お好みで)



```shell
brew install fish
```


```shell
brew install peco
```

```shell
brew install ghq
```

```shell
git config --global ghq.root ~/git
```

ghqでリポジトリを管理する、ディレクトリを指定します。~/gitなどお好みで。

```shell
curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
```

```shell
fisher add oh-my-fish/plugin-peco
```

```shell
# ~/.config/fish/config.fishに追加
#fisherパッケージoh-my-fish/plugin-pecoの設定
function fish_user_key_bindings
  bind \cr peco_select_history # Bind for prco history to Ctrl+r
end
```

```shell
fisher add decors/fish-ghq
```

```shell
# ~/.config/fish/config.fishに追加
#fisherパッケージdecors/fish-ghqの設定
set GHQ_SELECTOR peco
```

```shell
# 末尾に /usr/local/bin/fish を追加
sudo vi /etc/shells

# デフォルトシェルを fish に変更
chsh -s /usr/local/bin/fish
```

## 使い方

### fisherパッケージマネージャで管理しているパッケージをロードする

```shell
fisher
```

fishシェルを起動後、上記コマンドを実行します。(誰か自動で実行する正しい?方法を知っている方が居たら教えてください)

### コマンド履歴を表示する

Ctrl-rでコマンド履歴を表示します。

### Gitリポジトリをクローンする

```shell
ghq get リポジトリのURL
```

ghq.rootを設定することで、保存先のディレクトリを意識せず手軽にクローンできます。

### Gitリポジトリ一覧を表示する

Ctrl-gでリポジトリの一覧を表示します。
SQ値の算出方法（日経平均株価算出方法）

#SQ値とは
>> 【SQ】とは、【Special Quotation】の略で、日経225先物などの株価指数先物取引、または株価指数のオプション取引などを、最終的な決済期日前で決済するための「特別な価格」のことを指します。
算出された価格は特別清算指数、最終清算指数、あるいはただ単にSQ値などと呼ばれます

[引用元：ライブスター証券](https://www.live-sec.co.jp/225/outline/sq.htm)


#日経平均計算方法
>>   日経平均は構成銘柄の株価を「みなし額面換算」したうえで合計し、「除数」で割って算出する
[引用元：日経平均株価 算出要領 ](https://indexes.nikkei.co.jp/nkave/index?type=download)
![keisanhou.JPG](https://qiita-image-store.s3.amazonaws.com/0/351020/f5753a4d-6d09-8d4b-3484-0c0a9bf2d3f3.jpeg)

#最新の除数
27.003　(2019.02.04)　[引用元：日経プロファイル　指数一覧](https://indexes.nikkei.co.jp/nkave/index/profile?idx=nk225)


#Python で計算するコード

```python

josuu = 27.003  #　除数　
df['minashi'] = df['open'] * (50.0 / df.gakumen)

print(f"日経平均(SQ値） = {df.minashi.sum() / josuu :0.2f} ")

```
※```df['open']  ``` 
は2月1日、225社分の始値　←　[楽天RSSでの取得方法](https://qiita.com/zaq9/items/cdbefd7ef4e62b4488af)


##計算結果：
```
日経平均(SQ値） = 20793.00 
```
## 日本証券取引所　[公式発表と一致:](https://www.jpx.co.jp/markets/derivatives/special-quotation/index.html)
>>日経225Weeklyオプション第1週限 	20,793円 00銭