OmniAICreator/Qiita-1.07M huggingface dataset:
【tutorial】GitHubのリポジトリをローカルにクローン（GitHub Desktop）

GitHub Desktopのインストールは↓の記事。
https://qiita.com/d778980/items/f25ab4f8dab1f340e4a6

2018/4/4に実施。
１．GitHub Desktopを起動。「Clone a repository」をクリック。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/65b50ba7-6094-fe91-0d24-98ed83daf70d.jpeg)

２．Sign inがまだの場合は、↓のポップアップが出るので、「Sign in」をクリック。
　　Sign inが完了している場合は、「５．」へ。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/86de3bab-fa6f-0b7d-a1b7-f90fccfbc3ee.jpeg)

３．GitHubのUsername、Passwordを入力し、「Sign in」をクリック。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/efcfa9a4-677d-70db-8004-5cba03fb9738.jpeg)

４．ポップアップが閉じて、↓の画面に戻るので、もう一度「Clone a repository」をクリック。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/65b50ba7-6094-fe91-0d24-98ed83daf70d.jpeg)

５．クローンしたいリポジトリを選択して、「Clone」をクリック。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/b9cea7ef-ce79-4b62-6b81-b0f53de10499.jpeg)

終わり。

クローンしたリポジトリにファイルを追加してコミット→プッシュする方法は次の記事。https://qiita.com/d778980/items/08b20f3890caa79f1f37
Cognos Analytics でダンプ・コアファイルの出力先変更

#概要
Cognos Analyticsは、組み込みのWebSphere Libertyのみで動作して、基本的にカスタマイズは認められていません。
しかしながら、ダンプの出力先は、以下の手順で変更可能という情報を得ましたので、自分へのメモ替わりに投稿しておきます。

#手順
各javaプロセスごとに、1,2,3の手順にてJavaに-Xdump:[agent]:file=[path]引数 
を追加して、Cognosを再起動してください。 
 
-Xdumpに指定する各[agent]につきましては、下記Javaのマニュアル参照。 
 
-Xdump:[agent]:file=[path] 
https://www.ibm.com/support/knowledgecenter/ja/SSYKE2_8.0.0/com.ibm.java.win.80.doc/diag/tools/dumpagents_agents.html 
 
##1.　cognosserver プロセス
 1. \<Cognos Analytics>/bin64/bootstrap_wlp_linuxi38664.xml をエディタで開く。 
 2. \<start>エレメントの中の下記を書きかえる。 

```html
 <param condName="${java_vendor}" condValue="IBM">-Xdump:heap+system:none</param> 
```
 
##2.　CGSServer プロセス
 1. \<Cognos Analytics>/bin64/cgsServer.sh をエディタで開く。 
 2. 以下の行の-Xmx1gの後に-Xdump:[agent]:file=[path]　を追加。

```html
 $JAVA_CMD $JAVA_OPTS -Djava.awt.headless=true -Xmx1g $USE_NON_ASYNC -classpath $CLASS_PATH com.ibm.cgsBus.CGSServer $ARG_1 $2 $3 $4 $5 $6 $7 $8 $9 
```
 
##3.　DQServer プロセス
 1. [IBM Cognos Analyticsへようこそ]から「管理」＞「管理コンソール」を起動。 
 2. 「設定」タブをクリック。 
 3. 「ディスパッチャとサービス」を選択。 
 4. 右上の「プロパティーの設定」アイコンをクリック。 
 5. 「設定」タブをクリック。 
 6. 最後のページを表示。 
 7. 「Query サービス用の追加の JVM 引数 (QueryService の再始動が必要)」に -Xdump:[agent]:file=[path]　を追加。 
 8. 「OK」をクリック。
【tutorial】GitHub Desktopをインストール

2018/4/4に実施。

１．ダウンロード。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/8915af42-79c4-3d6b-663c-6085fe3b958a.jpeg)

２．ダウンロードしたインストーラを起動。何も考えずに「Skip this step」をクリック。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/bf1c7dd7-b72f-08b9-8659-16ce40c3022b.jpeg)

３．コミット履歴に表示されるName、Emailを入力して、「Continue」をクリック。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/4756503c-d201-77a7-9f99-c813e2f945e1.jpeg)

４．「Yes, submit anonymized usage data」のチェックを外して、「Finish」をクリック。
※GitHub Desktopを改善するために定期的にデータを送信していいですか？というチェックボックス。
　「別に構わないよ。」という方は、チェックを付けたままで。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/ca3374e6-8f2d-b87f-9818-a1b8ee38a804.jpeg)

終わり。
【備忘録】Mac mini が2.4GHz帯のWi-Fiに繋がらない時に試して解決した方法

# 🌟 ポイント 🌟

「そんなバカな🤔」と思われるかもしれませんが、USB機器を取り外したら繋がるようになりました。

---



# はじめに

Mac mini が2.4GHz帯のWi-Fiに接続出来ない事象に遭遇＆解決したため、備忘録として投稿します。

# 問題点

Mac mini が2.4GHz帯のwifiに接続出来ない

- Wi-Fiのアクセスポイントとしては認識されている
- 接続しようとすると失敗する
- アクセスポイント側でWi-Fiの帯域を5GHz帯に変更すると接続できるようになる

# 調査

インターネットで同じ事象が発生してないか調べたところ、USB接続のSSD/HDDを取り外すとWi-Fi接続が安定したとの情報を複数発見。

問題発生時点でMac miniに接続していたUSB機器は以下のとおりでした。

1. USBハブ …ウェブカメラを接続
2. Lightningケーブル …Magic Keyboardを接続
3. USBケーブル …Androidデバイスを接続
4. ロジクールのレシーバー …マウスを接続

# 解決

「そんなバカな🤔」と思いつつも、 **1. USBハブ …ウェブカメラを接続** をMac miniから取り外したところ、2.4GHz帯のWi-Fiに接続できるようになりました。

# 追記（2021/06/07）

本投稿の原因や解決方法について詳しく説明されている記事がTogetterに投稿されてました。

