OmniAICreator/Qiita-1.07M huggingface dataset:
PureScriptで脱法Hello, world!

```
$ purs --version
0.12.5
```

# 前置き

"何もしない"コードを書いてみます。

```hs
module Main where

import Prelude (Unit, pure, unit)

import Effect (Effect)

main :: Effect Unit
main = pure unit -- あるいはmempty
```

実行結果

```
```

何も起こりません。

# JavaScriptの`console.log`をPureScriptで実装する

`Effect`のJavaScript語への翻訳は案外単純で、PureScriptの`Effect.Console.log`はJavaScriptの`console.log`を無名関数でラップしたものに相当します。

```hs
log :: String -> Effect Unit
log = -- 実装 (以下はJavaScript)
-- const log = str => () => console.log(str)
```

PureScriptの`Effect.Unsafe.unsafePerformEffect`を使うとラップした関数を無理矢理実行できます。(逆説的に実行者が隠匿されていることになります。)

```hs
unsafePerformEffect :: forall a. Effect a -> a
unsafePerformEffect = -- 実装 (以下はJavaScript)
-- const unsafePerformEffect = effectAsFunction => effectAsFunction()
```

したがって、`console.log`に相当する処理を一応実現できます。

「`unsafePerformEffect` after `log`」。
PureScriptでは`<<<`という中置演算子でcomposeできます。

```hs
unsafeLog :: String -> Unit
unsafeLog = compose unsafePerformEffect log
--        = unsafePerformEffect <<< log
```

# 脱法Hello, world!

```hs
module Main where

import Prelude (Unit, pure, unit, (<<<))

import Effect (Effect)
import Effect.Console (log)
import Effect.Unsafe (unsafePerformEffect)

unsafeLog :: String -> Unit
unsafeLog = unsafePerformEffect <<< log

sayHello :: Unit
sayHello = unsafeLog "Hello, world!"

main :: Effect Unit
main = pure unit
```

実行結果

```
Hello, world!
```

`main`で何もしていないはずなのになぜか出力される気味の悪いコードが完成です。

# 脱法すると予測不可能な挙動を示す

```hs
module Main where

import Prelude (Unit, pure, unit, ($))

import Effect (Effect)
import Effect.Console (log, logShow)
import Effect.Random (random)
import Effect.Unsafe (unsafePerformEffect)

sayHello :: Unit
sayHello = unsafePerformEffect $ log "Hello, world!"

sayLuckyNumber :: Unit
sayLuckyNumber = unsafePerformEffect $ logShow r

sayHello2 :: Unit
sayHello2 = unsafePerformEffect $ log "Hello, world! 2"

r :: Number
r = unsafePerformEffect random

main :: Effect Unit
main = pure unit
```

実行結果例

```
Hello, world! 2
Hello, world!
0.8295374173787979
```

コードから実行順序を予測できません。

というのも、処理の"流れ"を決めるのはMonadの仕事と言えます。

# `main`はエントリーポイント

コードは定義の集まり。`main`がデフォルトのエントリーポイントで、最後に`unsafePerformEffect main`が1度だけ実行されることになっています。

したがって、学習目的以外で`unsafePerformEffect`を使う必要はなさそうです。

```hs
module Main where

import Prelude (Unit, bind, discard)

import Effect (Effect)
import Effect.Console (log, logShow)
import Effect.Random (random)

-- main :: forall a. Effect a
main :: Effect Unit
main = do
  log "Hello, world!"
  r <- random
  logShow r
  log "Hello, world! 2"

-- 暗黙のunsafePerformEffect main
```

先ほどとは異なり、コードが実行順序を主張しています。
(`bind`に書き直すと明確。)

# `Effect`がMonadなので……

複数の`Effect`が担う処理を`main`一つにまとめることができます。
まとめかたが処理の"流れ"を決めます。

- Applicativeスタイルは並列処理**的**。
  - ただし、普通に実装してもJavaScriptの都合でコンカレント。
  - WebWorkerを使うライブラリかFFIでパラレルも実現可能……？
- Monadスタイル(do記法)は逐次処理。
- Monadは表現力が高い。Applicativeは抽象度が高い。
【iOS】System Fontの和文（日本語）について

# はじめに
iOSの標準フォントはSystem Fontで、具体的にはSF（San Francisco）である。サイズによって、SF Pro TextとSF Pro Displayが置き換わり、またトラッキングの値も変わる。この辺は、さすがApple、細かいこだわりを感じる。
詳細は[Human Interface GuidelinesのTypography](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/typography/)に記載されているのだけど、それは欧文についてだけだ。SF Fontには、当然ながら和文はない。では、XcodeでSystem Fontを設定した場合の和文フォントの正体は何なのか。iOSの日本語標準フォントはヒラギノ角ゴ ProNということは知っているが、よく見るとSystem Fontを選んだときの欧文はヒラギノには見えないし、Xcodeで選べるSystem Fontのウェイトは9種類（Ultra Light、Thin、Light、Regular、Medium、Semibold、Bold、Heavy、Black）であるのに対し、ヒラギノ角ゴ ProNには2種類（W3とW6）しかない。釈然としないので、検証して確認することにした。

#検証
##方法
- XcodeのStoryboardでLabelを配置する。
- フォントはSystem Fontを選ぶ。
- ポイント数は17pt
- それをウェイトの種類だけ配置する。
- Simulaterで実行し、スクリーンショットを撮る。
- スクリーンショットをIllustratorに貼り付け、フォントを重ね合わせて検証。

#結果（System Font 17ptの場合）


![System-Fonts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37598/63e2a5ae-9f20-c041-3af1-815db99e2618.png)

||和文|||欧文|||
|---|---|---|---|---|---|---|
||フォント名|ポイント数|トラッキング|フォント名|ポイント数|トラッキング|
|Ultra Light|**ヒラギノ角ゴ ProN W3**|**16**|-24|**SF Pro Text Light**|17|-24|
|Thin|**ヒラギノ角ゴ ProN W3**|**16**|-24|**SF Pro Text Light**|17|-24|
|Light|**ヒラギノ角ゴ ProN W3**|**16**|-24|SF Pro Text Light|17|-24|
|Regular|**ヒラギノ角ゴ ProN W3**|**16**|-24|SF Pro Text Regular|17|-24|
|Medium|**ヒラギノ角ゴ ProN W6**|**16**|**-14**|SF Pro Text Medium|17|-24|
|Semibold|**ヒラギノ角ゴ ProN W6**|**16**|**-14**|SF Pro Text Semibold|17|-24|
|Bold|**ヒラギノ角ゴ ProN W6**|**16**|**-14**|SF Pro Text Bold|17|-24|
|Heavy|**ヒラギノ角ゴ ProN W6**|**16**|**-14**|SF Pro Text Heavy|17|-24|
|Black|**ヒラギノ角ゴ ProN W6**|**16**|**-14**|**SF Pro Text Heavy**|17|-24|

####欧文について
ほぼ[HIG（Human Interface Guidelines）](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/typography/)の記載通り。System Fontは17ptの場合、SF Pro **Text**（20pt以上はSF Pro **Display**）が使用され、トラッキングは**-24pt**。System FontとSFのウェイトの対応関係にについてはHIGで触れられていないが、System FontにあってSFにないウェイトについては置き換えられている（欧文のフォント名カラムの太字箇所、Ultra Light／Thin／Black）。

####和文（日本語）について
やはりヒラギノ角ゴ ProNが使用されている。
#####フォント
前述の通り、ヒラギノ角ゴ ProNには2種類しかないので、System Fontも実質的には2種類。
#####サイズ
System Font 17ptの設定に対して**16pt**。**欧文より1pt下げたサイズになっている**。
※17pt以外では、1ptの差でない可能性はある。
#####トラッキング
ヒラギノ角ゴ ProN **W3**については欧文と同じだが、ヒラギノ角ゴ ProN **W6**は10ptほどトラッキング緩められている（Illustorator上で目分量で重ねているので多少違うかもしれません）。

何か誤解があったら、ご指摘お願いします。
もしくは、**いちいちそんなことしなくてもココに情報あるとか知っていたら、是非教えてください**。

#その他
グラフィック出身なので、日本語フォントよりも和文フォントというほうがしっくりくる。
Xcode, System Fontの実体がSFなのに、CustomでSFを選ぼうとすると存在しないの何故だろう。フォントファイル追加すれば選べるけど。
[cocoa][swift]iOSアプリケーション開発入門:はじめの一歩

# 開発環境
<ul>
<li>mac</li>
<li>iOS機器</li>
</ul>

# Apple Developer Program
<ul>
<li>https://developer.apple.com/jp/programs/
	<ul>
	<li>無料でも開発できますが、有料の登録をお勧めします。</li>
	</ul>
</li>
</ul>

# 参考資料
<ul>
<li>無料の"ブック"アプリのSwift Programming Series
	<ul>
	<li><a href="https://itunes.apple.com/us/book/the-swift-programming-language-swift-4-2/id881256329?mt=11">The Swift Programming Language (Apple Books)</a></li>
	</ul>
</li>
<li>日本語ドキュメント
	<ul>
	<li>https://developer.apple.com/jp/documentation/</li>
	</ul>
</li>
<li>App Programming Guide for iOS
	<ul>
	<li>https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html</li>
	</ul>
</li>
</ul>