[「これは分からないわ…」Mac miniで2\.4GHz帯のWi\-Fiが全く通信できないので調べてみたら1000円くらいで買った中華製のHDDケースに付いてたUSBケーブルが原因だった \- Togetter](https://togetter.com/li/1725643)
ネットワークPCがみえなくなってる！？

プログラミング知識ではないですが。
知らぬ間にネットワークPCが一部しか表示されなくなった、ということがあったので、備忘としてまとめておきます。

##原因
どうやらWindows10 Creators Updateのせいらしい。。
参考：[Windows 10 Creators Update後にネットワークコンピューターが表示されなくなる問題](https://oflow.me/archives/1953)
~~勝手なことしてくれんなよ。といった感じ。~~

##対応
参考にもあげた手順で「SMB 1.0/CIFS ファイル共有のサポート」をONにしてあげましょう。
ほーらみえた。
SoapCoreを使って同一URLでsoap1.1とsoap1.2リクエストを処理する

# 始めに

ASP.NET CoreにおけるSOAPリクエスト処理ミドルウェアの[SoapCore](https://www.nuget.org/packages/SoapCore/)が、0.9.7よりsoap1.2リクエストの処理が可能になった。
しかし、同一URLでsoap1.1と1.2を受ける場合、そのままでは両方解析ということはできないので、やり方を書いておく。

SoapCore自体の解説は、以前書いた記事 ["ASP.NET CoreでHTTP SOAPリクエストを処理する"](https://qiita.com/skitoy4321/items/32cef39d134a44fb7cf7)を参照のこと。

## やり方

### SoapCoreでSOAP 1.2を処理する方法

`UseSoapEndPoint`の第二引数で、どのような通信方式を使用するか等を指定するので、以下のようにする。

```csharp
// using System.ServiceModel;
// using System.ServiceModel.Channels;
// using SoapCore;

// soap1.1を使いたい場合は、第二引数にBasicHttpBindingをnewすればOK
var transportBinding = new HttpTransportBindingElement();
var textEncodingBinding = new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressing10, Encoding.UTF8);
var customBinding = new CustomBinding(transportBinding, textEncodingBinding);
app.UseSoapEndpoint<T>("/Service.svc", customBinding, SoapSerializer.DataContractSerializer);
```

それぞれ[HttpTransportBinding](https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.channels.httptransportbindingelement?view=netframework-4.7.1)が、通信プロトコルの決定、[TextMessageEncodingBindingElement](https://docs.microsoft.com/ja-jp/dotnet/api/system.servicemodel.channels.textmessageencodingbindingelement?view=netframework-4.7.1)が、メッセージフォーマットの決定となる。そして、この二つを合わせて、[CustomBinding](https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.channels.custombinding?view=netframework-4.7.1)を作る。これ自体はWCFの話になるので、詳しく知りたければ[WCF公式ドキュメント](https://docs.microsoft.com/en-us/dotnet/framework/wcf/index)を参照のこと。

### 問題点

ここで問題は、`TextMessageEncodingBindingElement`が一度に一種類しか設定できないことにある。
よって、素直にUseSoapEndpointを使用した場合は、soap1.1あるいはsoap1.2のどちらかしか受け取れないということになる。

### 解決策

Startup内で以下のようにする。

```csharp
// using Microsoft.AspNetCore.Builder;
// using System.ServiceModel;
// using System.ServiceModel.Channels;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
	app.UseWhen(ctx => ctx.Request.Headers.ContainsKey("SOAPAction"), app2 =>
	{
		app2.UseSoapEndpoint<TestService>("/Service.svc", new BasicHttpBinding(), SoapSerializer.DataContractSerializer);
	});
	app.UseWhen(ctx => !ctx.Request.Headers.ContainsKey("SOAPAction"), app2 =>
	{
		var transportBinding = new HttpTransportBindingElement();
		var textEncodingBinding = new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressing10, System.Text.Encoding.UTF8);
		app2.UseSoapEndpoint<TestService>("/Service.svc", new CustomBinding(transportBinding, textEncodingBinding), SoapSerializer.DataContractSerializer);
	});
}

```

要は`UseWhen(Func<HttpContext, bool>, Action<IApplicationBuilder>)`を使って、分岐すれば良い、という事になる。
判定部分にどのような基準を置くかという事になるが、HTTPヘッダを用いた方法はいくつかある。
**ボディはミドルウェア内部で使用するので触ることはできない**ことに注意。

|判定方法|1.1|1.2|
|-------|---|---|
|`SOAPAction`の有無|有|無|
|`Content-Type`のmedia type|text/xml|application/soap+xml|
|`Content-Type`のaction要素の有無|無|有|

この辺りはクライアントの動作仕様によるところが大きいので、唯一解は無い。

参考リンクは以下

* [SOAP1.1のHTTPヘッダ定義](https://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383526)
* [SOAP1.2のmedia type定義](https://www.ietf.org/rfc/rfc3902.txt)
Puppetterの導入

## 経緯
フロントエンドのデグレ確認をここ1年間、ものすごい時間をかけてやっているので、自動化できるところは自動化しようと踏み切りました。

## Puppeteerとは
Puppeteerとは、Headless mode（GUI無し）のGoogle Chromeを操作するためのライブラリになります。
ほぼ自動化で片付くフロントエンドのテストは十分高速にできます。
あとはスクレイピングのツールとしても非常に便利のようです（スクレイピングはpythonで別途やってるのでPuppeteerを使っていない）。

## インストール方法
インストール方法は、以下のコマンドでインストールできます。

```bash
// パッケージをインストールする場合
$ npm install puppeteer

// パッケージをインストールし、package.jsonに保存する場合
$ npm install --save puppeteer
```
## 動かしてハマった部分
サクっと動くかとjsを書いて、動かしてみるとエラーが出てしまいました。

```bash
// エラーメッセージ
Running as root without --no-sandbox is not supported.
```
「await puppeteer.launch」の部分で、以下のように記述することで解決しました。rootでは、「--no-sandbox」必須のようです。

```javascript
1| // const browser = await puppeteer.launch();
2| const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
```
さくらVPS CentOS7でfirewalldの設定

firewalldについての記録

基本的な役割はiptablesと同じ（というか裏でiptablesが動いている）、iptablesに比べてシンプルで管理しやすい（しかし、リッチルールはiptablesの設定方法と似てる）。

**※他にも違いがあるみたいなので随時更新**

## ◾️ゾーンについての簡易説明

**※ゾーンとは・・・
  パケットフィルタリングのルールをまとめてグループ化したもの。
  デフォルトで存在するゾーンはテンプレみたいなもので独自に増やすことも可能**

|種類|説明|
|---|---|
|public|最低限の受信（デフォルト値）。サービス、ポートを指定しての利用。|
|work|ネットワーク上の信頼できる作業ネットワークで利用する。業務用。サービス、ポートを指定しての利用。|
|home|ネットワーク上の信頼できるホームネットワークで利用する。家庭用。サービス、ポートを指定しての利用。|
|internal|ネットワーク上の信頼出来る内部ネットワークで利用する。ネットとPCの間にfirewallが既に設定されていて、かつworkにもhomeにも入ってない場合。サービス、ポートを指定しての利用。|
|external|IPマスカレードが利用されている時に利用する。ローカルネットワーク内のコンピューターを信頼しない。サービス、ポートを指定しての利用。|
|dmz|DMZの環境で利用する。サービス、ポートを指定しての利用。|
|block|外からの接続は禁止、内から外のみ。外からの接続は応答有り。|
|drop|外からの接続は禁止、内から外のみ。外からの接続は応答無し。|
|trusted|何でも許可する。|

それぞれのzoneで設定を用意しておいて、必要に応じてゾーンを変更するというのが理想。
例えば、httpとhttpsはpublicで、sshとftpはworkに振り分けてIP制限をかけるなど…
ただし、複数のゾーンに対して同一のIPアドレスで制限をかける事はできないっぽい？
試した事は無いので時間がある時にでも検証してみます。


## ◾️firewalldの起動状況確認

`firewall-cmd --state`で状態を確認


## ◾️ゾーンの確認

### ・全てのゾーンを確認

`firewall-cmd --list-all-zone`で全てを確認

### ・特定のゾーンを確認

`firewall-cmd --list-all --zone=ゾーン名`で確認


## ◾️サービスの追加、削除

オプションのpermanentをつけないとrebootした時に設定が消えるので忘れないようにしましょう。

### ・追加

```
$ firewall-cmd --add-service=サービス名 --zone=ゾーン名 --permanent

追加したらrebootする
$ firewall-cmd --reload
```

### ・削除

```
$ firewall-cmd --remove-service=サービス名 --zone=ゾーン名 --permanent

削除したらreboot
$ firewall-cmd --reload
```


## ◾️IP制限のやり方

### 一般的なやり方

ゾーンに対してIP制限をかけるような感じ

```
$ firewall-cmd --permanent --add-source=IPアドレス --zone=ゾーン名
```

複数のIPアドレスを登録したい場合は上記を繰り返すだけで大丈夫

そして追加が完了したらリロード

`firewall-cmd --reload`


### リッチルールで特定のポートを特定のIPアドレスで制限

まず、特定のIPだけを許可するサービスをゾーンから削除します。

```
$ firewall-cmd --permanent --remove-service=サービス名
```

削除後に、許可したいIPとポートをルールで追加します。

```
$ firewall-cmd --permanent --zone=ゾーン名 --add-rich-rule="rule family="ipv4" source address="許可するIPアドレス" port protocol="tcp" port="ポート番号" accept"
```

これで特定のIPのみ許可する事ができるようになりました。



## ◾️参考にしたサイト

- [【CentOS 7】firewalldでとりあえず特定のIPからのみSSHを許可する](http://www.lesstep.jp/step_on_board/centos-7/1226/)
- [ハマる前に理解する「Firewalld」の設定方法、「iptables」との違い (1/4)](http://www.atmarkit.co.jp/ait/articles/1602/18/news019.html)
- [firewalldでIP制限をする](https://maltblade.wordpress.com/2014/12/22/firewalld%E3%81%A7ip%E5%88%B6%E9%99%90%E3%82%92%E3%81%99%E3%82%8B/)
Kotlinのメモ

久しぶりにAndroidのアプリを作ろうと思って、どうせならKotlinってのをやろうと思ったので
いろいろ調べてるときに参考にしたサイトです。

入門に関する話は、いろんなサイトにありますがちょっとこれどうすんのっていう細かいことを
調べようとすると恒例の「何がわからないかわからない」状態で検索するのでなかなか答えに
辿りつかないというパターンに陥ってます。

サイトだけじゃなくて、メモ書きに変更しました。

----

Kotlinでリスナーやコールバックをスッキリと書く【関数リテラルとSAM変換】
https://qiita.com/RyotaMurohoshi/items/01b370f34a4bf96f5c39

Kotlin - Javaとの相互運用
https://qiita.com/k5n/items/ceb1f921b27d62fc9fcb

３０分で覚えるKotlin文法
https://qiita.com/k5n/items/cc0377b75d8537ef8a85

Kotlin : as, !, ? 周りのチートシート
http://increment.hatenablog.com/entry/2015/10/31/090743

英語でKotlinを勉強するためのリソース
https://qiita.com/Horie1024/items/d5e0344c07bb0491955d

----

Kotlin/anko
https://github.com/Kotlin/anko/

インストールする手順

1.build.gradle(Project: Android)に ext.anko_version='0.10.4' (ankoバージョン。この場合0.10.4)を書く
2.build.gradle(Module: app)に implementation "org.jetbrains.anko:anko:$anko_version" を書く

githubのインストールでは compile "org.jetbrains.anko:anko:$anko_version" と書かれてますが、android studioでは以下のような警告がでますので、implementationに置き換えて記載してます。
`WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation'.`
(compileはもう廃止されて、implementationに置き換わってるぞ的なの。)

それからsyncに関する警告(Gradle files have changed since last project sync.A project sync may be necessary for the IDE to work properly.)がでたときは、右にある Sync Nowを押します。

----

Google Play サービスのセットアップ
https://developers.google.com/android/guides/setup

Googleのサービス全般を利用するためには該当するSDKを入れなくてはならないけどどうするの？ってなるので、ここにgradle スクリプトの dependenciesに記載する場合のリストが載っているのでこちらを見ながら設定する。

当然ながら、サンプルは全部JavaなのでKotlinに書き直す必要が出てくるけど、全然慣れてないので、何でエラーが出るんだろう？みたいな感じになる。例えば、

```Java:buildGoogleSignInClient.java
private GoogleSignInClient buildGoogleSignInClient() {
  GoogleSignInOptions signInOptions =
      new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
          .requestScopes(Drive.SCOPE_FILE)
          .build();
  return GoogleSignIn.getClient(this, signInOptions);
}
```
だったら、単純な置き換えで

```kotlin:buildGoogleSignInClient.kt
private fun  buildGoogleSignInClient(): GoogleSignInClient {
    var signInOptions: GoogleSignInOptions  = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestScopes(Drive.SCOPE_FILE)
            .build()

    return GoogleSignIn.getClient(this, signInOptions)
}
```
みたいな感じに書き換えが必要。

----

Context指定

applicationContextでnullエラーが出る場合はそのアクティビティのContextが必要になるので
this@[Activityの名前]にするとnullエラーが出なくなる

----

のちのち更新していく予定です
Java 8のアンインストール方法(Mac)

## はじめに

Java 7をインストールしようとしたのですが、すでにJava 8がインストールされているとできませんでした。
そのため、Java 8をアンインストールすることにします。

## 環境

- OS：macOS High Sierra 10.13.1
- Java：1.8.0_77

## アンインストール方法

ターミナルで以下のコマンドを実行するだけでアンインストールできます。

```bash
$ sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
$ sudo rm -fr /Library/PreferencesPanes/JavaControlPanel.prefPane
$ sudo rm -fr ~/Library/Application\ Support/Java
```

これでJava 7をインストールできるようになります。

## 参考リンク

- [MacでのJavaのアンインストール方法](https://java.com/ja/download/help/mac_uninstall_java.xml)
【備忘録】リンク要素<link>のrel="canonical"を使った重複したURLを統合するときの書き方についてのメモ

rel="canonical"（rel（リレーションシップ）属性の属性値「canonical（カノニカル）」）は、
検索結果ページなど、「（大量の）類似ページが発生」する際にお世話になる事が多いかと思います。
ということで、rel="canonical" リンクタグを使用する場合の
href（ハイパーリファレンス）属性の中身（属性値）の書き方についての備忘録です。

詳細は、Search Console ヘルプをご参照下さい。
><b>重複した URL を統合する</b>
>類似ページや重複ページについて正規ページを設定する
>参考URL：[重複した URL を統合する - Search Console ヘルプ](https://support.google.com/webmasters/answer/139066?hl=ja "重複した URL を統合する - Search Console ヘルプ")


# &lt;link&gt;要素のcanonicalについて
重複ページや類似ページについて、正規のページを指定したいときに使います。
重複ページや類似ページの&lt;head&gt;要素内に下記のようなリンク要素を書くと、
記載したページが別ページ（正規ページ）の重複ページである事を示す事ができます。

* 重複したページにリンク要素の rel="canonical" を使って正規ページの指定を書き込む場合
`<link rel="canonical" href="【正規ページのURL】">`

* 正規ページにモバイル向けのページがあった場合
`<link rel="alternate" media="only screen and (max-width: 640px)"  href="【モバイルの正規ページのURL】">`
 ※ rel="alternate" リンクを追加して、モバイル版の正規ページを指定します。


※詳細は、[Search Console ヘルプ　「rel="canonical" リンクタグを使用する」](https://support.google.com/webmasters/answer/139066?hl=ja#rel-canonical-link-method "rel="canonical" リンクタグを使用する")をご参照下さい。


#rel="canonical" リンク要素に記載するURLは絶対パス
[重複した URL を統合する - Search Console ヘルプ](https://support.google.com/webmasters/answer/139066?hl=ja "重複した URL を統合する - Search Console ヘルプ")曰く、
正規ページのURLを記載する場合は、<b>絶対パス</b>が適切とのこと。
>rel="canonical" リンク要素では、相対パスではなく絶対パスを使用します。
>
>適切な構造: https://www.example.com/dresses/green/greendresss.html
>不適切な構造: /dresses/green/greendress.html

記載の際は、`http://`や`https://`のどちらが正規なのか等も含めて
正規ページのURL指定を間違えないように気をつけたほうが良さそうです。


※と、メモ程度に書いてはみるものの、表現が適切かどうか自信が無いので、
　間違いがあったらコメント等でご指摘を頂けると幸いです。。。
Python > string > alphabet以外をsetとして取得する > 学習対象の中国語だけを抜き出す | 簡体字の入力と音の確認

```txt:動作環境
ideone (Python 3.5)
```

### 処理概要

- 文字列からalphabetを除く
- setとして取得する

中国語の歌をもとに中国語を学習している (小小鹿や寄明月)。
どの種類の簡体字があり、その簡体字はどのように発音するか、ピンインはどうか、を知れば歌詞と音の対応は取れるかもしれない。

（フランス語のようなリエゾンはないとする。ないのかは未消化）

### code v0.1

(Note: 歌詞はライセンス関係で問題になりそうなので、覚えた単語で文章を作った。)

https://ideone.com/J6jUoF

```py
import string

txt = "我是个日本人。我毎天六点半起床。我学习Python。我总在好奇"

wrk = [x for x in txt if not x in string.ascii_lowercase]
wrk = [x for x in wrk if not x in string.ascii_uppercase]
aset = set(wrk)
print(aset)
```

実行結果:
`{'总', '个', '日', '本', '好', '奇', '半', '六', '起', '是', '在', '床', '我', '学', '毎', '。', '习', '点', '人', '天'}
`

> txt = "我是个日本人。我毎天六点半起床。我学习Python。我总在好奇"

意訳「私は一人の日本人です。毎朝6時30分に起きます。Pythonを学習します。好奇心をいっぱい持っています」

後1万時間くらいかけたら大魚海棠をフルに堪能できるだろう。


### 簡体字の入力と音の確認

簡体字の入力はピンインを知らないと難しい。

google翻訳で「英語 -> 中国語」にして、探している中国語に対応する英語を入力することで、簡体字が見つかる場合もある。見つかった簡体字を書換えて、探している簡体字を確認できる。
(例: always -> 总是, 总在 -> Always)


簡体字からは下記のサイトで音を確認できる。
http://zh.hatsuon.info/word/
[http://zh.hatsuon.info/word/好奇](http://zh.hatsuon.info/word/%E5%A5%BD%E5%A5%87)


### code v0.2

大文字小文字のチェックをやめてstring.ascii_lettersに変更。
https://docs.python.jp/3/library/string.html

https://ideone.com/CGydk4

```py
import string
 
txt = "我是个日本人。我毎天六点半起床。我学习Python。我总在好奇"
 
wrk = [x for x in txt if not x in string.ascii_letters]
aset = set(wrk)
print(aset)

```

`{'点', '。', '六', '天', '本', '学', '在', '奇', '好', '习', '起', '床', '总', '日', '我', '毎', '人', '个', '是', '半'}`
[Swift4.1]compactMapがflatMapと同等であることの確認

https://qiita.com/ysn551/items/7cb4fbb67a0640774d2c

compactMapはflatMapのrenamedらしい。一応確認しておく

Swift4.0のflatMap

https://github.com/apple/swift/blob/swift-4.0-branch/stdlib/public/core/FlatMap.swift#L40

```swift

  public func flatMap<ElementOfResult>(
    _ transform: @escaping (Elements.Element) -> ElementOfResult?
  ) -> LazyMapSequence<
    LazyFilterSequence<
      LazyMapSequence<Elements, ElementOfResult?>>,
    ElementOfResult
  > {
    return self.map(transform).filter { $0 != nil }.map { $0! }
  }
```

Swift4.1のcompactMap

https://github.com/apple/swift/blob/swift-4.1-branch/stdlib/public/core/FlatMap.swift#L42

```swift
  public func compactMap<ElementOfResult>(
    _ transform: @escaping (Elements.Element) -> ElementOfResult?
  ) -> LazyMapSequence<
    LazyFilterSequence<
      LazyMapSequence<Elements, ElementOfResult?>>,
    ElementOfResult
  > {
    return self.map(transform).filter { $0 != nil }.map { $0! }
  }
```

Swift4.1のflatMap

https://github.com/apple/swift/blob/swift-4.1-branch/stdlib/public/core/FlatMap.swift#L62

```swift
  @inline(__always)
  @available(swift, deprecated: 4.1, renamed: "compactMap(_:)",
    message: "Please use compactMap(_:) for the case where closure returns an optional value")
  public func flatMap<ElementOfResult>(
    _ transform: @escaping (Elements.Element) -> ElementOfResult?
  ) -> LazyMapSequence<
    LazyFilterSequence<
      LazyMapSequence<Elements, ElementOfResult?>>,
    ElementOfResult
  > {
    return self.compactMap(transform)
  }
```

Swift4.1のcompactMapは4.0のflatMapと同様の処理
`self.map(transform).filter { $0 != nil }.map { $0! }`
をしている。
またSwift4.1のflatMapは内部的にcompactMapを呼んでいる。

よって
flatMap(4.1) == compactMap(4.1) == flatMap(4.0)

@inlineもついているしどれ呼んでもパフォーマンスは変わらないはず
Slack | メッセージ中の絵文字の肌色を変える小技 (デフォルト設定ではなく)

メッセージ入力中に `Command+クリック` で変更可。 (Macアプリの場合)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1d70b3e8-5a42-00d2-a80f-4e917cb00708.png)

ただし人系の絵文字に限る。

# 参考

>米国などで一部の団体やユーザーが主張してきた「絵文字と(人種)多様性の問題」は、絵文字は白人ばかりを含んでいて人種的多様性を反映していない、白人以外には自己を表現する文字を与えないことで、アップルなどの企業はコミュニケーションの場から少数派を不当に排除している、といった内容です。

- [アップル、絵文字に人種と肌の色の違いを導入。iOS 8.3 / OS Xベータから - Engadget 日本版](https://japanese.engadget.com/2015/02/23/ios-8-3-os-x/)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Arduino-ESP32 SPIFFS - ファイルシステム - 

SPIFFS (SPI Flash File System) の使い方についてのメモです。
SPIFFSの機能を使うと、ESP32のフラッシュメモリの一部をストレージとして使うことができます。
EPS32をAPモードで起動して、サーバーを立ち上げるときにhtmlファイルを置きたいので、ファイルシステムを使って格納するために必要でした。

SPIFFS についての説明はこちらが参考になります。必要なことはこちらに書いてあります。
[ht-dekoさんのブログ](https://ht-deko.com/arduino/esp-wroom-32.html#23)


<プログラム内でファイル操作を行う場合は、以下を参照してください>
・[ht-dekoさんのブログ](https://ht-deko.com/arduino/esp-wroom-32.html#23)　サンプルコードがあります。
・[SPIFFSライブラリ](https://github.com/espressif/arduino-esp32/tree/master/libraries/SPIFFS)　SPIFFSクラス詳細
・[FSライブラリ](https://github.com/espressif/arduino-esp32/tree/adf513fc170d11fe3462b04b50ced78352f5575d/libraries/FS)　実際のファイルの書き込み、読み込みはFILEクラスで行います。

<ファイルをESP32に転送する方法>
ESP32 Sketch Data Uploadというツールを使います。
[mgo-tecさんのブログ](https://www.mgo-tec.com/blog-entry-spiffs-uploader-plugin-arduino-esp32.html)に使い方の説明があります。
シェル（ターミナル）でカンタンにプロジェクトルートに戻りたい

シェルを使って開発をしている人のためのTIPSです。

シェルで作業中をしているときに「プロジェクトフォルダのルートディレクトリに戻りたい」となることってありませんか。
そうなる度に、`cd ..`を連打してディレクトリを戻っている人もいるのではないでしょうか。
深い階層のディレクトリだった場合にはとても大変ですよね。 

この問題に対するとっておきの解決策があります。

お使いのシェルの設定ファイル（`.bash_profile`や`.zshrc`など）や`.alias`などに、以下のエイリアスを追加してあげましょう。  

```sh
alias pjroot=`cd $(git rev-parse --show-toplevel)`
```

このaliasを追加をすると、`pjroot`という入力をするだけでプロジェクトルートに戻ることができます。
（ただし、そのプロジェクトフォルダがgitを使って管理されていることが前提になります。）

`git rev-parse`については、以下のQiitaの記事が参考になるかと思います。
https://qiita.com/Alice1017/items/ad061f33c8d42d52e079

---

2018/4/5 更新、このままだとパスが表示されるだけでした...。修正しました、すみません。
C++プロファイリング (linux, valgrind編)

## インストール

### centos

```sudo yum install devtoolset-3-valgrind kdesdk
```

## 計測

```valgrind --tool=callgrind 実行するコマンドライン
```

## 結果

* callgrind.out.NNNNN (NNNNNはプロセスID) というファイルがカレントにできる。


## ビュアー

### Linux (要Window環境)
```kcachegrind callgrind.out.NNNNN
```

### Windows
https://sourceforge.net/projects/qcachegrindwin/

## 参考
* http://valgrind.org/
* https://ja.wikipedia.org/wiki/Valgrind
Dragon Board 410cでopenCV

|`環境`     |       |
|----------|--------------------------|
|**OS**     |**debian 9**         |
|**kernel**|**4.9.34-0-linaro-lt-qcom**     |
|**gcc**  |**6.3.0**               |
|**ros**  |**Lunar**               |
|**python**|**2.7.13**               |


下記の通りROS kineticはDebian 8 のみのサポートなので、今回はLunarを使う。
Setup your computer to accept software from packages.ros.org. ROS Kinetic ONLY supports Jessie (Debian 8) for debian packages.
##ROS install 
###Setup my sources.list
`sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'`
###Set up my keys
`sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116`

**apt-keyでエラーになった場合の対応
gpg: failed to start the dirmngr '/usr/bin/dirmngr': No such file or directory
dirmngrをインストールする。
`sudo apt-get install dirmngr --install-recommends`

**note ROSを再インストールする再は以下のコマンドを実行後に行わないとダメ**
`sudo apt-get remove ros-*
 sudo rm /etc/ros/rosdep/sources.list.d/20-default.list`


###Installation
`sudo apt-get update
sudo apt-get install ros-lunar-desktop
sudo rosdep init
rosdep update`
**rospack listで下記のエラーが出た。**
`rospack list
terminate called after throwing an instance of 'rospack::Exception'
  what():  error parsing manifest of package dynamic_reconfigure at /opt/ros/lunar/share/dynamic_reconfigure/package.xml`
何やら[XMLの書き方](https://github.com/ros/rospack/issues/77)が変わったらしい。
package.xmlを修正してOK。（これ結構面倒くさかった。）

##ROS package install
`sudo apt-get install ros-lunar-cv-bridge
sudo apt-get install ros-lunar-cv-camera
sudo apt-get install ros-lunar-image-transport-plugins`

`mkdir -p catkin_ws/src 
cd catkin_ws/src
catkin_init_workspace
cd ../
catkin_make
cd src/
git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
catkin_make
source ~/catkin-ws/devel/setup.bash`
SPSS Modelerで列名を日本語に変更

# SPSS Modelerで列名を日本語に変更

DBのテーブルの列名は英数字でつくられていることが多いと思います。
ただ、分析では可読性を高めるために日本語に変更したいということもあると思います。
SPSS ModelerではDBインプットノードのフィルターノードでModeler内であつかう列名を変えることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/98cc2cdc-e2bb-adeb-394d-3bab91c94840.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/d9d09ddc-cd71-e14d-3935-47941553a82d.png)

DBで実際に発行されるSQLは、＜元の列名＞ AS ＜変更後の列名＞というようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/eadd4361-6ef8-82cf-fdc3-14231b56646b.png)


### テスト環境
Modeler 18.1.1
Db2 Warehouse on cloud
(mac) Sublimetextのvintageでボタン押しっぱなし移動ができない問題

Sublimetextのvintage(vimモード化)を有効にして、hとかjでカーソル移動できるようにしても、押しっぱなしで移動できない時があった。調べてみると、英字キーボードのMac(自分の環境ではSierra)でキーを押しっぱなしにすると、特殊記号が優先的に表示される仕様とのこと。以下のサイトの解決方法で、ボタン押しっぱなし移動ができるようになる。

```sh:console
$ defaults write com.sublimetext.3 ApplePressAndHoldEnabled -bool false
```

参考：https://gist.github.com/kconragan/2510186

しかし、一旦これで解決しように思えたが、それでも押しっぱなし移動できないことがある。再度調べてみたらどうやらIMEによって、できたりできなかったりするようだ。そして、Google日本語入力の「英字(Google)」にすると問題なく押しっぱなし移動できる。
Proxy環境で GitHub に push する際、毎回ユーザー名とパスワードの入力をしなくて良くなった話

プロキシー環境から GitHub へ push のたびに毎回ユーザー名とパスワードの問い合わせがされて面倒だったけど解決しました。

## 環境

Surface Book 2を入手して新たに環境をセットアップしました

* Windows 10
* Git for Windows 2.17.0.windows.1


## エラー内容

```
Fatal: HttpRequestException encountered.
   この要求の送信中にエラーが発生しました。
Username for 'https://github.com': 
```


## 設定する

```
$ git config --global credential.github.com.httpProxy http://proxy.company.co.jp:8080
```

```
$ git push
Everything up-to-date
```
となり、問い合わせがなくなりました。

# config

```
[credential "github.com"]
        httpProxy = http://proxy.company.co.jp:8080
```

## 参考
* https://github.com/Microsoft/Git-Credential-Manager-for-Windows/blob/master/Docs/Configuration.md#httpproxy
WinActorをこれから使う人へ

# はじめに
すべての作業をRPAで自動化しようとするとたぶん破綻する。ExcelやIEなどのソフトウェア側の設定で可能なことはソフトウェアに任せたほうがいい。文字列の結合をRPAでやるより、Excelの関数を使って予め整形しておいたほうが楽だし、RPAにログインID/PWを入力させるより、ブラウザにキャッシュさせておくほうが楽だ。

操作記録モードだけだと、かゆいところに手が届くシナリオが作れないので、「コマンドプロンプト」実行アクションとNTTATが用意している「ライブラリ」で補完するといい感じなるだろう。

# 環境
WinActor ver4.x（現在の最新版はver5.0）

# 実装した全自動フローチャート
WinActorに関心のある人は、このページを見ることで何ができるのかの大凡をつかめるはず。以下、わたしが実装したフローチャート。

1. WinActorを定時に起動する。
2. 受注データ（Excelファイル）を自動で読み込む。
3. 受注データ（Excelファイル）をWEBアプリケーションに入力する。
4. 顧客にユーザ情報登録完了メールを、ユーザごとに本文の内容を変えてメール送信する。
5. 担当者に作業完了メールを送信する。
6. 登録済の受注データのファイル名に日付を付加して、別のフォルダに保存する。

上記フローチャートの基本的動作はドキュメントをみれば実装できる。以下、わたしがハマった部分についての備忘録だ。

# シナリオの定時実行
たとえば毎日15時にWinActorのあるシナリオを実行することを定時実行とよぶが、WinActor自身に定時実行機能はないので、Windows標準のタスクスケジューラを利用する。WinActorは起動ショートカットごとに読み込むシナリオファイルと読み込むデータファイル（Excelファイルなど）を指定できるので、タスクスケジューラはこの起動ショートカットを実行することになる。

しかし、起動ショートカットに設定した読み込みデータファイル（Excelファイルなど）が存在しない場合、WinActorは起動に失敗する。これは、データファイルの有る無しを条件に、全体シナリオを実行したいときに大きな問題になるが対処法はある。タスクスケジューラから起動ショートカットを直接実行せずに、以下のようなバッチファイルを間に挟む。

```:hoge.bat
if exist 読み込みたいデータのファイルパス start WinActor起動ショートカットのファイルパス
exit
```

タスクスケジューラ→バッチファイル→WinActorの順にすることで「データが無い場合はシナリオを実行しない」ことが可能になる。

また、タスクスケジューラの新規作成ウィザートからWinActorの起動ショートカットを設定するとなぜかWinActorの本体プログラムが登録されてしまうので、わたしの環境では以下のようにバッチファイルからすべての起動ショートカットを実行させている。

```:hoge.bat
start WinActor起動ショートカットのファイルパス
exit
```
# データの整形
WinActorに読み込ませるデータは事前に整形しておいたほうがいい。データの整形とは、2つの文字をくっつけたり、翌年の同日の日付を取得するといった具合だ。
## 「空白セル」と「未入力セル」は別物である
データの整形はWinActorでもできるが、使い慣れてるExcelに任せたほうが万人にとって楽だろう。ただし、Excelで整形したデータをWinActorにインポートするときに大きな壁にぶち当たる。Excelの関数が入力されているセルは見た目には「空白セル」に見えても「未入力セル」にはならないので、そのままだと空白データとしてWinActorに読み込まれてしまう。従って、余計な空白行はすべて削除しなければならない。この作業は、WinActorのExcel操作ライブラリ（最終行を調べるやつと行を指定回数連続で削除するやつ）を使うことで実現できる。
## 条件分岐
そもそもファイルが存在しない場合はデータ整形は不要だ。ファイルの存在有無によってフローチャートを分岐すればいいが、変数に格納した値は大文字と小文字が区別されるので、値が「True」なら、「True」とし「true」としないことだけ気をつける。

# データの読み込み
起動ショートカットを利用した起動時のみ、自動でデータの読み込みができる。

# そのほかのヒント
そのほか「ウェブアプリケーションのログイン」「Basic認証」「IEの設定」「Outlookの強制終了」「ループの分岐」「Excelの設定」「Gmailの設定」「ストレージサービスとの連携」「CSV変換」「PCロック中にシナリオを実行する方法」など WinActor の実際の利用において役立つ情報は[こちら](https://note.mu/break_break/n/nc0677403d829)で御覧ください。
Windowsでメモ帳を管理者権限でhostsを開く方法（コマンド）

地味に面倒で、頻度が高いhostsの修正する際の方法です。


## １．コマンドプロンプトを開く

## ２．黒い画面で下記コマンドを実行

```
notepad c:\windows\System32\drivers\etc\hosts
```

## まとめ

これでいつでもコピペでいけます。
国税庁HPリニューアル後のURLリダイレクタChrome拡張機能の技術的背景

[国税庁のリニューアルで調べ物ができなくて困ったのでChrome拡張機能作ってみた
](https://medium.com/@chisatohasegawa/%E5%9B%BD%E7%A8%8E%E5%BA%81%E3%81%AE%E3%83%AA%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%A2%E3%83%AB%E3%81%A7%E8%AA%BF%E3%81%B9%E7%89%A9%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%A6%E5%9B%B0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7chrome%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-a3a81f6d81e8)という感じで Google Chrome の拡張機能を作ったんですが、その技術的背景についてはこちらに書きたいと思います。

## プロダクト

https://chrome.google.com/webstore/detail/jptax-extension/pbamnjpmpmnnfoofhjiieplchliggecm

## ソースコード

https://github.com/chase0213/ext-jptax

## Keywords

- Chrome Extension
- JavaScript
- 転置インデックス（inverted index）
- TF-IDF

## 開発背景

この拡張機能を作った背景は冒頭のリンクに書いたのですが、どういうものを作りたかったについての背景は書かなかったので、こちらに書きます。

実現したかったことは、まず、ユーザーは Google などの検索エンジンや、記事に貼られたリンクから、国税庁のホームページにアクセスします。すると、国税庁のサーバー側で renewal.htm にリダイレクトするのですが、そのリダイレクト直前のリクエストURL から新しい URL を類推して、そちらへのリンクを表示し、そこから新しいページに飛べるようにしたいと考えました。

実際にその方向で開発を進めていったのですが、度々拡張機能のアイコンをクリックして更にボタンを押下するのが面倒に感じ、結局 renewal.htm を検知したら自動的にブラウザ側でリダイレクト処理をかけるように仕様を変更しました。

しかしながら、僕は国税庁HPの開発者ではないので、リダイレクトルールを全て把握しているわけではありません。そのため、どうしてもリンク先を把握できない URL が存在してしまうと考えました。そこで、簡易的な検索機能（国税庁のサイト内検索は、過去のURLがインデックスされていてこちらも使い物にならない：2018年4月3日現在）も提供することで、リンク先がない場合の利便性もある程度確保しようとしました。

つまり、開発した機能は、

1. renewal.htm を検知したら、直前のリクエストURLから新しいURLへリダイレクトする機能
2. 手動でURLを入力し、リンク先を表示する機能
3. 簡易的な全文検索機能

の3つです。

## Chrome拡張機能の開発について

Chromeの拡張機能を作る上で参考にしたサイトは、ほとんど公式ドキュメントのみです。
https://developer.chrome.com/extensions

おそらく英語のページしか用意されていないと思うのですが、チュートリアルを読み進めていくと公式ドキュメントだけで開発できるように構成されています（そもそもドキュメントとはそうあるべきものだと思いますが）。

僕が余計なことを言うよりも、公式ページを読まれたほうが確実だと思いますので、こちらは割愛します。

## リダイレクトのロジックについて

ITメディアの[こちらの記事](http://www.itmedia.co.jp/news/articles/1804/03/news075.html)にもありますが、旧ページと新ページの URL の間には、一定のルールがあります。そこで、旧ページの URL を正規表現でマッチさせ、新ページの URL に置き換えることで、正しい URL にリダイレクトすることができるのではないか、というのがメインロジックになります。

実装は非常に単純で、ルールを入れても40行程度のコードです。
https://github.com/chase0213/ext-jptax/blob/master/redirector.js

## 全文検索機能について

前述の通り、全てのリダイレクトルールを知ることは僕にはできないため、検索機能を提供することにしました。その際、相手方のサーバーに負荷をかけると、最悪の場合[訴訟されてしまう可能性](https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B%E4%B8%AD%E5%A4%AE%E5%9B%B3%E6%9B%B8%E9%A4%A8%E4%BA%8B%E4%BB%B6)があるため、ゆるーくHPをクロールしてインデックスを作成し、そのスコアを基に検索することにしました。

クロール部分については ruby で書いていますが、公開はしていません。
とりあえず [Nokogiri](https://github.com/sparklemotion/nokogiri) と sleep(n) と [sitemap.xml](https://www.nta.go.jp/sitemap.xml) を使って情報を集めました。
その際、本文をクレンジング（タグの削除、ホワイトスペースや記号の削除）を行い、bigram を使って tokenize しています。その後、token毎に各文書での出現率とコーパス全体での出現率を記録しておき、そこから TF-IDF によってスコアを算出するということをしています（TF-IDF は log をとることが多いですが、スコアをファイルに保存してパッケージに同梱する関係で整数値をとって容量を削減するように調整しています）。

最後に、そこで計算されたスコアを jsファイルとして保存してパッケージ側から読み込んで、ブラウザ内で検索が完結するように実装しています。
ソースコードは突貫工事なのであまり綺麗ではないですが、この辺りです。
https://github.com/chase0213/ext-jptax/blob/master/popup.js#L102-L130

## おわりに

技術的にはどれも大したことはないですが、この規模の拡張機能ならさくっと半日くらいで作れることがわかりました。
この拡張機能に関するバグや脆弱性、リダイレクトルールの追加は、基本的には github で募集中ですので、お気軽に contribute をお待ちしています。
Google sheet API でアクセスインターバルが短すぎると弾かれる？

updateのあと間髪いれず、getすると、弾かれる。

update処理が終わるまでインターバルが必要か。



```python
timeout = 30
socket.setdefaulttimeout(timeout)
```

タイムアウトが短すぎる（5秒など）場合、大量の書込みを行うとき、
時間が足りずに切断して、エラーになる。
Linux標準教科書(Ver.3.0.0)のまとめ ~第1章~

## 基本ソフトウェアと応用ソフトウェア

コンピュータは、大きく分類すると **ハードウェア** と **ソフトウェア** に分かれます。
さらにソフトウェアは、 **基本ソフトウェア** と **応用ソフトウェア** に分かれます。
基本ソフトウェアとは **Operating System (OS)** のことです。 Windows や Mac OS X , Linux のことです。
応用ソフトウェアとは OS の上で動くアプリケーションのことです。 Word や Excel などが例になります。


## 基本ソフトウェアの役割

- 応用ソフトウェアが動作する際に必要な「部品」を提供する
    - 例えば、ウィンドウ、メニュー、ツールバーなど
- ハードウェアという「資源」を管理する
    - 例えば、複数の応用ソフトウェアを同時に使えるよう短いタイミングで処理を切り替えるなど


## Linuxが生まれるまでの歴史

Linuxの元となった **UNIX** が1960年代に米国の通信会社AT&Tのベル研究所で誕生しました。当初はソースコードも一緒に配布していたので、自由な改造が施されました。結果、さまざまなUNIXが作成され、UNIXとしてのまとまりがなくなってしまいました。そこでAT&Tが正式にライセンス契約を始めることになります。

1991年に当時フィンランドの大学生だった **Linus Torvalds** が **Linux** を独自に開発します。UNIX の多くが高額なライセンス使用料を求める中、 Linux はフリーソフトウェアライセンスで配布し、非常に多くのユーザに使われるようになりました。


## Linuxの特徴

基本ソフトウェアは、 **カーネル** と **ユーザランド** に分かれます。

### カーネル

ハードウェアと直接やりとりするなど、OSの中核となる部分。
ハードウェアの違いを吸収し、プログラムをどのようなハードウェア上でも同様に動作させる役割。

### ユーザランド

OSが動作するのに必要な、カーネル以外の部分。
ファイルシステムやファイル操作コマンド、シェルなどの基本的なソフトウェア群のこと。

#### シェル

対話型のコマンド入力環境。
入力されたコマンドを理解し、実行するという役割やシェルスクリプトを実行するという役割を担っています。


## Linuxディストリビューション

当初のLinuxはインストール作業が非常に困難でした。さまざまな団体がLinuxを使う上で必要なプログラムをまとめ、簡単な手順でインストールできるようにしました。
これが **Linuxディストリビューション** のはじまりです。

### パッケージ

従来は、応用ソフトウェアの実行をLinuxで行うには、ソースをダウンロードして自らビルドする必要があります。それをディストリビュータの手によってビルドできるように **パッケージ** が作られました。

### パッケージマネージャ

また応用ソフトウェアには依存ライブラリなどが存在することがあります。それらは正しい場所に正しい順序でインストールしなければなりません。あるいはプログラムを更新するために古いプログラムをきれいに削除する必要もあります。そういった複雑な処理を簡単にしてくれるのが **パッケージマネージャ** です。
C#初心者に向けた検索しにくいTips4選

## はじめに
C#からプログラミングを始めたプログラミング初心者に向けたTips集になります。
コードを眺めている際に、突然出てきても検索しづらいものなどを中心に書きました。
全てのシーンでこの方法を使うことを推奨しているわけではありません。
ただし、知らないよりも知っている方がいい知識です。

## 三項演算子

### A == B と、それ以外で設定する値を分ける

```csharp
string msg;
if(x == 1) {
    msg = "hello";
} else {
    msg = "bye";
}
```

この書き方は冗長な書き方なので、三項演算子を使って以下の書き方で書けます。

```csharp
string msg = x == 1 ? "hello" : "bye";
```

この三項演算子は、`(条件式) ? (Trueの場合の設定値) : (Falseの場合の設定値)`となります。

条件や設定値が複雑でない場合は、この書き方がおすすめです。
逆に条件、設定値が複雑だと見にくくなるので、一度条件や設定値を変数にセットしましょう。

## Null合体演算子
### A がNullの場合は特定の値をセットする
```csharp
string msg;

if(x == null) {
    msg = "bye";
} else {
    msg = x;
}
```

このケースの場合も以下のように書き換えることができます。

```csharp
string msg = x ?? "bye";
```

この三項演算子は、`(設定値) ?? (左記の設定値がNull場合の設定値)`となります。
この書き方はNullなら初期値はこうしたい、などのケースで利用されます。

## 変数の型宣言 var

たとえば以下のケース。

```csharp
string msg = "hello";
List<string> list = new List<string>();
```

型がわかっていれば、変数の型定義は`var`に置き換えられます。

```csharp
var msg = "hello";
var list = new List<string>();
```

右辺の型が明らかな場合は、なるべく`var`を利用することが
最近のトレンドかつ、MSDNでも推奨となっています。
[MSDN](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/inside-a-program/coding-conventions)

ちなみに、`var`は暗黙の型指定です。
宣言時に右辺で型が特定できないといけません。  
以下のような書き方はコンパイルエラーになります。

```csharp
var msg;
var list = null;
```


## ラムダ式
メソッドの引数に`(x => x == 1)` のような引数を見たことがありませんか？
これはラムダ式と呼ばれ、関数を簡易化して書いてあります。

こんな感じです。

```csharp
var dataList = new List<string>() {"a", "b", "c", "d", "e"};
var result = dataList.Any(data => data == "b");
/// result = true
```

上記式は、`dataList`の中に`b`が存在するかをチェックする関数です。
`Any()`の内部がラムダ式になっています。

Anyの引数は関数を引数とすることになっており(型は`Func<T, bool>`)、上記式は省略形になります。
`T`はジェネリクスといい、Listの型がstringのため、stringが引数の型となります。
上記式は以下の書き方と同じです。

```csharp
var dataList = new List<string>() {"a", "b", "c", "d", "e"};
var result = dataList.Any((string data) => { return data == "b"; });
```

これなら関数っぽさが出たのではないでしょうか？
`string data`は引数となっており、リストのデータ1件ずつが渡されます。
そのデータに`b`が存在するかを１件ずつチェックしており、`b`が存在すれば`true`を返却することになっています。

上記式を省略すると` data => data == "b" `となるわけです。

## 最後に
名前を知らないと検索が難しそうなものを選ぼうと思っていましたが、`var`は検索しにくくなかったですね。
プログラミングを始めた頃は自分も使おうとしなかったものを挙げてみました。
ruby で iTerm2 V3 に画像表示する

```ruby
require 'base64'
base64 = Base64.strict_encode64(image)
icon = "\033]1337;File=;inline=1;height=24px;width=24px:" + base64 + "\a\n"
p icon
```

行内に表示すると画像以降の文字がずれる。治したいがまだ解決策なし
Jenkins パラメーター付きビルドのメモ

パラメータ付きビルド

ジョブの実行前にジョブの編集画面から設定している内容をパラメータにします。
パラメータを使うことで、似たようなジョブを複数作る必要がなくなります。
また、ジョブ実行前に都度、ジョブの編集画面から変更を加える手間を軽減させます。

以下に２つの設定手順を記載します。
　　１．メール本文をパラメータに登録し、ジョブの実行時にメール本文を設定します。
　　２．デプロイするモジュールをパラメータに登録し、ジョブの実行時にモジュールを設定します。

◇メール本文のパラメータ化
　ビルドのパラメータ化：　テキスト
　名前：　mailtext
　　適当な名前。ここではmailtextとする。
　デフォルト値：　デフォルトのメール本文
　説明：　パラメータ付きビルドを実行する際に表示される説明文
\--
![mailtext.png](https://qiita-image-store.s3.amazonaws.com/0/90537/a0d67b8d-1424-2efa-1a21-0dbca2dd5fb9.png)

拡張E-mail通知
\--
　デフォルトコンテンツ：　$mailtext
![メール本文.png](https://qiita-image-store.s3.amazonaws.com/0/90537/0453c404-5822-3f20-e918-e6e52926b6bb.png)


◇Powershellの環境変数をパラメータ化
　ビルドのパラメータ化：　文字列
　名前：　modulename
　　適当な名前。ここではmodulenameとする。
　デフォルト値：　デフォルトのモジュール名
　説明：　パラメータ付きビルドを実行する際に表示される説明文
\--
![module_name.png](https://qiita-image-store.s3.amazonaws.com/0/90537/4d0adf8c-74d0-c1e9-bd61-6ac863f1f96b.png)

Windows PowerShell
　Command： $env:modulename
\--
![powershell.png](https://qiita-image-store.s3.amazonaws.com/0/90537/200437ae-8965-2a7a-c139-d662ca9124e2.png)

上記の設定をした際のパラメータ付きビルドの画面は、以下のようになります。（mailtextのイメージのみです）
\--
![build-mailtext.png](https://qiita-image-store.s3.amazonaws.com/0/90537/b73710ae-68db-b30c-33de-1aa825081681.png)
\--
ジョブの実行時にメール本文、モジュール名を指定出来るようになります。
パラメータは、他にもありますが、メモレベルのものなので、ここまでとします。
Mind for Android の簡単な使い方の動画をYoutubeに公開しました

MindでAndroidのアプリ開発を行えるクラウド「Mind for Android」の簡単な使い方の動画をYoutubeに公開しました。
Youtubeサイトで「日本語　Mind」で検索してください。青い背景のプレビュー画面のものです。
sharelatexで日本語執筆

公式の方法だとフォントをuploadしないといけなくてめんどいし、自前のサーバで動かすのもなんかオーバーキル、というときには下記の方法が良さそう。

コンパイルエンジンにluatexを選んで、.texファイルに下記を一行足すだけ。

\usepackage{luatexja}

超簡単。
【FileMaker】条件付き値一覧で選択した項目の別フィールドを取得する

条件付き値一覧、[前回](https://qiita.com/tyuma/items/3f1e51306c9fe3a7e5f7)、[前々回](https://qiita.com/tyuma/items/dd82037d4e382f3d0f57)に引き続き、今回は選択した項目の別フィールドを取得したいというお題をいただきました。

※元々のサンプルを作成したFM13は、私のMacOSバージョンではすでに起動できない。。。ので、FM14で追加しました。

このサンプルでは、メニューのタイプというかカテゴリから、それぞれの項目（品名）を条件付き値一覧で表示する、という内容です。
今回は、選択した項目（品名）の単価を注文データにセットするという拡張になります。

前回、オプションを追加しましたので、ちょっとメニューにオプション内容を追加しています。
オプションが存在しない場合は、「なし」としています。
これは、オプションリストから選択したときに単価を決定したいからです。
<img width="720" alt="スクリーンショット 2018-04-04 10.29.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/41892077-59b1-e9c5-c488-899942be797c.png">
メニューテーブルには、単価フィールドを追加してあります。

注文テーブルにも、メニューから選択した項目（品名）の単価を保存する単価フィールドを追加しました。
このとき、単価を自動的に設定できるように、ルックアップを設定します。
ルックアップを設定するには、オプションまでのリレーションシップを張って確実に注文が決まるようにします。
<img width="686" alt="スクリーンショット 2018-04-04 10.24.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/afa17826-d607-5186-84bd-7d5482aaf504.png">
もし、オプションなしで、項目（品名）までで一意に決まる場合は、メニュー２までで十分です。

このリレーションシップを使い、注文テーブルからメニューテーブルへのルックアップを設定します。
<img width="837" alt="スクリーンショット 2018-04-04 10.24.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/38e6f807-c778-12d3-a2bc-a3a2a9e5fd99.png">

この設定をし、実行してみます。

オプション「なし」と設定したランチのサンドウィッチ。
<img width="436" alt="スクリーンショット 2018-04-04 10.42.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/8c3c5ac0-56c4-f8bf-e002-d3aa50cdf93c.png">

オプションが複数あるディナーのステーキ。今回は和風ソースを選択。
<img width="442" alt="スクリーンショット 2018-04-04 10.42.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/96d13737-d0ec-14c9-abd4-10b72ca50c32.png">


今回の参照フィールドを持ってくる方法として挙げたルックアップの設定は、実装方法のほんの一例です。
他にも、スクリプトトリガを使う方法、別ウィンドウを表示して単価を持ってくる方法、決定ボタンなどボタンにスクリプトを設定する方法など、たくさんあります。

やりたいことに対して、この方法しかない、、、ではなく、いろんな方法があることを実例を通して身につけていくのも幅が広がっていいですよね。

では、FileMakerライフをお楽しみください。
gulpでsvgスプライト用画像を作る

# gulpでsvgスプライト用画像を生成
フロントのデザインリニューアル案件があり、「せっかくだから画像もスプライトで表示したいね」と言う話がありまして。
最近webエンジニアにジョブチェンジした私には何が何やらだったのですが、「svgスプライト使います？」とデザイナーさんから提案があり、調べてみたところ結構便利そうだったので、思い切って導入してみました。
実際は導入コストも低く、思っていた以上に簡単で感動できたのでオススメです。

## svgスプライトとは
複数のsvg画像を1つのファイルにまとめ、そのファイルから特定の画像を切り出して使うことでhttpリクエストを減らし、フロントエンドのパフォーマンスを向上させる方法です。
[CSSスプライト](https://lopan.jp/css-sprites/)も目的は同じです。
CSSスプライトの場合は、「1枚の画像ファイルの中から、目的の画像のある位置」をCSSで指定して表示するのですが、svgスプライトの場合は「画像そのものを指定」するイメージです。

## 嬉しいこと
### httpリクエストが減る
画面内で小さいアイコンなどを複数使う場合、その都度全てのファイルをhttpでリクエストして取得することになるのですが、svgスプライトで画像をひとまとめにしておくとその分リクエストが減り、パフォーマンスが向上します。

### CSSで色を変更することができる
CSSでスタイルを変更することが可能です。
色ごとにアイコンを用意する必要がないのでらくちん。

### 画像サイズの変更が容易
[ベクター画像](https://ja.wikipedia.org/wiki/%E3%83%99%E3%82%AF%E3%82%BF%E5%BD%A2%E5%BC%8F)なので、画像サイズの変更が簡単です。
サイズごとに画像を用意する必要がないのでらくちん。

### 画像が増えても平気
gulpを使ってsvgスプライト用画像を作る場合、svg画像を所定のディレクトリに入れ、コマンドを叩くだけで生成できます。
画像が増えた時にもコマンドを叩き直すだけでいいのでらくちん。

## 実際に作ってみる
gulpを使ってsvgスプライト用の画像を生成します。
使ったのは以下のプラグインです。

- gulp-load-plugins
 - 各gulpのプラグインの読み込みを簡単にしてくれます
 - `gulp-sass`など、`gulp-`で始まるプラグインは`$.sass()`のように、`gulp-`以降のみの記載で呼び出すことができて便利

- gulp-svgmin
 - svg画像を最適化し、ファイルサイズを削減するために使います

- gulp-svgstore
 - 複数のsvg画像を1つにまとめてくれるやつ

- gulp-cheerio
 - svgに記載されている`fill`を削除するために使います
 - 削除しないとCSSで色を変更することができなくなるので要注意
 - `fill`が指定されていない場合は黒で表示されるようなので、万が一色を指定を忘れても安心です

これらのプラグインを

```
npm install gulp-load-plugins
```

などでインストールします。
`package.json`の`devDependencies`に追加したい場合は、`--save-dev`を付けることでインストール時に一緒に追加されます。

インストールが終わったら、`Gulpfile.js`に以下を追加します。
[こちら](https://parashuto.com/rriver/development/easiest-svg-sprite-icon-system)をほぼコピペです。大変助かりました。。。

```Gulpfile.js
gulp.task('svg', function () {
    gulp.src('img/sprite/icons/*.svg')
        .pipe($.svgmin())
        .pipe($.svgstore({ inlineSvg: true }))
        .pipe($.cheerio({
            run: function ($, file) {
                $('[fill]').removeAttr('fill');
            },
            parserOptions: { xmlMode: true }
        }))
        .pipe(gulp.dest('img/sprite'));
});
```

これが準備できたら

```
gulp svg
```

を叩くだけでsvgスプライト用画像が生成されます。
やっていることは、imgディレクトリ配下のsvgファイル全てを対象にして

- svg画像を最適化
- svgスプライト画像の生成
- `fill`を削除
- `img/sprite`ディレクトリへ出力

です。

html側では

```sample.html
<svg role="image">
    <use xlink:href="/img/sprite/icons.svg#image-name" />
</svg>
```

これだけで特定の画像を出力することができます。
ファイル名の後ろに付ける`#image-name`の部分は、元となったsvg画像のファイル名を指定するだけで大丈夫です。
たったこれだけでsvgスプライトを実現できるので、ぜひお試しください。

## 注意点
実はIEではこの方法での画像表示に対応していないようです。
IE向けのポリフィル等も用意されているようなので、どうしても対応が必要な場合は別途導入が必要なのでお気を付けください。

## 参考
- https://parashuto.com/rriver/development/easiest-svg-sprite-icon-system
Exoplayerのコントローラーに全画面表示のアイコンを入れてみよう

ExoPlayerの基本Controllerのレイアウトには全画面を表示するボタンが存在しないため、
実装方法を探してみた。その間、発見したのがこちら！

[How to Add a Fullscreen Toggle Button to ExoPlayer in Android](https://geoffledak.com/blog/2017/09/11/how-to-add-a-fullscreen-toggle-button-to-exoplayer-in-android/)

要はExoplayerに使用する基本viewとcontrollerのレイアウトを自分のアプリレイアウトに入れて継承すること。こうすることでControllerレイアウトに簡単に自分が欲しい機能を入れる事が可能になる。
HTTPプロトコルを体系的に理解するために最初に読むべきサイト

##HTTPプロトコルを理解するために最初に読むべきサイト（英語です）
HTTPのプロトコル理解で最もオススメなのはMDNの解説です。
2ヶ月ほど程様々なHTTPプロトコルのドキュメントを探してみましたが、私が見た中で最も平易に書かれていました。
→[HTTP|MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP) 

JavaScriptが分かるのであればNode.jsでHTTPサーバーを実装しながら学ぶのもよいでしょう。
→[Node.js 最も簡単なチュートリアル](https://www.w3schools.com/nodejs/default.asp)
→[Node.js 公式HTTPドキュメント](https://nodejs.org/dist/latest-v9.x/docs/api/http.html)


##推奨読者
・ライブラリを使いHTTP通信の機能を実装した事はあるが体系的な理解をしたい
・Node.jsを使ってみたがHTTP通信が良くわからなくて困っている
・HTTPサーバーを立ち上げられるようになりたい


###TCPに関して(追記)

HTTPの下のレイヤーのTCPも理解するとHTTPの理解に役立ちます。TCPについても記事を書いたのでのせておきます。[Socketの仕組みが分かり易いサイト](https://qiita.com/engineer-k/items/9c01953a953a8f4ffe67)
Excel Online > セルの値を変更する方法 > 他の空白セルを編集してから該当セルを編集する | Deleteキーなら問題ない

2018年4月4日現在の症状。

特定のセルの値を変更しようとしても変更できない。
F2を押したり、Backspaceキーや、直接入力でもダメだった。

~~共同編集状態になっていたのが関係するのかどうか。~~
共同編集状態は関係ない。

対処方法は以下。

### 方法1 > 他のセル編集後

下記の手順ならできた。

1. 他の空白セルを編集
    - 例: 文字を入力してBackspaceキーで削除
2. 該当セルを編集
    - F2キーやBackspaceキーで編集開始

### 方法2 > Deleteキーを使う

Deleteキーを使う。
セル内のテキストをいったんクリアすることになる。一部の文字列だけの編集には適正ではない。

### BackspaceキーやF2キーは使えない場合がある

BackspaceキーやF2キーが使えない場合がある。
使える場合もある。

条件については不明。
ansible -a (コマンド直接実行)には落とし穴がたくさんあるという話



## 複数コマンドを一発実行する方法

**発端：** `ansible host -a "echo hello && echo world"` ができなかった。

モジュールをデフォルトの `command` から **`shell`** にするとできた

```sh
ansible host -m shell -a 'echo hello && echo world'
```

引数をsshコマンドにまんま渡していると思えばこれでも動く。（sshコマンドも複数コマンド一括でいけない人なんですよね）

```sh
ansible host -a "bash -c 'echo hello && echo world'"
```

^勝手な想像：`command` はsshにまんま渡すだけ。 `shell` はいったんtmpファイルに書き出して、sshで転送＆実行するとか。（いずれのケースもansible変数展開などの処理はされる）

>  
参考 
> [**Ansible: How to execute multiple commands with `ansible -a` - Stack Overflow**](https://stackoverflow.com/questions/49551016/ansible-how-to-execute-multiple-commands-with-ansible-a/49577268#49577268)  

## ダブル波括弧（Double curly braces)を使う方法

**発端：** `docker ps --format {{.Images}}` ができなかった。

理由は一瞬でわかった。ansibleの変数機能のせい。

ansibleの変数は、例えば `/etc/ansible/hosts` にこう書いておくと

```yml
mygroup:
  hosts:
    host1.com:
    host2.com:
  vars:
    myvar: "blah blah" 
```
こうして変数をコマンドから使えるようになる。

```sh
ansible mygroup -a 'echo {{myvar}}'         # blah blah
```

間違いなくこの機能とぶつかってますよね。

### **解決策**

`{%raw%}` と `{%unraw%}` で囲むのが見た目は良さげ。これはめんどい！！

```sh
ansible host -m shell -a 'docker ps --format {%raw%}{{.Images}}{%unraw%}'
```

驚くのは、ansibleの **`{{`** 変数展開がが**シングルクォート内でも効く**こと。**ansibleの `-a` の変数展開はとっっっっても強力！簡単には止められない！** ので、 `{{%raw%}}` が必要らしいです。


>  
参考
 > [**docker - Escaping double curly braces in Ansible - Stack Overflow**](https://stackoverflow.com/questions/32279519/escaping-double-curly-braces-in-ansible)  

# おまけ
## 全サーバのdocker image/コンテナをyamlっぽく取得するシェル芸
```
ansible all -m shell -a ' docker ps --format {%raw%}"\t{{.Names}}:\n\t\t\t\t\t\t{{.Image}}"{%endraw%}' | grep -v "non-zero" | grep -v FAILED | sed -E "s/(.*)\| SUCCESS.*/\1:/"
```
こんな感じで出る。

```yaml
host1.com :
    cont1:
                                                - php:7-apache
    cont2:
                                                - haproxy:latest
```

これをパースしたりしたら幸せなのでは。
何がconstなのかよく忘れるのでメモ

c++のconstの話。
constがくっつく場所で「何がconstなのか」が変わりますが
よく忘れるので情報を整理。

# 変数編
## const int
変数hogeの値がconst。

```c++
const int hoge = 1;
hoge= 2; // NG
```

## const int* , int const*
ポインタ変数hogeが指し示す先の値がconst。
hoge自体の値はconstじゃない。

```c++
int a = 1;
int b = 10;
const int* hoge = &a;

*hoge = 2; // NG
hoge = &b // OK
```

## int* const
ポインタ変数hogeの値がconst。
hogeが指し示す先の値はconstじゃない。

```c++
int a = 1;
int b = 10;
int* const hoge = &a;

*hoge = 2; // OK
hoge = &b // NG
```
## const int* const
ポインタ変数hogeとhogeが指し示す先の値がconst。

```c++
int a = 1;
int b = 10;
const int* const hoge = &a;

*hoge = 2; // NG
hoge = &b // NG
```

## const int& (参照)
参照hogeの値がconst。

```c++
int a = 1;
const int& hoge = a;

hoge = 2; // NG
```
# 関数編
## constメンバ関数
クラスのメンバ関数にconstが付くと、
~~そのメンバ関数はクラスの状態を変更しないという宣言になる。~~
const修飾されたクラス型のインスタンスから呼び出すことができる。

```c++
class Sample {
  public:
    void func1() {};
    void func2() const {}; // constメンバ関数
};

const Sample s;
s.func1(); // NG
s.func2(); // OK
```
CircleCIからCodeClimateにテストカバレッジを送信する

CodeClimate導入してみたけどテストカバレッジが表示されない！なぜ！
とおもったら、ちゃんとそのための手順が必要でした。 :sweat_smile: 

# 流れ
導入したプロジェクトはRuby on Railsだったので、テストカバレッジにはSimpleCovを採用してます。

rspecでSimpleCovが動いてる前提です。

```rb:rails_helper.rb
require 'simplecov'
SimpleCov.start
...
```
詳細は[SimpleCov](https://github.com/colszowka/simplecov)のREADME参照。

1. CircleCIでrspec実行
2. simplecovがcoverageを出力
3. coverageをtest-reporterがCodeClimateにアップロード

`CC_TEST_REPORTER_ID`は
Settings -> Test Coverage -> TEST REPORTER ID
から取得できます。


# コード

CircleCIのconfigをdiffで表示するとこんな感じ。

```diff:.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/ruby:2.5.0-node-browsers
        environment:
+          CC_TEST_REPORTER_ID: 'XXXXXXXXXXXXXXX'
    working_directory: ~/my_project
    steps:
      - checkout

      ...

+      # Download test-reporter
+      - run:
+          name: Setup Code Climate test-reporter
+          command: |
+            curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
+            chmod +x ./cc-test-reporter

      # Run rspec
      - run: |
+          ./cc-test-reporter before-build
          bundle exec rspec
+          ./cc-test-reporter after-build --coverage-input-type simplecov --exit-code $?

      ...
```

以上です。

### 参考
- [Configuring Test Coverage](https://docs.codeclimate.com/docs/configuring-test-coverage)
- [CircleCI Test Coverage](https://docs.codeclimate.com/docs/circle-ci-test-coverage-example) 
- [codeclimate/test-reporter: Code Climate Test Reporter](https://github.com/codeclimate/test-reporter)
- [colszowka/simplecov: Code coverage for Ruby 1.9+ with a powerful configuration library and automatic merging of coverage across test suites](https://github.com/colszowka/simplecov)
解の公式の証明(統計学を理解するための高校数学理解の一歩)

# はじめに
機械学習分野の数学を文系人間がゼロから頑張ろうとすると、まず高校数学が課題になります。
二次関数でさえ、すでに逃げたくなるレベルで難しい要素が出てきます。
特に解の公式の証明などを各サイトで見ると、唐突な割り算などが多く、ますます数学が嫌いになります。
そこで、高校数学の理解の第一歩として、解の公式の証明をなるべく省略せず、わかりやすく書いてみました。


# 解の公式の最終目標

$ ax^2 + bx + c = 0 $を$ x = ? $の形にすること

# 平方完成(途中で必要な概念)

## 平方完成の目的

```math
ax^2 + bx + c = 0  \\
```
のうちの、

```math
x^2 + bx
```
を

```math
(x + α)^2 + β
```
にすることを考える。

## 式の展開

```math
(x + α)^2 + β
```
を展開すると、

```math
x^2 + 2αx + α^2 + β
```

となる。

以下の2つの式の、xの係数が同じ部分を見比べる。

```math
\begin{align}
1)\  & x^2 + bx \\
2)\  & x^2 + 2αx + α^2 + β
\end{align}
```

### 係数x^2の部位
どちらも$ x^2 $

### 係数xの部位

```math
2αx = bx
```
なので、

```math
\begin{align}
2α &= b  \\
α &= \frac{b}{2}  \\
\end{align}
```

### 係数xがない部位

1) には存在しないので0と等しいと考える。

```math
α^2 + β = 0
```

の等式になる。
これを解く。

```math
\begin{align}
α^2 + β &= 0  \\
β &= -α^2  \\
&= -(\frac{b}{2})^2  \\
\end{align}
```

## 当てはめる

αとβをそれぞれ当てはめる。

```math
\begin{align}
x^2 + bx
&= (x + α)^2 + β \\
&= (x + \frac{b}{2})^2 -(\frac{b}{2})^2
\end{align}
```

# 解の公式の証明を行う

## 平方完成を使う

```math
ax^2 + bx + c = 0
```

xの係数をaでくくる ($ a \times \frac{b}{a} = b $なのでbをaで割る)

```math
a(x^2 + \frac{b}{a}x) + c = 0
```

$ (x^2 + \frac{b}{a}x) $を平方完成して$ (x + α)^2 + β $の形にする。
先ほどの平方完成の公式を当てはめる

```math
a\{(x + \frac{b}{2a})^2 -(\frac{b}{2a})^2\} + c = 0
```

## 定数項の移行、通分する

大かっこを外す
※ちなみに、$ a(\frac{b}{2a})^2 = a(\frac{b^2}{4a^2}) = \frac{b^2}{4a}$

```math
a(x + \frac{b}{2a})^2 - \frac{b^2}{4a} + c = 0
```

左辺のxの係数のない項を右辺に移項する

```math
a(x + \frac{b}{2a})^2 = \frac{b^2}{4a} - c
```

右辺の項目を通分する

```math
\begin{align}
a(x + \frac{b}{2a})^2
&= \frac{b^2}{4a} - \frac{4ac}{4c} \\
&= \frac{b^2 - 4ac}{4a} \\
\end{align}
```

## 二次式を一次式にする

両辺をaで割る

```math
\begin{align}
\frac{1}{a} \times a(x + \frac{b}{2a})^2 &= \frac{1}{a} \times \frac{b^2 - 4ac}{4a} \\
(x + \frac{b}{2a})^2 &= \frac{b^2 - 4ac}{4a^2}
\end{align}
```

両辺とも平方根を取る（二次式は一次式になる、一次式は平方根を取る）

```math
x + \frac{b}{2a} = \pm\sqrt{\frac{b^2 - 4ac}{4a^2}}
```

$ 4a^2 $ は2aの二乗なので平方根を外せる

```math
x + \frac{b}{2a} = \frac{\pm\sqrt{b^2 - 4ac}}{2a}
```

左辺の$ \frac{b}{2a} $を右辺に移項する

```math
x  = -\frac{b}{2a} \frac{\pm\sqrt{b^2 - 4ac}}{2a}
```

左辺を通分して完成

```math
x  = \frac{-b\pm\sqrt{b^2 - 4ac}}{2a}
```

# 課題
- 数式を「```math」で囲った場合でも左寄せにする方法がわからなかった
- 省略しないで書いたつもりですが、よくわからないところがありましたら質問ください。（こうしたほうがいいなども歓迎です）