# はじめてのアプリケーション
<p>Xcodeを起動し、File / New / Project... を選択する。</p>

<img width="271" alt="NewProject.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/b4d0ae1c-d803-436e-d023-0eec93eddbbe.png">

<p>iOS / Single View App を選択する。</p>

<img width="197" alt="SingleViewApp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/ab113863-ad81-5ae2-3331-97dbc12989f5.png">

<p>サンプルでは、Product Nameを「HelloWorld」としました。</p>

<img width="311" alt="ProductName.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/aee6d82c-c86d-3941-4706-3e429a73dd93.png">

<p>ストーリーボードでビューの背景色を設定します。</p>

<img width="348" alt="BGColor.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/98be1991-9dbf-fcf8-f975-b50de0a6ca5e.png">

<p>「Run」ボタンをクリック(または「Product」>「Run」を実行)して、シミュレータを起動します。</p>

<img width="320" alt="sim.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/edc9d49b-6605-595d-9057-5e1c9f2c46a7.png">

<p>設定した背景色で起動します。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/ios/HelloWorld">https://github.com/murakami/workbook/tree/master/ios/HelloWorld</a> - GitHub<br />

【関連情報】
<a href="https://cocoa-kanto.connpass.com/event/124467/">Cocoa.swift 2019-04</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="https://mosa.connpass.com/">MOSA</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
Ankoのsnackbarを使おうとしてハマったところ

Androidアプリ開発でもう少し簡潔に書けないかなーと探していたら[Anko](https://github.com/Kotlin/anko)というのを知って色々試しててsnackbar使おうとしたらハマった話です.

# 結論
anko-designなるものが必要でした.

```gradle

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'

    implementation "org.jetbrains.anko:anko:$anko_version" //←これだけじゃ足りない
    implementation "org.jetbrains.anko:anko-design:$anko_version" //←これも必要
    
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
```

# What's Anko?
JetBrainsが手掛けてるAndroidアプリケーションの開発を迅速かつ容易にするKotlin純正ライブラリで, コードを簡潔に保ち可読性を上げられるとのこと.
Ankoは4つのパートに分かれています.

- Anko-Commons
- Anko-Layouts
- Anko-SQLite
- Anko-Coroutines

[公式](https://github.com/Kotlin/anko/blob/master/README.md#anko-commons)を見る限り, snackbarは**Anko-Commons**に入っている...ように見えます.

# What's Anko Commons?
IntentとかDialogとかLoggingのヘルパー関数が色々入ってるツールボックスみたいなものです.
snackbarだと

```kotlin:snackbar

view.snackbar("I love Kotlin!")
```
こう書けます.
シンプルでいいですね.

# なんでハマったの？
結論としてはWikiをちゃんと見てなかったからです.
READMEにはこう書いてあります.

> Anko has a meta-dependency which plugs in all available features (including Commons, Layouts, SQLite) into your project at once.

この**meta-dependency**に該当する記述がこれ

```gradle

implementation "org.jetbrains.anko:anko:$anko_version"
```

「これを入れれば全部の機能が使えるんだなー」と思ったんですが, **snackbarが使えない**.
~~全部じゃないじゃんと思いながら~~再度くまなく見て回ると, [Wiki](https://github.com/Kotlin/anko/wiki/Anko-Commons-–-Dialogs)に以下の記述が.

```gradle

compile "org.jetbrains.anko:anko-design:$anko_version" // For SnackBars
```

snackbarを使うときはanko-designも追加で必要.
compileをimplementationに変えて、gradleに入れたら無事snackbarできました.
“View Controller“ is unreachable because it has no entry points, and no identifier for runtime access…の警告は Is Initial View Controllerがないせいかも？

## 書いた理由
`“View Controller“ is unreachable because it has no entry points, and no identifier for runtime access`でググっても、後述の解決方法しか出てこなかったため
## 警告文
```
“NavigationController“ is unreachable because it has no entry points, and no identifier for runtime access
```

`View Controller` の部分には`NavigationController`が入ったり`View Controller`だったり
それぞれの開発環境によって変わります。

※以下、ViewController = VC

## 検索すると出てくる解決方法
以下の方法でも思惑と合致していれば良いのですが、求めている解決方法は違うかもしれません。

- 使用していないViewControllerは削除する
- Storyboard ID をつける

**使用していないViewControllerは削除する**
→使用するViewControllerだから作ったのでは？

**Storyboard ID をつける**
→ IDを使うならいいんですが、そうじゃないんならただのその場しのぎになってしまう…

## もしかして
Is Initial View Controllerは設定していますか？
Is Initial View Controllerとは、そのStoryboard内で最初に表示するVCのことです

<img width="790" alt="スクリーンショット 2019-04-21 21.58.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/2eeb3360-f1b0-a878-3a77-ebfa1057a678.png">

表題の警告文は、
Is Initial View Controllerに設定されているわけでもなく、
StoryboardIDも設定していない場合に表示されるものですね。

もし、対象のViewControllerがそのStoryboardで最初に表示されてほしいVCであれば、
Is Initial View Controllerを設定することで解決します。

最初に表示したVCではない場合は、他のVCからSegueを繋ぐか、Storyboard ID を設定しましょう！

## 設定方法
Attributes Inspector に Is Initial View Controllerという項目がありますので、チェックボックスをチェックしましょう
以上です。

<img width="790" alt="スクリーンショット 2019-04-21 22.01.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/69379805-dd29-7722-6b1e-23c4b658d219.png">

## おまけ
NavigationControllerを後から追加するときは、VCを選択して右下のEmbed in ボタンから簡単に追加することができます。
<img width="751" alt="スクリーンショット 2019-04-21 9.47.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/2b474d55-9464-50a0-441b-93da31d2fad9.png">

自動でNCとVCが繋がるので便利ですね。

このボタンはStack Viewにまとめたり、割と便利なので積極的に使っていきましょう！

## 参考リンク
https://qiita.com/minami_11/items/bed10d348f6b7828149d
【Python】35歳＋営業職＋プログラミング経験なしのPython学習方法（プログラミング経験なし向け）

# 結論（学習によって気づいたこと）

- Pythonの***構文を理解する***こと
- ***検索スキル***が大事
- インプットの***バリエーションを複数***作る
- ***あったらいいな***を目標にして手を動かす

## 自分の環境

35歳の営業職で結婚している。子供いる、地方暮らし。
ここまでで、感の鋭い方ならわかるかもしれないが、この環境だとぜんぜん***自分の時間が取れない***。

何を言いたいかというと***効率的に学習***しなければならないということだ。
もし、同じような環境の方がいれば参考になればと思う。

ちなみに、Pythonの学習を初めて現時点で3週間くらい。
2週間くらいでこんなことができるようになっていた。↓

[【Python】35歳＋営業職＋プログラミング経験なしが2週間でPythonを使って営業日報を効率化した話](https://qiita.com/1-row/items/9306f638b1f1ad426956)

## 使用した教材

- [Progate](https://prog-8.com/)　▶スライド（インプット・アウトプット）

1ヶ月だけ有料会員となる。Python、Command Lineの学習コースを完了した。一週間ほどで完了はしてしまった。一番始めのとりかかりとしてはわかりやすくオススメ。Pythonを動かす環境を作らずに、ブラウザ上でアウトプットできるのが最高。スマホアプリもあるのでスキマ時間にも手軽に学習できる。ポイントはここですべて理解できるわけではないということ。正直、”クラス”の概念は今もまったくわからない。

- [Python3入門編](https://paiza.jp/works/python3/primer)　▶動画（インプット・アウトプット）

Progateの復習として動画を見ていた。キャラクターがPythonの基本的な内容をテンポよく教えてくれる。演習がついていてブラウザ上でアウトプットできるようになっている。

- [乙py式５時間で学ぶプログラミング基礎(python編)](https://www.youtube.com/playlist?list=PLkLiqjLUSj2ARmOIDk-eetfMx4HdahyMA)　▶動画（インプット）

Progateの復習として動画を見ていた。これもPythonの基本的な内容を短い動画でわかりやすく伝えてくれている。

- [独学プログラマー Python言語の基本から仕事のやり方まで](https://www.amazon.co.jp/独学プログラマー-Python言語の基本から仕事のやり方まで-コーリー・アルソフ/dp/4822292274/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=)　▶本（インプット）

本はこれしか購入していない。Pythonの基本的な内容以外にプログラミングで必要は知識や考え方が書かれている。

- [Qiita](https://qiita.com) ▶技術情報サイト（インプット）

Python、初心者、新人プログラマ応援、個人開発などのタグをフォローし、Pythonの情報に触れ、実際のコードを見たり、自分のやりたいことのイメージやアイデアを考えていた。

自分がここまでで使用してきた教材はこんなものだ。***特に大きなお金もかかっていない。***

特徴的なのはインプットが多いこと。要は自分の環境だとアウトプットできる時間がないのだ。
なので、飽きないようにインプットのバリエーションを増やした。
飽きないこともそうだが、Pythonの基本的な内容をいろいろな教材からインプットすることで、Progateでは理解できなかったことが、他の教材をみることで理解できることがよくあった。

## 教材の利用場面

- Progate

平日、休日の夜に子供が寝てからProgateで学習（Python学習コースを2周）していた。あとはスマホアプリを使って電車通勤中に学習。

- Python3入門編

Progateが終わってから復習で使用。平日・休日の夜、電車通勤中、お風呂での学習。
（お風呂学習には[無印の防水スマホケース](https://www.muji.net/store/cmdty/detail/4548076292784)がオススメ）

- 乙py式５時間で学ぶプログラミング基礎(python編)

Python3入門編と併用。同じ動画ばかりだと飽きてしまうので、交互に見ていた。これも平日・休日の夜、電車通勤中、お風呂での学習。

- 独学プログラマー Python言語の基本から仕事のやり方まで

動画ばかりだと目がつかれたり、飽きたりするので本で学習。営業のちょっとしたスキマ時間にも活用できた。家族の時間もあるので動画を一人で見てるより、本を読んでいる方が抵抗が低いことも良かった。

- Qiita

家から駅までの歩いている時やスマホを見られるタイミングでよく見ていた。コードを読んでどんなことをしているかを意識して学習。

営業だと帰ってくる時間も遅くなるし、家族や子供がいるとなかなか自分の時間を取るのが難しい。自分なりに工夫して世の中にあるツールや教材をうまく活用しながら学習してきた。環境が違えばもっと効率的な学習方法はあると思う。例えば、都市部に住んでいればスクールなんかも有効かもしれない。

## まとめ
結論にも書いたが、まずは***Pythonの構文（書き方）***を理解すること。
理解しないまま進むと、例えば、どれが変数で、どれが関数で、どれがクラスなのかがわからない。わからないとコードを読むことができないし、書くこともできない。

また、わからないことにぶち当たったときに、***一番簡単で頼りになるのが検索***だ。
検索もただ、検索すればいいわけではない。どのように検索すると一番早く解決できるのか、どのように検索すると一番欲しい情報にたどり着けるかが重要。これができないと先に進めなくなり、学習することを諦めてしまう。

あとは、自分にあった学習スタイルを早く確立すること。
Pythonのすべてを理解する前に、自分の作りたいものに向かって手を動かすことだ。

目標がなければ、まずはあったらいいな、自分にとって便利になるようなものを目標に進めるといい。
***実現できたときの喜びは最高だ。これがさらに、学習意欲を生む。***

## 参考サイト

教材では使用していないが、気になっているサイトを記載する。

- [ディープラーニング入門](https://tutorials.chainer.org/ja/)
- [Python Bootcanp-text](https://bootcamp-text.readthedocs.io/textbook/)
- [Django Gilrs Tutorial](https://tutorial.djangogirls.org/ja/python_introduction/)
- [Python入門](https://aidemy.net/courses/3010)
SORACOMのSAM (SORACOM Access Management)をやってみた

開発ユーザと経理ユーザを分けるため
SAMをやってみた

## SAM の設定
１．ソラコムコンソール　https://console.soracom.io/
　　にログイン
２．セキュリティをクリック
![セキュリティ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/d4ebaf74-61d3-69c3-32b9-4138e92f2197.jpeg)

４．ユーザ作成
![ユーザ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/5cb35536-2db8-ee9a-b95b-c0aa04a24b15.jpeg)

５．先程作成したユーザのパスワード作成
![パスワード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/c62354a0-f6ed-bd8a-798c-7dd59c8de5a4.jpeg)
![パスワード2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/5672994d-ea0c-f5af-2881-a302840ae39d.jpeg)

６．先程作成したユーザの権限を設定
全部の権限を付与→全てのAPIを許可→コピー
![権限設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/1266d66e-c304-f24a-c1ef-c51f6dfd5116.jpeg)

７．ログインするURL取得
![URL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/8b3c68f5-0643-4ab7-9456-adff0d4e12bc.jpeg)

以上

##  ソラコムサンタさんへ
この画面をcsvにしてください。
経理系でこの画面に表示している内容をcsv出力すると
楽しいことがたくさんあります。
![一覧.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/e0b24983-d420-d562-f466-6418f24559e4.jpeg)
モジュールの再帰的なリロードを行う 

# モジュールの再帰的なリロードを行う

## TLDL
下記にあるスクリプトをrecursive_reload.pyって名前で保存し

```Python
import recursive_reload;recursive_reload.globals_reload(globals())
```

と実行してくれればいい。

インタプリタ上に読み込み済みのモジュールが再帰的にリロードされる。

## 概要
MayaなどDCCツールにはPythonが組み込んであるが、
通常のPythonの運用と違い、インタプリタはずっと起動し続けており、
ツールの開発時にはreload関数を叩いてモジュールの再読込を行うことが多い。

そのため、複数ファイルに切り分けた中規模以上のツールだと、サブモジュールをリロードを幾度となく繰り返し、
順序よくメインモジュールまでをリロードしないとツールが更新しないこともある。
(大抵は1ファイルの修正なので、「幾度となく繰り返し」は過大かもしれないが)

今まではツールを更新し確認するためだけに、毎回reload(hoge)を打ち込むのが面倒だった。

そんな面倒を解決するスクリプトが以下のものだ。

## スクリプト
```python:recursive_reload.py
# -*- coding: utf-8 -*-
"""再帰的なreloadを行うためのスクリプト

USAGE:
    # モジュール単体を再帰的リロード
    import recursive_reload
    recursive_reload.doit(hoge)

    # インタプリタ内のすべてのモジュールを再帰的リロード
    import recursive_reload
    recursive_reload.globals_reload(globals())
"""
import inspect
import os

# reload済みのmoduleパス
temp_reloaded_module = []

# reloadを考慮していないのか、他に要因があるのか分からないが
# pymelのリロードでエラーがあるので、ProgramFiles以下に存在するモジュールは無視する
ignore_directory = [
    os.environ["PROGRAMFILES"]
]

def doit(module):
    """moduleを再帰的にreloadする

    Args:
        module(types.moduleType):
    """
    global temp_reloaded_module
    # reload済みのmoduleパスのリストをリセット
    temp_reloaded_module = []

    _recursive_reload(module)

def _recursive_reload(module):
    try:
        module_file = inspect.getfile(module)
        # 既に再読込されていれば無視。
        if module_file in temp_reloaded_module:
            return
        # 再読込を行わないディレクトリ以下のmoduleも無視
        if any([module_file.startswith(x) for x in ignore_directory]):
            return

    # built-in moduleは再読込する必要が無いので、無視
    # (built-in moduleはinspect.getfileでTypeErrorを吐く)
    except TypeError:
        return

    temp_reloaded_module.append(module_file)

    # module内で利用しているmoduleを検索し再帰的reloadを行う。
    module_objs = [getattr(module, attribute) for attribute in dir(module)]
    for obj in module_objs:
        if not inspect.ismodule(obj):
            continue

        _recursive_reload(obj)

    try:
        reload(module)
        print("Success: %s" % module.__str__())
    except ImportError:
        # ptvsd などで再読込でエラーが出ることもある
        print("Error:  %s" % module.__str__())


def globals_reload(globals_):
    """渡した辞書内のmoduleを検索し、再帰的なreloadを行う。

    Args:
        globals_(dict): 更新したい辞書を渡す。
    """
    global temp_reloaded_module
    # reload済みmoduleパスのリストをリセット
    temp_reloaded_module = []

    for obj in globals_.values():
        if not inspect.ismodule(obj):
            continue

        _recursive_reload(obj)

```

# あとがき
あとはシェルフに保存するなり、[動的にリロード](https://qiita.com/tag1216/items/486ff0737fcb8cd0b7ac)に組み込むなりすれば、それなりに便利になるはずだ。

なお、MELについては現状で何も考えていない。
頑張ればできる気がするが……正直、様々なエラーに泣かされるビジョンしかない。
読んだ技術本（メモ）

###勉強になった本
1.リーダブルコード　@オライリージャパン
2.プログラムはなぜ動くのか　@日経BP社
3.ネットワークはなぜ繋がるのか @日経BP社
4.ソフトウェアのテスト技法　@日経BP社
5.新・明解C++入門 (明解シリーズ) @ SB Creative

###読んだ本のリスト
ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習 @翔泳社
明解Java 入門編　@ SB Creative
新・明解C++入門 @ SB Creative
ロベールのC++入門講座 @マイナビ
パーフェクトPython　@技術評論社
入門UNIXシェルプログラミング @ SB Creative
GitHub実践入門　@技術評論社
Gitによりバージョン管理　@オウム社
ゼロから始めるデータベース操作　SQL @翔泳社
なれる！SE ２週間でわかる？ＳＥ入門 @電撃文
リーダブルコード　@オライリージャパン
プログラムはなぜ動くのか　@日経BP社
ネットワークはなぜ繋がるのか @日経BP社
システムはなぜダウンするのか　@日経BP社
オブジェクト指向でなぜ作るのか　@日経BP社
新しいLinuxの教科書　@ SB Creative
ソフトウェアのテスト技法　@日経BP社
システム設計の謎を解く　@ SB Creative
プログラマのための文字コード技術入門　@技術評論社
コーディングを支える技術 @技術評論社
僕「参照の && ってなに？」

# 僕「`&&`ってなに？」
僕「C++のコード、`&&`みたいな記号をたまに見かけるけど、これは何なんだろう・・・」
女の子「ああ、それは__右辺値参照__(、ユニバーサル参照)を宣言するときの記号だよ～」
僕「右辺値参照？」
女の子「`&`を使って参照を宣言できることは知ってるじゃん？」
僕「うん」
女の子「それは、__左辺値参照__なの」
女の子「同じように、`&&`を使って宣言された参照型が__右辺値参照__なのだ」

```cpp
int a;
int & b = a;  // 左辺値参照
int && c = 0; // 右辺値参照
```

女の子「そして、__左辺値__は__左辺値参照__を初期化、__右辺値__は__右辺値参照__を初期化することができて」
女の子「これらは一般に参照と呼ばれるの」
女の子「これだけの違いで、実際にこれらの参照を__使うときの意味は同じ__」
僕「なるほど～ところで、__左辺値__、__右辺値__ってなに？」
女の子「それは__式__の種類」
僕「なにがちがうの？」
女の子「うーん、簡単にはいえないな～」

# 値カテゴリ
（僕「ちょっと気になったんだけど、式って言った？値じゃなくて？」）
（女の子「厳密にいえばそう。 左辺値、右辺値は、その名前に反して式の分類なのだよ」）

女の子「たとえば、下の図は式の分類である値カテゴリの全体図（N3337 3.10 図1のコピペ）」

<img width="300" alt="Expression category taxonomy" src="https://qiita-image-store.s3.amazonaws.com/0/195827/ef297722-6655-b000-b574-5fc948b7ecab.jpeg">

女の子「式は`glvalue`、`rvalue`に分類することができて、それらはさらに`lvalue`、`xvalue`、`prvalue`に分類することができるん」
女の子「詳しくは[値カテゴリ - cppreference.com](https://ja.cppreference.com/w/cpp/language/value_category)に書いてあるので、簡単な説明だけするね」
女の子「すごく簡単に言えば、」

- `lvalue`（左辺値）  : 式にアドレスをとれるもの。代表的なのは、変数、関数の名前
- `xvalue`  : 一時オブジェクト、`std::move(x)`など
- `prvalue` : アドレスが取れないもの。代表的には、戻り値の型が参照でない関数呼び出し式など
- `rvalue`（右辺値）  : `prvalue` または `xvalue` のいずれか
- `glvalue` :  `lvalue` または `xvalue` 

女の子「だよ」

僕「ううん・・・オブジェクトの名前とかなら__左辺値__、関数呼び出しみたいなのなら__右辺値__でおｋ？」
女の子「だいたいおｋ」

# ユニバーサル参照（forwarding reference）
～数日後～
僕「なんだか謎味深いコード見つけたんだけど・・・」
女の子「どしたん」
僕「これみて・・・」

```cpp
#include <iostream>
#include <string>

template<typename T>
void print(T&& arg) // <--
{
    std::cout << std::forward<decltype(arg)>(arg) << '\n';
}

int main()
{
    std::string str = "nyan";
    print(str);
}
```

僕「この`&&`、どう見ても右辺値参照なんだけど、普通に動くんだよこのコード・・・」
女の子「あー、この`T&&`は__ユニバーサル参照（forwarding reference）__って呼ばれているものだね～」
女の子「`template`とか、`auto`に`&&`がくっついてるのは、とりあえずなんでも受け取れるのだよ」
僕「まじか・・・」
女の子「そう」

僕「でも、なんで？」
女の子「この挙動の本質っぽいものは、__参照の圧縮__って呼ばれているものなの」
女の子「この場合、`T`は`std::string &`に推論されるけど、この`T`って`&&`くっついてるじゃん？」
僕「うん」
女の子「でも参照の参照って作れないじゃん？」
僕「うん」
女の子「だから、コンパイラさんが気を利かせて、いい感じに推論してくれるんだよ～」
女の子「そんな感じで、`T`は`std::string &`に推論されて、」
女の子「`T&&`もいい感じに`std::string &`になるのだよ」
僕「はえ～」

（女の子「ちなみに、`T&&`で受け取って、`std::forward`でほかの関数の引数にそのまま渡すのは、」）
（女の子「__完全転送__って呼ばれるてるよ～」）

# ちょっと注意
1. ユニバーサル参照（forwarding reference）はなんでも受け取れてしまうので、オーバーロードがこれに解決しがちだよ
2. (完全転送の`std::forward`は、`std::move`と同じように同じものに対して何回もやっちゃダメだよ！)

# 参考リンク
ムーブセマンティクスについて -> [本当は怖くないムーブセマンティクス - yohhoyの日記（別館）](https://yohhoy.hatenablog.jp/entry/2012/12/15/120839)
完全転送について-> [C++のムーブと完全転送を知る - Fixstars Tech Blog /proc/cpuinfo](http://proc-cpuinfo.fixstars.com/2016/03/c-html/)
値カテゴリについて -> [値カテゴリ - cppreference.com](https://ja.cppreference.com/w/cpp/language/value_category)
いろいろ -> [右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス](https://cpprefjp.github.io/lang/cpp11/rvalue_ref_and_move_semantics.html)
プログラミング学習記録64〜インターネット技術〜

##今日やったこと
- インターネット技術の講義を進める

昨日の続きです。

TCPやらIPv6やらDNSやらをひたすら学びました。
理解は浅いです。

IPv4ではアドレスが枯渇してしまう、という理由でIPv6が広まったのは知りませんでした。
それだけインターネットが普及していったということですね。

これからIoTが進み、インターネットに接続されるものがまだまだ増えることが考えるといずれはIPv6でもアドレスが足りなくなってしまうのでは？と思ったんですけど、どんなんでしょう。

明日からも続き頑張ります。

おわり
mrubyでの３０日開発日記（8日目）一週間のまとめたこと（技術面）

#一週間経過してみて

　初めてから一週間経過しました。友達との他愛のない雑談からはじまりましたが、結構自分にとっては実りのある一週間だったと思います。
　といいますのも、今思えば結構冒険的なことをしたのだと思います。理系でもないし、数学も高校１年生の初期で止まっているのを無理やり進めたりして、物語も同時に平行して考えながら、ゲームの基礎を作ろうとしています。その動機も結構他人からみたら「そんな理由？」と言われるほど単純明快な動機でした。おそらく、この単純明快な動機がここまでさせたのだと思います。
　ということで、ここでは一週間かけて技術的に自分の中でなにが変わっったのかをまとめていきます。まだ２２日残っているのまだまだ道半ばですけど

#何をしていたか。

　ここ一週間は時間を見つけては基礎を固めていました。たとえば、空いた時間を使って数学の勉強をしていました。というのも、３Dゲーム自体が数学の固まりみたいなものなので否が応でもやらなきゃならなかったのです。そこは、スキマ時間でコツコツするようにしました。
　夜、大きく時間がとれるのでそこでglfwを試していました。プログラミングは大きく時間を取らないとできないので、これは夜のように長く時間が取れる時にやりました。
　大きく分けてこの２つです。

#技術的になにを手に入れることができたか？

##Ｃのポインタがすこし理解ができた
　Cのポインタが少しだけ理解ができました。これはqiitaで教えてもらった「ヒーロー」という@elct9620さんが作っていたmrubyのゲームライブラリです。このなかで構造体をポインタにしているのをみて、構造体のポインタの動きを学びながら動かしていました。そのおかげで、ポインタがどのように使われているのかが分かり、一歩前進しました！

##ハードの制約を理解することの大切さを知った

　僕自身、あまりC言語のようにハードの制御（とりわけメモリ管理など）といったことはやっておりませんでした。言語は知っていても、いつもはRubyを使っていましたのでそれほどメモリについて考えることがありませんでした。
　しかし、今回するのはゲームということもあり、かならずハードの制限ぎりぎりを攻めながら美しく描写しなければなりません。制約を理解しつつ、最高のパフォーマンスをすることを考えることが大切になります。
　今のパソコンは１０年前までの物比べて断然豊かになりました。メモリもいっぱい積めるし、CPUも格段に速くなっています。ですが、それでもまだ満足できないというのが人間の性というものです。もっといいものを！という果ない欲望のためにハードのことを考えてやらないといけなかったりします。
　これを知ることができたのは大きいです。

#やってみた感想

　一週間やってみましたが、３つも学べたというのは結構なリターンだったと思います。普通のことをやっていてはわからなかったことがわかるようになりました。
　まだ２２日ありますが、それまで飽きずにやってみます。では！

###Ciao!
golangでのfor文で失敗したこと

golangで配列から必要な値を使おうと、forを回して値をポインタで取得したら失敗したので残しておきます。

```golang

var result1 *int64
var result2 *int64
check := []int64{1,2,3,4,5,6}

for _, v := range check {
    if v == 3 {
        result1 = &v
    }
    if v == 4 {
        result2 = &v
    }
}

fmt.Println(result1)
fmt.Println(result2)

```

```
6
6
```

デリファレンスでvのポインタを保持するようにしているため、結果として配列の最後の値になってしまいました。

for文のkeyとvalueは、それぞれループで同じポインタを利用しているみたいです。

```golang

var result1 *int64
var result2 *int64
check := []int64{1,2,3,4,5,6}

for k, v := range check {
    if v == 3 {
        result1 = &check[k]
    }
    if v == 4 {
        result2 = &check[k]
    }
}

fmt.Println(result1)
fmt.Println(result2)

```

```
3
4
```

期待した内容のプログラムも書いてみました。

大丈夫そうです。
Visual Studio 2019の変更点(に関する駄文)：イベントの自動的命名

#この記事、何?
新しいもの好きなのでとりあえず、Visual Studio 2019入れてみた。
で、関数名の名づけ方が変わったみたいなので一言書いてみた。

#結論を一言
押下できるボタンを作って押下時のイベントを作ろうとしたときとかのイベント名がちょっとだけ変わった。

```csharp
//Visual Studio 2017
private void button1_Click(object sender, EventArgs e)

```

```csharp
//Visual Studio 2019
private void Button1_Click(object sender, EventArgs e)

```

・・・イベント名の最初が大文字になった。
もちろん、ボタンの既定名称が大文字始まりになったとかじゃないですよ。。。



#いきさつとか考察とか

以下が駄文。
まあ・・・お暇なら。。。

だいぶ洗練されてきていると思うのでいきなり最新版使ってもいいでしょ、と。

で、Python使ってて便利だと思っていたタプル、(C#でいうと、ValueTuple)がいきなり使えるのがちょっとラッキー♪
これまではNuGetしないといけなかったからひと手間省けた。

あっ、そういえばこんな記事があったね。このおかげかも。

■Visual Studio 2019 になって地味にうれしいこと
https://qiita.com/muniel/items/d4b7e67e53a60fbf8d09

本題(?)の駄文に戻ります。。。

イベントの自動命名、前からちょっとだけ気になってた。
何も考えずに「ふつー」に作ると、こんな感じ。

１．フォーム作ってボタンを置く
 → button1 というボタンができる
２．デザインUI上でクリックイベントをつける
 → Visual Studoが自動的にイベントを作ってくれる

この、２．の時、これまでは、「(コントロール名) + _Click」 とかの名前だった。

で、結果、作った張本人(?)のVisual Studoから、「メソッドの名称は大文字始まりのほうがいいですよ~」って言われる。
で、「いやいや、それ名付けたのあなたでしょ!」と。

そう。その自動でつける名称の先頭を、2019で大文字にしたみたい。
なので、それが「改善」したのかも。

ただ、これ、ちょっともやっとした。

というのも、ちょっと前にこれ書いた時に少しだけ考えたから。

■C#手遊び(フォームメニューを再帰ロジックで作る)
https://qiita.com/siinai/items/d2801021d28f77692cbc

これ、メニュー構成で多数作られた呼び出し元が一つのメソッドを呼び、その中で制御するという形をとったコード。
だから、意図した名前を付けてそれをCallする(させる)。
なので、一般的な命名規約に即した名前を付ける。

その反面、それほど管理しようと思わないメソッドは体系的な名前を付けない。
だから、そういう改善提案が出ても気にしない。
・・・だって、フォーム上にデザインした1個1個のラベルに名付けて回ろうとは思わないでしょ、という感じ。

いや、別に、「改悪」だとは思わないし、「改善」の一つであることは違いないと思うので、文句はないんだけど・・・

Visual Studio 2015のときもそういう仕様だった(気がする)し、そういう判断は済んだうえで、意図的にそうしているんだろうと。
なので、2017から2019で変更されると、「えっ?今?」って感じ。

いや、いいんですけどね。。。
matchMediaを使ってリロードしたら印刷プレビューでもリロードされてしまった話

# 始めに
JavaScriptには`window.matchMedia`というものがあって、これを使うとブレークポイントの設定が簡単にできます。

```js:ブレークポイントの設定
const breakpoint = window.matchMedia('(min-width:769px)');

console.log('isMatch:', breakpoint.matched);

// ブレークポイントが切り替わった時の判定
breakpoint.addListener(() => {
  console.log('breakpoint changed.');
});
```

PC/SP個別の設定は切り替えの度にリセットしてから新しいメディア幅の設定をしないといけないのですが、これを手抜きしてリロードして設定をリセットしていました。ただこの設定をしたときに問題が起きました。

```js:ブレークポイント切り替え時にリロードする
const breakpoint = window.matchMedia('(min-width:769px)');

// PC時の設定
if (breakpoint.matched) {
  ...
} else {  // SP時の設定
  ...
}

// ブレークポイントが切り替わった時の判定
breakpoint.addListener(() => {
  // 本来ならPCで設定したものをリセットしてSPの設定をするといった処理が必要だが、
  // リロードすることで再設定のことを考えなくてよくなる
  window.location.reload();
});
```

# 印刷時にメディアクエリの判定が行われる
Chromeで印刷プレビューがされるときに、ブレークポイントの判定が行われてリロードされてしまいました。PCからSPに変わったと判断されちゃった感じです。他のブラウザはちゃんと検証していませんが、とりあえずリロードはされてませんでした。

# 解決方法
とりあえず印刷中はこのブレークポイント判定をOFFにすることでリロードされるのを防ぐことができました。

```js:印刷時はブレークポイント判定をOFFにする
// ブレークポイントを指定して、切り替わった時にリロードする
const breakpoint = window.matchMedia('(min-width:769px)');
const mediaPrint = window.matchMedia('print');

const onBreakpointChange = () => {
  window.location.reload();
};
breakpoint.addListener(onBreakpointChange);

// 印刷のプレビューでもブレークポイントの判定がされて、Chromeだとリロードされてしまうので
// 印刷中はブレークポイントの切り替え監視をやめる
mediaPrint.addListener(() => {
  if (mediaPrint.matches) {
    breakpoint.removeListener(onBreakpointChange);
  } else {
    breakpoint.addListener(onBreakpointChange);
  }
});
```

# 終わりに
JSの設定を手抜きしていたら思わぬところでバグに遭遇してしまいました。まさか印刷プレビュー画面にも判定されるとは思いもしませんでした（仮にあったとしてもブラウザ側の方に影響が出るとは思いませんでした）。
一応上記の方法で対応できたので、この辺でつまづいている人のお役に立てられたら幸いです。
【grunt】ERR_STREAM_WRITE_AFTER_ENDの対処法【Mac】

# Introduce
gruntをインストールした際に、ERR_STREAM_WRITE_AFTER_ENDが出ました。
行き詰まったので、解決法を書いておきます。
この記事は、Homebrew, node, npmのインストール方法は説明致しません。

# 原因
[こちら](https://github.com/npm/npm/issues/19989)の記事によると、npmのバージョンが高い際にエラーが発生するようです。
npmのバージョンを5.6.0にダウングレードすることでgruntをインストールすることができました。

# はじめに
最初に現在のnpmのバージョンを確認しましょう。

```terminal:terminal
$ npm -v
```
バージョンが5.6.0の場合は、別の問題かと思われます。
また以下のエラーが出た方は、npmのインストールを行なってください。

```terminal:terminal
-bash: grunt: command not found
```

# 解決法
npmを5.6.0にダウングレードします。

```terminal:terminal
$ npm install npm@5.6.0 -g
```
npmのバージョンを確認します。

```terminal:terminal
$ npm -v
5.6.0
```
npmのバージョンが5.6.0であることが確認できたら、gruntをインストールしましょう。

```terminal:terminal
$ npm install -g grunt-cli
```
インストールが終わったら、gruntのバージョンを確認しましょう。

```terminal:terminal
$ grunt --version
grunt-cli v1.3.2
```
バージョンが表示されたらインストール完了です。
私のgruntのバージョンはv1.3.2でしたが、異なるバージョンが表示されても問題ないかと思います。

# 参考にさせていただいたサイト
エラーの解決策　　　[https://github.com/npm/npm/issues/19989](https://github.com/npm/npm/issues/19989)
npmコマンドまとめ　[https://dev.nismit.me/others/npm-command-list](https://dev.nismit.me/others/npm-command-list)
スプレッドシート令和対応の件

すでに既出と思いますがスプレッドの日付で令和は以下のように単純に出します

例えば）D5に日付がある場合

```
="令和"&(YEAR(D5)-2018)&"年"
```

以下のように日付を組み合わせて表示させる場合はこちら

```
="令和"&(YEAR(D5)-2018)&"年"&text(D5, "M月D日")
```


スプレッドシートを置いておきますね
https://docs.google.com/spreadsheets/d/1__O9EZWhKSSlR9o8150u-KRGfJTf1LtbCjzRwJkx2q8/edit?usp=sharing

もっといい方法ありそうなのであったら教えてくださいm（_
_)m
Gitでやらかした話


# はじめに

- これは、４月21日17時にある就活準備中の学生がやらかした話です。

- まーじで、きつい...

  

# 何が起きたか

- １年通して作った作品3Dayが消えました。（自己責任）
- 現在の私の最高の作品でした。
- みなさんは、この話を反面教師にしてください。



## 3Dayとは

- 3Dモデルを主に扱ったecサイト。商品がVRで見れるのが売り。
- Laravelを主に使用。
- 1年通して、作ったので2万行以上の総行数。
![3DayTop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236616/1a4bcc78-105a-fc56-80e9-d69388e0ffb6.png)



## 原因
### **Git reset --hard**



## 何をしたか

- 就活でつかうため、githibにソースコードを載せたく、試行錯誤していました。
- 新規リポジトリ生成
- git add .
- git commit -m "hogehoge"
- git push -u hoge master
- ファイルが重すぎてgithに怒られていたのでgit ignoreで弾くように書きました。
- もう一度プッシュ。=>そりゃ、怒られる。
- コミット消すために、ググりgit reset --hardを見つける。
- **Git reset --hard**×2 <--これが原因
- 一度テストのため、touch txt.txt をaddしてcommitしてpushした。
- できたので、3Dayにプッシュに移る。
- 3dayプッシュ時に4000なんぼのファイルがあったため中断し、ソースを確認。
- なぜか、gitignoreで弾いたもの以外ファイル全てが消滅
- back_upも何もしていなかった愚か者なので、今の自分じゃどうしたらいいか..



## 反省点

- いきなりソースコードをあげるのではなく、バックアップなり作ってからやるべきだった。
- どこで、ソースファイルが消えたのかがわからないので1回１回確認すべきだった。
- テンパって状況整理ができなかったため、深呼吸が必要。
- ちゃんと、機能を理解した上でなんでも使いましょう。





## 今やるべきこと

#### 気持ちの切り替え

- サマーインターン募集に向けての重要な部分である作品がないため、新しい作品を作るしかない。



## 最後に

- かなり、感情的に書いてしまい申し訳ございませんでした。
- 解決したら、記事をあげます。
Rubyの「ブロック」を理解する

Rubyのブロックを雰囲気で使ってる人に向けて、ブロックの使い方を整理する。

## ブロックとはなにか

ブロックは「処理の集合体」です。無名関数とかラムダ式とかクロージャのようなものです。

例：

```ruby
# { ... } がブロック
[1,2,3,4].map { |e| e + 1 }

# do ... endがブロック
[1,2,3,4].map do |e|
  e + 1
end
```

**ブロックは「メソッドに渡す」という形式でしか存在できません**。なので、例えば以下のコードはSyntax Errorになります。

```ruby
a = { |e| e + 1 }
```

当然、以下のコードもSyntax Errorです

```ruby
a = do |e|
  e + 1
end
```

## ブロック付きメソッド呼び出し

メソッドがブロックを受け取る方法を説明します。

### `yield`

１つ目のやりかたは、`yield`を使うことです。

例：

```ruby
def hoge
  yield(100)
end

hoge { |e| e + 1 } # => 101
```

ちょっと分かりづらいですが、`yield`がブロックを「起動」していると思ってください。`yield`の引数がブロックの引数になります。

ちなみに、メソッドには **ブロックとは別に** 引数を渡すことができます。

```ruby
def hoge(a)
  puts a
  yield(100)
end

hoge(1000) { |e| e + 1 } # => 101
# => "1000" が出力される
```

### `&block`

２つ目のやりかたは、`&block`引数を使うことです。

```ruby
def hoge(&block)
  block.call(100)
end

hoge { |e| e + 1 } # => 101
```

このように`&block`という引数を宣言すると、ブロックが`block`変数に代入されます。そして、`block.call`メソッドを呼ぶと、ブロックの処理が実行されます。直感的ですね。

この場合も、ブロックとは別に引数を渡すことができます。

```ruby
def hoge(a, &block)
  block.call(a)
end

hoge(1000) { |e| e + 1 } # => 1001
```

## `Proc` オブジェクト

「さっき『ブロックは変数に代入できない』って言ったじゃん！」と思った人がいると思います。
実は`block`に入っているのはブロックではなく「`Proc`オブジェクト」です。

`Proc`オブジェクトは以下のように生成できます。

```ruby
blk1 = Proc.new { |e| e + 1 }
blk1.call(100) # => 101

blk2 = proc { |e| e + 2 }
blk2.call(100) # => 102
```

`Proc`はオブジェクトなので、変数に代入できます。
つまり、メソッドが`&block`変数でブロックを受けると、上のような処理が走ってブロックをオブジェクトにしているということですね。

## `Proc`からブロックへの変換

`Proc`をブロックとしてメソッドに渡したい気持ちになることがあります。

```ruby
plus_100 = proc { |e| e + 100 }
[1,2,3].map(plus_100) # => Error!
```

しかしこれはエラーになります。なぜなら`plus_100`はProcオブジェクトであってブロックではないからです。

Procオブジェクトをブロックに変換するためには`&`を使います。

```ruby
plus_100 = proc { |e| e + 100 }
[1,2,3].map(&plus_100) # => [101, 102, 103]
```

このように、`&`をProcオブジェクトの前につけることによって、Procオブジェクトを「展開」し、ブロックとしてメソッドに渡すことができます。

## まとめ

- ブロックとは処理の集合体である
- ブロックは「メソッド呼び出しに渡す」という使い方しかできない
- メソッドがブロックを受け取る方法は2つある
  - `yield` 命令
  - `&block` 引数
- ブロックをオブジェクトに変換すると`Proc`になる
  - `block = Proc.new { |e| e + 1 }`
  - `block = proc { |e| e + 1 }`
- `Proc`をブロックに変換するには`&`を使う
  - `array.map(&block)`
numpyで逆行列を計算

#目的・動機
numpyで逆行列を求める手順をメモ。
余因子展開や、掃き出し法でのややこしい手計算は大変なため、PCで計算させたい。

#定義

```math

A=(\begin{matrix}
2 & 3 \\
5 & 1 
\end{matrix})\\


B=(\begin{matrix}
1 & 1 & -1\\
-2 & 0 & 1\\
0 & 2 & 1 
\end{matrix})\\

```

```py
import numpy as np

#行列の作成
A=np.array([[2,3],[5,1]])

B= np.array([[1,1,-1],[-2,0,1],[0,2,1]])

#逆行列の計算
inv_A = np.linalg.inv(A)

inv_B = np.linalg.inv(B)
```

```py
#行列式の中身

print(A)

print(B)

print(inv_A)

print(inv_B)
```


```
#中身
[[2 3]
 [5 1]]
[[ 1  1 -1]
 [-2  0  1]
 [ 0  2  1]]
[[-0.07692308  0.23076923]
 [ 0.38461538 -0.15384615]]
[[-0.5  -0.75  0.25]
 [ 0.5   0.25  0.25]
 [-1.   -0.5   0.5 ]]
```

```py
np.dot(A, inv_A)
```

```
array([[ 1.00000000e+00, -5.55111512e-17],
       [ 0.00000000e+00,  1.00000000e+00]])

```
きれいな単位行列になっていないが、ほぼほぼ単位行列

```py
np.dot(B, inv_B)
```

```
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
```
Rails 投稿機能 view controller route

#投稿機能
基本的な名前とテキストの投稿機能の流れです。ログイン機能なしの超初学者向けです。
CSSのレイアウトはほとんどしていないので、フォームからどういった流れでデータがテーブルに保存され、表示までできるのかを解説しています。
###ビューの作成
まず、フォームを作っていきましょう。今回は、form_tagを使って　名前　文章　を投稿できるようなフォームを作成します。
app/views/作業ディレクトリ　に　new.html.erb　ファイルを作成します。
tweetsとしていますが、ここは現在作成しているアプリに沿って変更してください。
また、route、controller、view　の記述が全てされていないとエラーになりますので、気をつけましょう。

```:new.html.erb
<%= form_tag('/tweets', method: :post) do %>
    <h3>投稿する</h3>
    <input type="text" name="name">
    <textarea cols="30" name="text" rows="10"></textarea>
    <input type="submit" value="送信">
 <% end %>
```

次にルーテイングを追加しましょう。

```:routes.rb
Rails.application.routes.draw do
  get 'tweets/new', to: 'tweets#new'
  post 'tweets', to: 'tweets#create'
end
```
最後にコントローラーに追記します。

```:tweets_controller.rb
class TweetsController < ApplicationController

  def new
  end

  def create
    Tweet.create(name: params[:name],email: params[:email])
  end
end
```
これで、フォームから送信された値が取得できました。
では、ここで簡単に復習しましょう。
まず、フォームの送信ボタンを押すとpostのHTTPメソッドのtweetパスに動きます。

```:new.html.erb
<%= form_tag('/tweets', method: :post) do %>
```

```:routes.rb
post 'tweets', to: 'tweets#create'
```
ルーティングのこの部分ですね。次に送信された内容がparamsに代入されます。

```:new.html.erb
<input type="text" name="name">
<textarea cols="30" name="text" rows="10"></textarea>
```
name="”がキーとなり自動的にparamsで取得できます

```:tweets_controller.rb
def create
    Tweet.create(name: params[:name],email: params[:email])
end
```
ここの部分ですね。ではストロングパラメータについて学習していきましょう。
###HTTPメソッド
HTTPメソッドの種類について詳しく知りたい方はこちらを参考にしてください。
https://railsguides.jp/routing.html
###ストロングパラメーター
指定したキーをもつパラメータのみを受け取るようにするものです。

###privateメソッド
classの内部でprivateとソースコードに書くと、それ以降に定義したメソッドはclassの外部から呼び出せなくなります。
###ストロングパラメータを使って書き換える

```:tweets_controller.rb
class TweetsController < ApplicationController

  def new
  end

  def create
    Tweet.create(tweet_params)
  end

  private
  def tweet_params
    params.permit(:name, :email)
  end
end
```
#まとめ
リクエストは ビュー(view) から始まり、params とは、ビューからコントローラに渡される情報のまとまりです。ストロングパラメータは、params をもとにcreateメソッド に必要な値だけを残した新たなハッシュを形成するメソッドということです。
[メモ]RxSwiftを理解したい


iOS開発において今やimportされていないプロジェクトはほとんどないかと思われるRxSwiftですが、swiftでのiOS開発を初めて3ヶ月ほど経過し、これを理解していないとiOS開発において人権がないことを理解しました。

なので勉強していきたいと思います。

ちなみに僕のRxSwiftに関する理解は

- インターン先のコードで何度か(何度も)見かけたことはある
- インターン先のiOSエンジニアの方に5-10分程度、簡単に解説をしてもらったことがある
- Rxの思想の元になっている関数型言語の経験はない

なので同じ温度感の人がいればぜひ目を通していただけると嬉しいです。
またRxSwift理解している人で、もしこれを読んでいただけたのであればご指摘等あればじゃんじゃん頂けると嬉しいです。

**今回はRxSwiftに関する概念的理解をする投稿とします。実際にサンプルコードとかは余力、モチベがあればPart2として投稿します。**

## Rx(Reactive Extensions)について

> 非同期/イベント/時間に関する処理を、LINQ形式で簡潔かつ宣言的に記述することができるC#のさいきょうライブラリ

思想とか概念というよりかはそもそもライブラリらしいです。
Rx内ではこのイベントをObservableというclassとして扱って処理していく形になっているそうです。

本家：http://reactivex.io/
# RxSwiftについて

登場人物：

- **Observable**
  - 多分、イベントと同じものとして理解していいものだと思われる。RxSwift内では用いたいclassに対して`Observable<User>`みたいにすることでRxSwiftの記述に対応されたclassを定義することができる。
- **Subscribe**
  - イベントを順次読み込んでいくことを表しているもの。なので`subcribe(onNext: )`のようなイベントを次に進ませるような形で書いていく。 
- **Subject**
  - 購読されるもの。`Observable`と`Observer`どちらの性質も持ち合わせている。インスタンスをイベント中に好きなタイミングで発火されることができる。
- **Observer**
  - `Observable`を監視しているもの。Observableの状態が変化することを認識し、`update`として伝達する。
- **DisposeBag**
  - `Observable`でまとまっていた情報を出力する。中の情報が正確に読み取られない(どこかで何かしらの問題が起きている)と出力することはない。
 
あたりは何度も出てくるので何となく理解している必要があります。

## メリット
まだ言語化できるほど理解してないです。

強いていうなら

- Observableを用いて処理を行っている間は外部の値を不用意に変更することが発生しにくいのでテストが書きやすい
- MVVMの設計を採用し、fatViewControllerになることを防ぐことができる

## デメリット

- 学習コスト・実装コストが不用意に高すぎる
- データバインディングがメモリ効率に悪影響を与える

## 特徴

### 時間の概念が存在する
`debounce`というオペレータの存在によってインクリメンタルサーチとかのタイミングで時間の経過を利用したロジックを扱うことができます。

### MVVMを扱うことができる
メリットの部分でも紹介しましたが、MVVM(Model-View-ViewModel)の設計を用いて開発することができます。`RxCocoa`というUIKitをRxSwiftの記述を可能にするライブラリが存在します。
`Model`にはビジネスロジックを。`ViewModel`にはプレゼンテーションロジックを。`View`にはUIを。という分離した考え方で行うことができます。
（ビジネスロジックという言葉は僕は理解しにくいし、抽象的すぎるのではないかと思っています。どちらかというとどうAPIで受け取ったデータに対してアクセスするかみたいなものだと思っています。）


## 参考資料

RxExampleのコードでRxSwiftのvalidationのコードを紹介しているのが実例あって見てみると良さそうです。
https://github.com/ReactiveX/RxSwift

上のサンプルの存在もこの本を読んでいて知りました。この記事を書く上でも参考になっている部分は多いのでちゃんと学びたい場合は購入を勧めます！僕もインターン先のiOSエンジニアの方に勧めていただきました。
https://swift.booth.pm/items/1076262
windows で、jupyter　が import _ssl できなくてエラーになった場合 

壊れている　intel の dll が優先して適用されるためのエラーが起こることがあります。
こちらを参考にしてください。
anaconda ( miniconda ) の dll で、libssl-1_1-x64.dll
を入れ替えます。
参考はこちら、
https://qiita.com/atsonic/items/be5cdc7cf066ae947426
Python3で目覚ましを作る


基本的に自分用のメモとして作成。

引き続きPythonの勉強中。
（前回→[Pythonで月名を表示](https://qiita.com/Rxxx/items/382854052b14c1764b5b)）

旦那に「いい課題ない？」と聞いたら「目覚まし時計とかは？」
と言われたので作った。

<br>
今回目覚まし時計の作成に
・pygame.mixer
・schedule
・time
のモジュールを使用。

<br>

pygame.mixerとscheduleはないのでまずインストール。

これでインストールできた。

```
pip install pygame
```

```
pip install schedule
```

<br>
<br>

以下が作成したコード。

```python:AlarmClock.py
import pygame.mixer
import schedule
import time


#アラーム処理
def Alarm():
	print("時間です")
#	print("\007")  #ビープ音
	Sound()
	exit()   #これがないと無限ループになるので注意
	
#音再生処理
def Sound():
	pygame.mixer.init() #初期化
	pygame.mixer.music.load('alerm1.mp3') #読み込み
	pygame.mixer.music.play(-1) #ループ再生（引数を1にすると1回のみ再生）
	input()
	pygame.mixer.music.stop() #終了
	

#目覚まし設定時間取得
print("目覚ましをセットする時間を指定してください")
hour = input("時間（hour）：")
minute = input("分（minute）：")
target = f"{hour.zfill(2)}:{minute.zfill(2)}"
print(target+"にアラームをセットしました")

#アラーム時間設定
schedule.every().day.at(target).do(Alarm)

#アラーム待ち
while True:
	schedule.run_pending()
	time.sleep(1)
```


<br>

実行するとこんな感じ。
（入力　1回目：19　2回目：12）

```
pygame 1.9.5
Hello from the pygame community. https://www.pygame.org/contribute.html
目覚ましをセットする時間を指定してください
時間（hour）：19
分（minute）：12
19:12にアラームをセットしました
```

この場合19：12になれば「時間です」と表示され、alerm1.mp3が再生される。
何かキー入力すれば音を停止できるようにしてます。

<br>
以下の文章はpygameのモジュールをインポートすると出てくるみたい。

```
pygame 1.9.5
Hello from the pygame community. https://www.pygame.org/contribute.html
```

<br>
<br>
ちなみにコードについてだけど、コメントアウトしてる以下の部分は

```python:
print("\007")
```

ビープ音を鳴らす処理。
MP3再生処理が最初わからなかったので、とりあえずこれを入れてた。
今後もテストとかで使える気がするので、こういうものがあると忘れないようにコメントで残しておく。

<br>
他にもっといいやり方とかあるんだろうけど、今回これしかわからなかった。
あと今回scheduleは指定時間に実行として使ったけど、周期実行や指定曜日に実行とかもできるらしい。
色々使ってみて覚えていきたいね。

<br>
<br>
<br>
最後に雑談だけど、Qiitaって記事投稿したらしばらくは投稿できないんだね。知らなかった。
Laravelコマンド集

# Laravel コマンド

- WWW サーバーを起動

  ```
  php artisan serve
  ```

- プロジェクト作成

  ```
  composer create-project --prefer-dist laravel/laravel {プロジェクト名]
  ```

- コントローラ作成

  ```
  php artisan make:controller {コントローラ名}
  ```

  ```
  php artisan make:controller PostsController --resource
  ```

php artisan route:list

## COMPOSER

- コマンド一覧表示

  ```
  composer list
  ```

- コマンドの使い方、オプション表示

  ```
  composer help コマンド名
  ```

## Model

- Model作成

  ```
  php artisan make:model モデル名(単数形)
  ```

  - option

    - ```
      -m //マイグレーション
      ```

## MiddleWare

- miiddleware作成

 ```
    php artisan make:middleware MyMiddleware
```    
   


  
  

## マイグレーション

- マイグレーション作成

  ```
  php artisan make:migration
  php artisan make:migration create_テーブル名_table//table作成
  ```

- 実行

  ```
    php artisan migrate
  ```

 

- 追加項目用マイグレーションファイルを作成

  ```
  php artisan make:migration add_published_at_to_テーブル名_table —table=テーブル名
  ```

- 最新のマイグレーションをロールバック

  ```
  php artisan migrate:rollback
  ```

## Seed

- Seeder作成

```
   php artisan make:seeder HogeTableSeeder
```

- Seedを実行

  ```
  php artisan db:seed
  ```

- 特定クラスのSeederを実行

  ```
  php artisan db:seed —class=HogeTableSeeder
  ```

- データベースを完全に作り直すとき

  ```
  php artisan migrate:refresh —seed
  ```

## Factory

- Factory作成

  ```
  php artisan make:factory HogeFactory
  ```

## Request

- Requesat生成

- ```
  php artisan make:request HogeRequest
  ```


## Tinker

- Modelのインスタンス作成
- 
```
 $hoge = new Apphoge(modelのパス)
```

- カラムにデータセット

```
  $hoge -> hoge(カラム名)　＝　‘hogehoge’ 

```
- データベースに保存

```
  $hoge -> save()
```
- テーブルの中身一覧

```
  Apphoge::all()->toArray()
```
- id1の列取り出し

```

  Apphoge::find(1)->toArray()
```
## Laravel Collective

- Form

- ```
  composer require "laravelcollective/html":"^5.4.0"
```
標準入力で読み込んだ単語の意味をMac内蔵辞書で調べ、単語帳を作る。

　ターミナルでPyObjCをインストールする（入っていなければ）。

```
$ pip3 install pyobjc
```
```python:wordlist.py
l = [] # 単語リストの作成
word = ""
while word != ".":
  word = input() #標準入力で単語を読みこむ。
  l.append(word)
l.remove(".")
l.sort() # アルファベット順にする。

from DictionaryServices import DCSGetTermRangeInString, DCSCopyTextDefinition
def word_def(word): # Mac内蔵辞書を使って意味を調べる
    try:
        word_range = DCSGetTermRangeInString(None, word, 0)
        return DCSCopyTextDefinition(None, word, word_range)
    except IndexError:
        return 'Not Found'

import csv
f = open('wordlist.csv', 'w', encoding='UTF-8', newline='') # data.csvを新規作成（初期化）
csvwriter = csv.writer(f)
csvwriter.writerow(['word', 'definition'])
f.close()

for i in range(len(l)): # 単語帳の作成
    f = open('wordlist.csv', 'a', encoding='UTF-8', newline='')
    csvwriter = csv.writer(f)
    csvwriter.writerow([l[i],word_def(l[i])]) # 1列目は単語名, 2列目は単語の意味
    f.close()
```
　ターミナルで以下のように実行する。
　標準入力で単語帳へ加えたい単語を1語ずつ入力し、最後に「.」を入力すると単語帳(**wordlist.csv**)が作成される。以下は入力例。単語数によっては時間がかかる。

```
$ python3 wordlist.py
apple
バナナ
herbivore
harsh
plentiful
.
```
　**wordlist.csv**は以下のようになる。
![wordlist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282333/9ad80282-060a-0035-62a2-0e4e7d550492.png)

# 余談
　以前、以下の記事を書き、予想以上の反響をいただいた。複数のPDFを扱う際に有用である。しかし、論文を1本ずつ読む場合には、以下の記事で紹介したコードは無駄が多く、使いにくい。そのため、今回の記事のようなコンパクトなコードも考えてみた。

- 英語論文から単語を抽出&登場回数順にソートし、さらに意味も載った単語帳まで作ってみた。  
https://qiita.com/mkunu/items/9b59e77de964a109e46b
openpyxl.utils.cell モジュール

openpyxl に，openpyxl.utils.cell というモジュールがあって，便利な? 関数が色々定義されている．[説明](https://openpyxl.readthedocs.io/en/stable/_modules/openpyxl/utils/cell.html#column_index_from_string) を読めばわかるものも多いが，一応，実行例を書き留めておく．

```
from openpyxl.utils.cell import get_column_interval, coord....

get_column_interval(1,4) = 
  ['A', 'B', 'C', 'D']
coordinate_from_string('B12') = 
  ('B', 12)
absolute_coordinate('B12') = 
  $B$12
get_column_letter(28) = 
  AB
column_index_from_string('AC') = 
  29
range_boundaries('C5:J20') = 
  (3, 5, 10, 20)
list(rows_from_range('C5:D7'))) = 
  [('C5', 'D5'), ('C6', 'D6'), ('C7', 'D7')]
  Note: This is not a list but a generator
list(cols_from_range('C5:D7'))) = 
  [('C5', 'C6', 'C7'), ('D5', 'D6', 'D7')]
  Note: This is not a list but a generator
coordinate_to_tuple('C8') = 
  (8, 3)
range_to_tuple('wsname!C5:D7') = 
  ('wsname', (3, 5, 4, 7))
quote_sheetname('sheet name') = 
  'sheet name'
```

これは，以下のコードを実行して得られた出力．

```Python
import openpyxl

    print(f'''
from openpyxl.utils.cell import get_column_interval, coord....

get_column_interval(1,4) = 
  {openpyxl.utils.cell.get_column_interval(1,4)}
coordinate_from_string('B12') = 
  {openpyxl.utils.cell.coordinate_from_string('B12')}
absolute_coordinate('B12') = 
  {openpyxl.utils.cell.absolute_coordinate('B12')}
get_column_letter(28) = 
  {openpyxl.utils.cell.get_column_letter(28)}
column_index_from_string('AC') = 
  {openpyxl.utils.cell.column_index_from_string('AC')}
range_boundaries('C5:J20') = 
  {openpyxl.utils.cell.range_boundaries('C5:J20')}
list(rows_from_range('C5:D7'))) = 
  {list(openpyxl.utils.cell.rows_from_range('C5:D7'))}
  Note: This is not a list but a generator
list(cols_from_range('C5:D7'))) = 
  {list(openpyxl.utils.cell.cols_from_range('C5:D7'))}
  Note: This is not a list but a generator
coordinate_to_tuple('C8') = 
  {openpyxl.utils.cell.coordinate_to_tuple('C8')}
range_to_tuple('wsname!C5:D7') = 
  {openpyxl.utils.cell.range_to_tuple('wsname!C5:D7')}
quote_sheetname('sheet name') = 
  {openpyxl.utils.cell.quote_sheetname('sheet name')}
''')
```
RustでIntel MKLを使う

[Intel Math Kernel Library (MKL)](https://software.intel.com/en-us/mkl)は代表的な最適化済みの数学ライブラリで、[Intel Simplified Software License](https://software.intel.com/en-us/license/intel-simplified-software-license)に基づいて再配布が認められています。
これをRustからcrateとして使えるようにしたものが[intel-mkl-src](https://github.com/rust-math/intel-mkl-src)です

https://github.com/rust-math/intel-mkl-src

~~※現在はWindowsは対応していません~~ 0.4.0からwindowsも対応しました

使い方
------
このcrateは`*-src` crateで、MKLをダウンロードしてリンクするだけです。BLASやLAPACK, FFTの機能を使うにはそれぞれ[blas-sys](https://github.com/blas-lapack-rs/blas-sys), [lapack-sys](https://github.com/blas-lapack-rs/lapack-sys), [fftw-sys](https://github.com/rust-math/rust-fftw3/tree/master/fftw-sys)を使います。

```toml
[dependencies]
fftw-sys = { version = "0.4", features = ["intel-mkl"] }
```

このようにそれぞれのcrateでfeatureを使ってバックエンドが切り替えれるようになっているのでその機能を使います。あるいはより高次のライブラリである[ndarray-linalg](https://github.com/termoshtt/ndarray-linalg)を使います。

```toml
[dependencies]
ndarray-linalg = { version = "*", features = ["intel-mkl"] }
```

ndarray-linalg自体の使い方はこちら：

- [Rustで線形代数 (ndarray-linalgの使い方)](https://qiita.com/termoshtt/items/824684a37a2ec15dbfb9)

rust-math
---------
科学技術計算系のcrateのうち、ユーザーが居る気がするものを[rust-math](https://github.com/rust-math)に分けました。intel-mkl-srcのほかに二つ移行してあります。

- [rust-fftw3](https://github.com/rust-math/rust-fftw3): FFTW3 binding for Rust 
- [rust-sfmt](https://github.com/rust-math/rust-sfmt): Rust implementation of  SIMD-oriented Fast Mersenne Twister (SFMT) using stable SIMD

メンテが滞りがちなので、興味のある方は連絡ください。
右クリックで即ペーストのコンソールで改行が入っただばぁ事故を防ぐ[Win][Autohotkey][改変版]

#Windows 10で、とうとうコマンドプロンプトも右クリックで即ペーストになりましたね。

![AHK-paste.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402677/272dd84a-3c36-52c1-e597-feed469ab0da.png)

改行が入った内容がクリップボードに入っていると容赦なくだばぁです。

そこで、[元ネタ](http://harahetta.hatenablog.jp/entry/2015/07/06/235626)からいただいたAHKスクリプトを貼り付けときます。
変えたのは、

- ウィンドウ識別方法
- 対象アプリ
- 改行を含まない場合はそのまま右クリック動作させる

あたり。

[2019/4/22]起きて見直したらあまりにもいけてなかったので修正。
[2019/4/23]それから、マルチモニタ環境での場合、ディスプレイのスケーリングが揃っていないとうまく動作しません。そのうち何とかしたいですが、AHK外部の手も借りないといけなそう。

```
CoordMode, Mouse, Screen


$RButton::
MouseGetPos, x, y, aWin
WinGetClass, aWinClass, ahk_id %aWin%
itsOK := 1

;もしConEmuも対象にするなら次の通り。
;if ((aWinClass == "PuTTY") or (aWinClass == "ConsoleWindowClass") or (aWinClass == "mintty") or (aWinClass == "VirtualConsoleClass"))
if ((aWinClass == "PuTTY") or (aWinClass == "ConsoleWindowClass") or (aWinClass == "mintty"))
{
    StringLen, length, clipboard 
    if(0 < length and RegExMatch(clipboard, "\n"))
    {
        StringReplace clipboardContent, clipboard, `r, ↵, All
        MsgBox, 308, Clipboard confirmation, The clipboard contains multiples lines of text.`nWould you like to continue?`n`n%clipboardContent%
        IfMsgBox, No
        {
            itsOK := 0
        }
    }
}
if (itsOK)
{
    MouseClick, RIGHT, x, y, 1, 0
}

return
```