OmniAICreator/Qiita-1.07M huggingface dataset:
Azure ADでSAML認証してAWSCLIを実行する方法

## 概要
- セキュリティポリシーでIAM Userの作成/使用が原則禁止されている現場ってありますよね？
- AWSのAPIKey流出事故は何度も見聞きしているので、IAMUser作成を禁止するのは理解できます。
- IAMUserを使わずにログインする方法の一つとして、AzureAD経由でSAML認証する方法があります。
- AzureAD側でMFAログインを必須化することもできて、とてもセキュアな設計なのですが、AWS CLIを使うのにひと手間かかります。
- 今回はその手間を省くツール[aws-azure-login](https://github.com/sportradar/aws-azure-login)を見つけたので、使い方をメモしておきます。

## インストール方法
```sh
$ npm install -g aws-azure-login
```
- インストールは簡単ですね。

## 初期設定の手順
```
$ aws-azure-login --configure --profile <profile_name>
```
- READMEに書いてある通り設定していきます。

```
Configuring profile '<profile_name>'
? Azure Tenant ID:
```
1. いきなりつまずきます。 `Azure Tenant ID` とはなんぞや？
1. [トラブルシューティングのためにブラウザで SAML レスポンスを表示する方法](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/troubleshoot_saml_view-saml-response.html)を参考にSAMLレスポンスを抜き出してみました。

1. レスポンスの中にそれらしき値を発見
`<Attribute Name="http://schemas.microsoft.com/identity/claims/tenantid"><AttributeValue>xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx</AttributeValue>`

1. ↑のAttributeValueを入力します。

```
? Azure App ID URI:
```
1. 今度は `Azure App ID URI` を聞かれます。Azure側のなにかのURLかと思いましたが、[MSが提供しているドキュメント](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial)によると、`https://signin.aws.amazon.com/saml` を設定すべしと書いてあります。なんだAWSのサインインURLのことだったのですね。ということで↑のURLを入力します。


```
? Default Username:
```
1. AzureADにログインするユーザ名を入力します。


```
? Default Role ARN (if multiple):
```
1. Role ARNを聞かれます。SAML認証用のIAMRoleのARNを入力します。例: `arn:aws:sts::<account_id>:assumed-role/<role_name>`

```
? Default Session Duration Hours (up to 12): (1)
```
1. セッションの有効期間を聞かれますので、入力します。


## ログイン手順
```
$ aws-azure-login --profile <profile_name>
```

- PassWord, MFA-token等を聞かれるので、よしなに入力してください。
- 先の手順でUserName等にはデフォルト値が登録されていると思います。


## AWSCLI実行
```
$ aws s3 ls --profile <profile_name>
```

- これでAWSCLIを実行できるはずです:tada:



## 参考資料
- [github.com/sportradar/aws-azure-login](https://github.com/sportradar/aws-azure-login)
- [トラブルシューティングのためにブラウザで SAML レスポンスを表示する方法](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/troubleshoot_saml_view-saml-response.html)
- [チュートリアル:Azure Active Directory シングル サインオン (SSO) とアマゾン ウェブ サービス (AWS) の統合](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial)
UiPath 正規表現ビルダーを使って情報を抽出する方法

#概要
UiPathの機能「正規表現ビルダー」を使って、欲しい情報を抽出する方法をまとめました。

#ことの始まり
社内メンバーからの質問から始まりました。
:rolling_eyes:「取得したテキストから**メールアドレス**だけをうまく取り出す方法ってないかなぁ？」
わたし「たしか正規表現を作りやすくするアクティビティがあった気がするので調べてみますね！」

#どんなアクティビティ？

- 正規表現を用いて該当の文字列の**有無を判別**する「**[文字列の一致をチェック](https://docs.uipath.com/activities/lang-ja/docs/is-match)**」アクティビティ
- 正規表現を用いて該当の文字列を**抽出**する「**[一致する文字列を取得](https://docs.uipath.com/activities/lang-ja/docs/matches)**」アクティビティ

を設定する場合に「正規表現ビルダー」と呼ばれる正規表現を構築、検証できる画面が表示されます（完全式に設定した正規表現に合致する部分が黄色くハイライトされる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/90d8377b-91ca-ad1a-98c9-c55cf6fe5023.png)

#サンプルロボット作ってみました
[GitHub](https://github.com/odm-cckte0122/UiPath_MatchSample)にサンプルをあげました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/90f9ad5d-0261-d88b-7e38-bca17c70db9f.png)

#正規表現ビルダーの使い方
今回はプリセットで指定されている「**メールアドレス**」という正規表現を使用しましたが、他にも「**行頭**」「**行末**」「**URL**」「**米国式の日付**」など、様々なプリセットのほかにも自分で正規表現を作成することも可能です。
また、テスト用テキストを入力することで、正規表現がきちんと意図した文字列を認識、取得出来ているか確認もできます。
詳細は[公式ガイド(RegEx Builderウィザード)](https://docs.uipath.com/activities/lang-ja/docs/regex-builder-wizard)を参照してください。

#各アクティビティを使う上で気をつけること
##「文字列の一致をチェック」アクティビティの注意
###確認結果はBoolean型で出力される
出力する変数の型はBoolean型のため、チェック時にいくつ**該当の文字列が含まれているか**までは確認できません
※確認したい場合は「一致する文字列を取得」アクティビティで取得した値で判別(取得した値.Length)した方がよいかと…

##「一致する文字列を取得」アクティビティの注意
###出力される変数の型はIEnumerable\<Match>型
あまり見慣れない型ですが、正規表現で合致した結果が配列として保持されます。
出力変数名を格納するボックスで**Ctrl + K**を押すことで自動的に適切な型の変数をその場で作成できるので、
その方法で対応するとよいと思います:ok_woman_tone1:
なお、配列なので「繰り返し (コレクションの各要素)」アクティビティを使って繰り返し処理も行えます
※プロパティよりTypeArgumentを**System.Text.RegularExpressions.Matchに変更**するのを忘れないで！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/5dccb3a6-8571-c6a3-04c7-5e7d895d646e.png)

#最後に
おすすめの正規表現について学べるサイトがあれば教えてください・・・
配列クラスタリングCD-HIT・BLASTの出力clstr形式をbed形式に変換する

#CD-HITとは
・配列クラスタリングプログラム(http://weizhongli-lab.org/cd-hit/)
###入力ファイル形式
・クラスタリングを実行させたい配列ファイルをFASTA形式で入力

###出力ファイル形式
２種類
・クラスタリング実行後のFASTAファイル
・クラスター番号付きの.clstrファイル

#問題
clstrファイルが扱いづらい。BLAST(https://blast.ncbi.nlm.nih.gov/Blast.cgi )の出力ファイルも同様。
→BED形式にしてBEDTools(https://bedtools.readthedocs.io/en/latest/ )を駆使したい。

つまり、csplitコマンド（https://linuxcommand.net/csplit/ ）などでクラスターごとに分割後の、

```text:hogehoge_clstr0.clstr
>Cluster 0
0	570nt, >chr1:7662318-7662888... at -/95.96%
1	178nt, >chr1:45648847-45649025... at +/99.44%
2	623nt, >chr1:51329409-51330032... at -/97.11%
3	187nt, >chr1:58841900-58842087... at -/98.40%
4	180nt, >chr1:60684077-60684257... at -/98.89%
5	629nt, >chr1:61108647-61109276... at +/96.98%
6	218nt, >chr1:61241171-61241389... at -/95.41%
7	748nt, >chr1:65918300-65919048... at -/96.79%
8	393nt, >chr1:67547311-67547704... at -/96.95%
```
これを

```text:hogehoge_clstr0.bed
chr1	7662318	7662888
chr1	45648847	45649025
chr1	51329409	51330032
chr1	58841900	58842087
chr1	60684077	60684257
chr1	61108647	61109276
chr1	61241171	61241389
chr1	65918300	65919048
chr1	67547311	67547704
```

こうしたい。

#解決法
今回はCD-HIT出力のヒトの常染色体のみを前提にしてるけど、
grepの正規表現をお好きなようにすれば生物種問わずBLASTにも対応できる。

grep -oでは正規表現にマッチした部分のみ抽出する。これを利用する。

```bash:bash
cat hogehoge_clstr0.clstr | grep -o '[0-9]\+:[0-9]\+-[0-9]\+' | tr ':-' '\t' | sort -k1,1n -k2,2n | awk '{print "chr"$0}' > hogehoge_clstr0.bed
```

シェルは偉大なり。
以上。
【JS】DOM操作が楽になる！dom_sen.js

## はじめに
今回紹介するのはdom_sen.jsというライブラリです。
ポイントとしては、とても軽量で扱いやすいというところです。
dom_sen.jsは、そのままの通り、DOM操作が楽になります。
Jqueryほどではないけれど、簡単にDOM操作をしたいという方向けのライブラリとなります。
##使い方
(こちらでは簡単に説明をしています。詳しく知りたい方はこちら:[dom_sen.js](https://kore-ene.blogspot.com/2019/11/domdomsenjs.html))
まず、

```html
<script src="https://tamralworld.com/library/dom_sen_v2.js"></script>
```
※ファイル名のv2は[dom_sen.js](https://kore-ene.blogspot.com/2019/11/domdomsenjs.html)にある最新のバージョン名にしてください。2019/11/29時点ではV2です。
## 基本
まず、queryselectの省略をすることが可能になります。
こうなります。
document.querySelectorAll()
↓↓
qsa()

document.querySelector()
↓↓
qs()

次に、qsa()で指定した要素のHTMLを変更する場合です。
要素の中身を変更するにはこの二つの関数があります。
- qsa_html( CSSセレクタ , HTML)
- qsa_text( CSSセレクタ , テキスト)
※V2ではqsa_value( CSSセレクタ , value値)が使用可能になりました

Jqueryにしたら、この処理と同じです。
- $(CSSセレクタ).html(HTML);
- $(CSSセレクタ).text(テキスト);

また、V1ではCSSのdisplayのみを省略することができます。
ですが、v2では下のd_関数と同様のCSSを省略することが可能です。
記述例 : qsa_display( CSSセレクタ , CSS[display]の値 );

- qsa_display()
- qsa_opacity()
- qsa_width()
- qsa_height()
- qsa_color()
- qsa_background()
- qsa_border()
- qsa_border_radius()
- qsa_top()
- qsa_left()
- qsa_bottom()
- qsa_right()
- qsa_position()
- qsa_margin()
- qsa_padding()
- qsa_transition()
- qsa_transform()
- qsa_z_index()
- qsa_box_sizing()
- qsa_font_size()

また、このライブラリは、属性でも操作することができます。
## 属性により操作する方法
基本的に関数の構造は次のようになります。
d_○○( 属性ネーム , 属性ネームの値 , 値 )
HTML構造の例は次のようになります。

```html
<div d_text="text1"></div>
<script>
d_html("text","text1","これはスクリプトで変更しました！");
//属性d_textがtext1の要素のHTMLを「これはスクリプトで変更しました！」に変更
</script>
```
d_○○はV1の時点でこの関数が存在します。
- d_html()
- d_text()
- **d_value()**
- d_display()
- d_opacity()
- d_width()
- d_height()
- d_color()
- d_background()
- d_border()
- d_border_radius()
- d_top()
- d_left()
- d_bottom()
- d_right()
- d_position()
- d_margin()
- d_padding()
- d_transition()
- d_transform()
- **d_z_index()**
- **d_box_sizing()**
- **d_font_size()**
※太字はV2で追加された関数です。
※関数はすべて置き換え用です。読み取りはできません。
## 最後に
V1とそれ以降のバージョンの変更点は太字で付け足しますのでよろしくお願いします。

このライブラリは比較的軽いので使いやすくWebの読み込みに影響しにくいのがポイントです。
Jqueryを使わずにDOM操作をしたいのならこのライブラリがいいでしょう。
FTP操作はcURLで行うと便利です

マウス操作が多いFTPでしすが、cURLで行うと便利です。

# 基本
ユーザー名とパスワードを環境変数に設定しておくと使いやすいです。

```console
$ export FTP_USER=user FTP_PASS=password
```

# ファイルの取得（GET）

```console
$ curl -s  --user ${FTP_USER}:${FTP_PASS} ftp://ftp.example.com/file.csv
```

# ファイル一覧取得
ディレクトリに対してリクエストをすると一覧を取れます。


```console
$ curl -s  --user ${FTP_USER}:${FTP_PASS} ftp://ftp.example.com/dir/
```

## ファイル名でソートして取得

```console
$ curl -s  --user ${FTP_USER}:${FTP_PASS} ftp://ftp.example.com/dir/ | sort | tail -n 1
```

# アップロード
`-T`もしくは`--upload-file`

```console
$ curl --upload-file upload.csv  --user ${FTP_USER}:${FTP_PASS} ftp://ftp.example.com/dir/
```

[FTP file upload using cURL | ADMFactory](https://www.admfactory.com/ftp-file-upload-using-curl/ "FTP file upload using cURL | ADMFactory")
【JavaScript 】アロー関数の書き方

 アロー関数の書き方を学んだのでやってみました！

## 基本の関数

```js
function func(text) {
    console.log(text);
}
```

**やってみた**
![スクリーンショット 2019-11-29 9.59.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/e9619398-6760-14d1-d2b0-48d29c27c3af.png)


##  アロー関数で書いてみた
```js
const test = () => {
    console.log('アロー関数書き方');
}
test();
// console.logの結果が返ってくる
```

**やってみた**
![スクリーンショット 2019-11-29 9.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/d6bc390e-67b9-4913-4e0a-83e967e3ed32.png)

↑この書き方は省略できて…
## 省略形
 ```js
const test2 = () => console.log('test2');
test2();
```
**やってみた**
<img width="310" alt="スクリーンショット 2019-12-03 9.40.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/db787259-a555-76fd-e10d-af4317e3d1c7.png">

##引数がある場合
```js
const test3 = (text) => console.log(text); 
test3('test3引数');
//test3引数　が返ってくる
```

**やってみた**
<img width="325" alt="スクリーンショット 2019-12-03 9.50.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/9741a590-35ab-801f-e15d-6fef05828fee.png">

↓
これと同じ動きをする省略しない書き方

```js
function test4(text) {
    console.log(text);
}
test4(1111) //1111
```
**やってみた**
<img width="410" alt="スクリーンショット 2019-12-08 3.56.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/c7ac5da3-a73c-56f7-5896-e1b533b971fd.png">
[ Android ] アプリアイコンを指定する方法

Androidでアプリのアイコンを指定する方法を調査してみた。

##指定方法
まずアイコンに使う画像ファイルを作成する。
アイコン画像は解像度に応じて以下の通りに作成する。
・MDPI 48x48
・HDPI 72x72
・XHDPI 96x96
・XXHDPI 144x144

作成出来たらdrawableに入れる。

後はマニフェストファイルでアイコンを指定するだけである。
以下のようなコードを追加すればよい。

~~~xml
<application>
    android:icon="@drawable/画像ファイル名"
</application>
~~~



##参考サイト
http://androidstudio.hatenablog.com/entry/2014/07/23/111303
Raspberry Pi Mouseの準備を進めてみた（その２）

ラズパイの無線LAN接続がうまくいかず、試行錯誤。
ifconfigしてもwlan0が見つかりません。認識されていないです。

このページ[ラズパイ3で無線LANを有効にした時のお話](https://ochanjanai.net/it/146)を試してみます。
長く悩んでいましたが、次のコマンドで解決しました。うれしい！

cd /lib/firmware/brcm/
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43430-sdio.bin
wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm/brcmfmac43430-sdio.txt
shutdown -r now

ラズパイボードをロボットに搭載して、無線LANでの接続が確認できました。
次からロボット動かしていきます。

![IMG_4971.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298045/652dc798-7ca2-53f0-bb3d-6b7faf541bb3.png)
スクレイピングツール5選 | 有料なソフトウェア型スクレイピングツール

元記事：[https://jp.scrapestorm.com/tutorial/5-paid-software-scrape-tool/](https://jp.scrapestorm.com/tutorial/5-paid-software-scrape-tool/)
より多くの企業がデータ分析の重要さを了解していきますから、様々な[スクレイピングツール](https://jp.scrapestorm.com/)が出できます。洞察力のあるビジネスマンがきっとこのスクレイピングツールの商機を外さないでしょう。今回は五つの有料なソフトウェア型スクレイピングツールを紹介しよう。
###1.Mozenda
Mozendaは、ソフトウェア（SaaSおよびオンプレミスオプション）またはマネージドサービスの’形式で技術を提供します。これにより、人々は非構造化Webデータをキャプチャし、構造化形式に変換でき、企業が使いようになります。
Mozendaは以下のサービスを提供します：1）クラウドホストソフトウェア2）オンプレミスソフトウェア3）データサービス15年以上の経験を持つMozendaは、あらゆるWebサイトからのWebデータ抽出を自動化することを可能にします。
**プラン：**30日間の無料トライアルが提供します。
![alt](https://jp.scrapestorm.com/wp-content/uploads/2019/11/1mozenda.png)
###2.ScrapeStorm
[ScrapeStorm](https://jp.scrapestorm.com/)は、人工知能を基づき、プログラミングしなくても、ほとんどすべてのWebサイトからデータを抽出できると言う[Webスクレイピングツール](https://jp.scrapestorm.com/)です。
強い機能を持って、使いやすいです。URLを入力だけで、自動的に抽出するデータと次のページボタンを識別できます。複雑なルール設定が必要ないし、1-clickで99％のWebサイトのスクレイピング要求が満たします。
ScrapeStormは、Windows、Mac、およびLinuxに適応するソフトウェアです。Excel、HTML、Txt、CSVなどのさまざまなファイル形式で結果をダウンロードできます。 さらに、データベースやウェブサイトにデータをエクスポートできます。
**プラン：**ソフトウェア自身は[いつも無料](https://jp.scrapestorm.com/?type=pricing)です。有料プランには加速ブースト、スケジュール、画像のダウンロードなどの機能が提供し、効率がかなりパワーアップします。
![alt](https://jp.scrapestorm.com/wp-content/uploads/2019/11/2ScrapeStorm.png)
###3.Fminer
FMinerは、WindowsおよびMac OS X向けのWebスクレイピング、Webデータ抽出、スクリーンスクレイピング、Webハーベスティング、Webクロール、およびWebマクロサポート用のソフトウェアです。定期的なWebスクラップタスク、またはフォーム入力、プロキシサーバーリスト、ajax処理、およびマルチレイヤーマルチテーブルクロールを必要とする非常に複雑なデータ抽出プロジェクトに直面している場合でも、Webスクラップツールです。
**プラン：**残念ですが、無料トライアルがありません。
![alt](https://jp.scrapestorm.com/wp-content/uploads/2019/11/3Fminer.png)
###4.Helium Scraper
Windows向けのスクレイピングソフトウェアです。CefSharpを組み込みブラウザーとして使用し、多くの並列オフスクリーンブラウザーを実行でき、最小限の言語を使用できるWebスクレイパーと、すぐに使用できるウィザードを使用して抽出エージェントを構成します。
**プラン：**10日間の全機能無料トライアルを提供します。
![alt](https://jp.scrapestorm.com/wp-content/uploads/2019/11/4Helium-Scraper.png)
###5.WebHarvy Web Scraper
WebHarvyは、Webページで発生するデータのパターンを自動的に識別します。 そのため、Webページからアイテムのリストを取得する必要がある場合、追加の構成を行う必要はありません。 データが繰り返されると、WebHarvyは自動的にデータをスクレイピングします。
**プラン：**残念ですが、無料トライアルがありません。
![alt](https://jp.scrapestorm.com/wp-content/uploads/2019/11/5WebHarvy-Web-Scraper.png)
🍰【CakePHP2】テンプレートにjavascript呼び出しのみのボタンを設置

## 環境

PHP 7.2.21
CakePHP 2.10.18

## 内容

CakePHPのHTML機能でjsを呼び出す
デフォでリンクになるがページ移動はしたくない

## やりたいこと

jsを呼び出すだけのボタンを設置

## やったこと

```php:test.ctp

<?php echo $this->Html->link('click me', 'javascript:hoge();void(0)', ['class' => 'fuga']); ?>

// class無しの場合
<?php echo $this->Html->link('click me', 'javascript:hoge();void(0)'); ?>

<script>
    function hoge() {
        alert('HOGE');
    }
</script>

```
railsのバージョン変更する

# cloneしたgemfileのバージョンにrailsのバージョンを合わせたい

該当のバージョンをインスール

```terminal
$ gem install -v 5.2.1 rails
```

エラーが起きる

```terminal
gem install -v  5.2.1 rails
ERROR:  Error installing rails:
        The last version of sprockets (>= 3.0.0) to support your Ruby & RubyGems was 3.7.2. Try installing it with `gem install sprockets -v 3.7.2` and then running the current command again
        sprockets requires Ruby version >= 2.5.0. The current ruby version is 2.4.2.198.
```

rubyのバージョンを変更したので、それに合わせて

```terminal
gemのアップデート
$ gem update --systems
新しくインストールしたrubyの環境にbundleを入れる
$ gem install bundler
```

そして先ほどのエラー文を読むと

```terminal
gem install sprockets -v 3.7.2
```
してください。となっていたのでこれを実行する。

もう一度
 
```terminal
$ gem install -v 5.2.1 rails
```
#Rails + rspec + rake タスクで環境変数を利用してタイムゾーンを指定したテストをする例 ( specify local timezone test with rake )

# rake

```rb
namespace :foo do
  task bar: :environment do |task|
    date = if ENV['ON'].present?
             Date.parse(ENV['ON'])
           else
             Time.current.in_time_zone('Tokyo').to_date.yesterday
           end

    Alice.run!(on: date)
  end
end
```

# spec

```rb
require "rails_helper"
require "rake"

describe 'foo' do
  before(:all) do
    @rake = Rake::Application.new
    Rake.application = @rake
    Rake.application.rake_require('bar', [Rails.root.join('lib', 'tasks', 'foo')])
    Rake::Task.define_task(:environment)
  end

  before(:each) do
    @rake[task].reenable
  end

  describe  do
    let(:task) { 'foo:bar' }

    context 'when now is beggining of day at JST' do
      before do
        travel_to '2020-01-01 00:00:00'.in_time_zone('Tokyo')
      end

      it do
        expect(Alice).to receive(:run!).with(on: Date.new(2019, 12, 31))
        @rake[task].invoke
      end
    end

    context 'when now is end of day at JST' do
      before do
        travel_to '2020-01-01 23:59:59'.in_time_zone('Tokyo')
      end

      it do
        expect(Alice).to receive(:run!).with(on: Date.new(2019, 12, 31))
        @rake[task].invoke
      end
    end

    context 'when specify target date' do
      before do
        travel_to '2020-01-01 00:00:00'.in_time_zone('Tokyo')
        allow(ENV).to receive(:[]).with('ON').and_return('2020-02-01')
      end

      it do
        expect(Alice).to receive(:run!).with(on: Date.new(2020, 02, 01))
        @rake[task].invoke
      end
    end
  end
end
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2780








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Laravel-Excelで複数行のヘッダーを無視したい

# Laravel-Excelで複数行のヘッダーを無視したい時

[Laravel Excel](https://laravel-excel.com/)

ドキュメントをみたけれど、~~書いてなかったので~~（書いてありました。）、Issueに書いてあったことを記録しておきます。

例えば、ヘッダー行（1行目）を飛ばすのはオプションでありそうですが、複数行目（例：6行目からデータ行が始まっているので、）飛ばしたい場合、いかのように書いてやればいいです。

`WithStartRow`を使用します。

```php
use Maatwebsite\Excel\Concerns\WithStartRow;

class UsersImport implements ToModel, WithStartRow
{
    /**
     * @return int
     */
    public function startRow(): int
    {
        return 6;
    }
}
```
研究室のMacで「 Command Line Tools」がインストールできない


# はじめに

大学の研究室のパソコンで不具合が頻発しているため
OSを再インストールしました。

Gitなどいろいろと使いたいものがあるため
CommandLineToolsを入れようとしたところ

「App Storeに接続できません。」
「ネットワークに接続できません。」
などと出ました。


# 対処策

プロキシが原因の可能性があります。
大学では、プロキシサーバーがあると思うので（ないところはちょっと考えられないですね）
それようにプロキシを設定します。

「システム設定」「ネットワーク」「Ethernet」「詳細」「プロキシ」を開き
Webプロキシと保護されたWebプロキシをチェックしましょう。
そして、Webプロキシサーバのドメイン名と内側のポート番号を入力すれば完成です。
Vue.js を使うときに気を付けること。

# Vue.js を使うときに気を付けること。

とりあえず、今の時点で痛い目にあったもの。

## 文字列の表示は .nodeValue を使っているので改行が無くなる。

`<div>{{text}}</div>`
のような場合に、this.text に改行が入っていても、その改行は無視されて一行で表示されてしまう。

.wrap { white-space:pre-wrap; word-wrap:break-word; }
のようなものを用意して
`<div class="wrap">{{text}}</div>`
とする。

## VueRouter では同じハッシュ値だと一切何のアクションも発生しない。

各ページへのリンクを上部において、本体を下部に表示している場合に、
最新の情報にしたく更新のつもりで再度同じ `<router-link>` をクリックしても Vue は一切反応してくれない。
※ createdフックなどが呼ばれない、というか何も処理が動かない。

ただ、パラメータが違う場合は、beforeRouteUpdate フックが呼ばれるようなので、
面倒だがクリック毎に変化するダミーを用意してこのフックで捕捉して処理する。

## v-for で回す場合の key は当然、重複してはいけない。

`<div v-for="x of [0,1,2,3]" :key="1">{{x}}</div>`
↑ みたいに key が重複すると以下のような warn がでる。
`[Vue warn]: Duplicate keys detected: '1'. This may cause an update error.`
Firebase(Dynamic Links)で短縮URLを作成する


#Firebase(Dynamic Links)で短縮URLを作成する

##発端
 スクリーンに映したり、紙に印刷する資料にURLを記載したいがURLが長すぎて
 スクリーンを観た人や資料を受けとった人がURLにアクセスするのが大変なのでなんとかしたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/c0abaf0d-db6b-cd28-59f7-b7ff1b0414e3.png)




##そこでURLを短縮して、資料に書き込むためにFirebaseを使ってみる

###Firebaseとは

```text
Firebaseは、2011年にFirebase、Inc.によって開発され
2014年にGoogleに買収されたモバイルおよびWebアプリケーション開発プラットフォームです。
2018年10月現在、Firebaseプラットフォームには18の製品があり、150万のアプリで使用されています。
```

出典：
https://en.wikipedia.org/wiki/Firebase


Firebase
https://firebase.google.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/74c2e5ed-5389-a0a5-f16c-a0689b576158.png)


###使ってみる

####１．プロジェクトの作成

**①TOPページの使ってみるリンクからプロジェクトの作成画面まで進めます**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/51e6f252-be35-03ee-271e-deaf6e280413.png)

**②プロジェクトを追加からプロジェクトを追加します**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/bac5f4b0-6792-2b93-79a6-308c393ca65a.png)

**③名前をつけましょうと言われるので名前をつけます**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/0109e59f-1d29-32c0-4071-c62922bb089d.png)

####２．プロジェクトの作成

**①プロジェクトを選択するとダッシュボード画面に飛びます**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/0f9ce374-cde9-32e8-49fa-16cef60761cd.png)


**②右下のほうにある"すべての拡大の機能を表示"を選択します**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/231299bc-8e5f-1f3d-35ff-3ebf6093b6a5.png)


**③Dynamic Linksを選択します**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/08b07065-6482-d718-f086-5618b4209162.png)


**④Dynamic Linksの画面から始めるを選択します**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/a65ab64a-bbf4-e9db-b0b6-4e6128781155.png)

**⑤短縮URLのドメインを入力します**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/4fbdf1fe-f610-fd71-f238-b219d980d057.png)


**⑥ドメインを確定して、プロジェクトの作成を完了させます**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/780ce170-6edb-da72-8ade-0ca7b60e40f6.png)


####３．Dynamic Linksで短縮URLの作成

①新しいダイナミックリンクを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/a18af493-de14-ba68-60dc-9c83e34e868e.png)


②先に短縮後のURLを入力します
 ここで長いURLを入れてしまうと短縮URLの意味がないので短めで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/e2579c8e-6023-2bf8-7c13-8a0ee7e8e5f3.png)


③短縮したい（実際に見せたいページのURL）URLを入力します
１と２の設定はしっかりやる必要がありますが、３４５はこだわりがなければデフォルトのままでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/0bb5c88e-de5d-7015-47d9-62a20dcbf5ab.png)


④正常に短縮URLが作成されるとダイナミックリンクの一覧に作成した短縮URLが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/a7e9049a-f8f7-ca3d-550a-2a14d1e6934e.png)
Laravel Nova 画像アップロードしてみた

##環境
PHP 7.2.21
Laravel 6.3.0
Laravel Nova 2.5.0

##実装

テーブル作成

```
php artisan make:migration create_picture_uploads_table
```


```php:src/database/migrations/create_picture_uploads_table.php

    public function up()
    {
        Schema::create('picture_uploads', function (Blueprint $table) {
            $table->Increments('id');
            $table->string('picture'); //追加
            $table->timestamps();
        });
    }


```

モデル作成

```
php artisan make:model Models/PictureUpload
```


リソース作成

```
 php artisan nova:resource PictureUpload
```

```php:src/app/Nova/PictureUpload
use Laravel\Nova\Fields\Image;

    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            Image::make('picture')
                ->disk('public')
        ];
    }
```

マイグレーション実行

```
php artisan migrate
```

シンボリックリンク作成

```
php artisan storage:link
```
![スクリーンショット 2019-11-29 15.37.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/fae145a6-669b-4f58-e3bf-49144b742c5b.png)

```
src/storage/app/public/wF17xoqTUlF9vN4SZuz7eXIRyOHe66weuhmEbtqg.png　//画像保存先

<img src="/storage/wF17xoqTUlF9vN4SZuz7eXIRyOHe66weuhmEbtqg.png">　//使用方法
```
SphinxでPythonコードのdocする自分用メモ

# この記事は
Sphinxを使って、Pythonコードをdocumentationする自分用ノート。
下記にとても素晴らしい記事があります。
- [Sphinxの使い方．docstringを読み込んで仕様書を生成](https://qiita.com/futakuchi0117/items/4d3997c1ca1323259844)


# 仮想環境
## createする
```bash
# 仮想環境名 sphinx_test ですすめていく
conda create -n sphinx_test python=3.6
```
## activateする
```bash
conda activate sphinx_test
```

# sphinxパッケージのインストール
```bash
pip install sphinx
```

# documentプロジェクトの初期化
```bash
# docsフォルダを作業スペースにする
sphinx-quickstart docs
```
- いくつか設定に関する質問が出てくるが、デフォルト値のままでよければ Enterキー を押していけばよい
- 下記の設定は任意
    - "project name:"
    - "Author name(s):"
    - "Project release []"

# document作成ののconfiguration
- `docs/conf.py`を開く
- 下記の箇所のコメントアウト解除
- 
```python
import os
import sys
sys.path.insert(0, os.path.abspath('../'))
# 上のディレクトリに置いたpyファイルを参照したいのでこうする
# os.path.abspath('./') => os.path.abspath('../')

```

# extensionの設定
```python
extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.napoleon'
]
```

# ここでいちどドキュメントをmakeしてみる
```bash
.\docs\make singlehtml
```

# pyファイルからrstファイルを生成する
```bash
# "."を見落とさないように。ディレクトリ内のすべてのファイルの意味。
sphinx-apidoc -f -o .\docs .
```


# index.rstの変更
```python
.. toctree::
   :maxdepth: 2
   :caption: Contents:

   TestClass # <- 追加したいpythonファイル　
```

# Pythonファイルを置く
```
- sphinx_test
    - docs
    - TestClass.py <-- ここに置く
```

- docstring形式でドキュメントしたいコメントを書く

```python
class TestClass:
    """Summary line.
    """

    def testfunc(self, x, y):
        """sum

        Args:
            x (int): 1st argument
            y (int): 2nd argument

        Returns:
            int: sum result

        Examples:
            >>> print(testfunc(2,5))
            7
        """
        return x + y
```

# ドキュメントのmake
- さっきと同じ

```bash
.\docs\make singlehtml
```
【共起解析】Pythonで簡単に共起解析する！【Python】

#共起解析
前回の記事【https://qiita.com/osakasho/items/0a0b50fc17c38d96c45e 】
では、形態素解析までしかやらなかったので、今度は共起解析もしてグラフ化してみます。

#必要なものをインストールする

```
pip install pyvis
```

#コード

```python
import spacy
nlp = spacy.load('ja_ginza_nopn')
import re
import itertools
import collections
from pyvis.network import Network
import pandas as pd
import time


"""---------   分解モジュール   --------"""
def sentence_separator(path, colname):
    black_list = ["test"]
    df = pd.read_csv(path, encoding="utf_8_sig")
    data = df[colname]
    sentence = []
    for d in data:
        try:
            total_ls, noun_ls, verm_ls = ginza(d)
            sentence.append(total_ls)
        except:
            pass
    return sentence

def ginza(word):
    doc = nlp(word)
    # 調査結果
    total_ls = []
    Noun_ls = [chunk.text for chunk in doc.noun_chunks]
    Verm_ls = [token.lemma_ for token in doc if token.pos_ == "VERB"]
    for n in Noun_ls:
        total_ls.append(n)
    for v in Verm_ls:
        total_ls.append(v)
    return total_ls, Noun_ls, Verm_ls
"""-------------------------------------"""

#テキストデータの取得を行う。
filename = "list.csv"
file_path = filename
colname = "歌詞"

#文章
sentences = sentence_separator(file_path, colname)
sentence_combinations = [list(itertools.combinations(sentence, 2)) for sentence in sentences]
sentence_combinations = [[tuple(sorted(words)) for words in sentence] for sentence in sentence_combinations]
target_combinations = []
for sentence in sentence_combinations:
    target_combinations.extend(sentence)

#ネットワーク描画のメイン処理
def kyoki_word_network():
    # got_net = Network(height="500px", width="100%", bgcolor="#222222", font_color="white", notebook=True)
    got_net = Network(height="1000px", width="95%", bgcolor="#FFFFFF", font_color="black", notebook=True)

    # set the physics layout of the network
    # got_net.barnes_hut()
    got_net.force_atlas_2based()
    got_data = pd.read_csv("kyoki.csv")[:150]

    sources = got_data['first']  # count
    targets = got_data['second']  # first
    weights = got_data['count']  # second

    edge_data = zip(sources, targets, weights)

    for e in edge_data:
        src = e[0]
        dst = e[1]
        w = e[2]

        got_net.add_node(src, src, title=src)
        got_net.add_node(dst, dst, title=dst)
        got_net.add_edge(src, dst, value=w)

    neighbor_map = got_net.get_adj_list()

    # add neighbor data to node hover data
    for node in got_net.nodes:
        node["title"] += " Neighbors:<br>" + "<br>".join(neighbor_map[node["id"]])
        node["value"] = len(neighbor_map[node["id"]])

    got_net.show_buttons(filter_=['physics'])
    return got_net

#まとめルンバ
ct = collections.Counter(target_combinations)
print(ct.most_common())
print(ct.most_common()[:10])

#データを一時保存
pd.DataFrame([{'first' : i[0][0], 'second' : i[0][1], 'count' : i[1]} for i in ct.most_common()]).to_csv('kyoki.csv', index=False, encoding="utf_8_sig")

time.sleep(1)

# 処理の実行
got_net = kyoki_word_network()
got_net.show("kyoki.html")

```


#結果
kyoki.htmlが出力されていると思うので、ブラウザで起動してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/8b0007a6-f721-fc8b-f3fa-bd1187064261.png)


終わり。
renvとBiocMangerで開発者版R環境を整備する

R/Bioconductorでパッケージを開発する際には、開発者版のR（[R-devel](http://mac.r-project.org)）で動作確認することが推奨されているが（大して守ってないが）、R-develを入れると、これまで使っていたRが使えなくなるため、どのように環境を分けるのかという問題がいつもあった。

以前は、[R/Bioconductor開発者のための開発環境の構築](https://qiita.com/antiplastics/items/ec64d9fadfe2448e445a)のように、R-develが入ったDockerコンテナを作るというやり方を考えたが（実際は大して使ってないが）、ここでは最近renvというパッケージが、バージョン管理に関係しているというのと、BiocManagerがインストールするパッケージのBioCのバージョン管理をしている話しがあったので、これらを組みわせて、BioCのRelease/Devel両方を手元のマシンで同時に扱えるか調べた。

ただし、**結論から言うと、うまくいかなかった。**

renvはRのプロジェクト毎のバージョン管理をしているだけで、

```
pyenv local [Pythonのバージョン]
```

みたいに、R言語のバージョン自体を管理するものではないらしい。


以下、作業した内容。


# 準備

まず、release/develのディレクトリを用意した。

```bash
mkdir release
mkdir devel
```

次に、remotes, BiocManager, renvをインストールしておいた。

```r
install.packages(c("remotes", "BiocManager"),
	repos="http://cran.r-project.org")
remotes::install_github("rstudio/renv")
```


# releaseディレクトリ内で

まず、release内部でRを起動して、以下を実行した。

```r
renv::init()
renv::snapshot()
```

パッケージの場所は、以下のようなところにある。

```r
.libPaths()
# [1] "/Users/koki1/Desktop/release/renv/library/R-3.6/x86_64-apple-darwin15.6.0"
# [2] "/private/var/folders/xw/00wshg996txb26ltmrgk8qtr0000gn/T/Rtmp9Hza8c/renv-system-library"
```

標準パッケージだけが入っている状態らしい。

```r
system(paste0("ls ", .libPaths()[2]))
# KernSmooth	base		cluster		datasets	graphics	methods		nnet		spatial		stats4		tools
# MASS		boot		codetools	foreign		grid		mgcv		parallel	splines		survival	utils
# Matrix		class		compiler	grDevices	lattice		nlme		rpart		stats		tcltk
```

ここで、Bioc3.10でリリースされた[scTGIF](https://bioconductor.org/packages/release/bioc/html/scTGIF.html)パッケージをインストールしてみる。

なお、renvのGitHubに[Issue](https://github.com/rstudio/renv/issues/242)が立っているように、そもそもrenvは以下のようにoptionを設定しないと、BioCパッケージを入れられないらしい。

```r
options(repos = BiocManager::repositories())
BiocManager::install(version="3.10")
BiocManager::valid() 
BiocManager::install("scTGIF")
```

# develディレクトリ内で

途中まではreleaseの時と同様の作業をした。

```r
renv::init()

renv::snapshot()

.libPaths()
# [1] "/Users/koki1/Desktop/devel/renv/library/R-3.6/x86_64-apple-darwin15.6.0"
# [2] "/private/var/folders/xw/00wshg996txb26ltmrgk8qtr0000gn/T/RtmpbXDLVK/renv-system-library"

options(repos = BiocManager::repositories())
BiocManager::install(version="devel")
# エラー: Bioconductor version '3.11' requires R version '4.0'; see
#   https://bioconductor.org/install
options(repos = BiocManager::repositories(version = "devel"))
# エラー: Bioconductor version '3.11' requires R version '4.0'; see
#   https://bioconductor.org/install
```

ここで、Rの4.0を入れろと怒られて終わった。

どうやら、このやり方で、Devel版のBioCパッケージをインストールできるのは、4月の半ばから10月の半ばだけらしい。

https://www.bioconductor.org/developers/how-to/useDevel/

よく知らなかったが、R言語は年に一度のアップデートなのに対して、BioCは半年に一回のアップデートのため、R言語もアップデートする際には、次のRのバージョンで動作確認するために、R-develを入れろということらしい。

なお、pyenv, pipenv, rbenvのように、R自体のバージョンを管理するものとしては、[Renv](https://github.com/viking/Renv)（renvではない）というものが過去にあったらしいが、もう7,8年メンテナンスされていないのと、

.Renv/versions

以下に、特定のバージョンのRのソースを置いて、手作業でコンパイルしておいてくださいという方針がめんどくさいので使ってない。
結局、いいやり方は見つからなかったので、ひたすらR-develだけを使うマシンとかを決めておいて使うぐらいの方が手間がないかも。
VS Code で AWS Lambda のローカルデバッグを行う方法

# VS Code で AWS Lambda のローカルデバッグを行う方法


この記事は[SRA Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sra)の12月4日の記事です。

こんにちは、2019年入社の産業第2事業部の羽田です。

初のQiita投稿です。


VScodeを使用したAWS Lambdaのローカルデバッグは
記事がほかにもありますが、
個人的に詰まったところがあったので作成しました。

## はじめに

- AWS Lambda をローカル環境(VScode)でデバッグ操作ができるようにします。
    - ブレークポイント設定、ステップ実行など

- 以下公式
> AWS Toolkit for Visual Studio Code は、Visual Studio Code 用のオープンソースプラグインで、アマゾン ウェブ サービス上でのアプリケーションの作成、デバッグ、デプロイを容易にします。AWS Toolkit for Visual Studio Code を使用すると、AWS 上での Visual Studio Code を使用したアプリケーションの構築をより迅速に開始でき、生産性が向上します。このツールキットは、使用開始のサポート、ステップ実行によるデバッグ、および IDE からのデプロイを含む、サーバーレスアプリケーションの統合開発環境を提供します。


## 必須

-   AWS アカウント
    -   使用するサービスに対する権限を持つ
    - Lambda,S3とか
-   Toolkit fot VScode
    -   Windows,macOS.linux をサポートしている
-   VScode のバージョン 1.31.1 以上

### 使用可能言語

-   以下三種の言語を使用可能
    -   .NET SDK: https://dotnet.microsoft.com/download
    -   Node.js SDK: https://nodejs.org/en/download
        - 今回はこれを選択
    -   Python SDK: https://www.python.org/downloads

## オプション(実質必須)

-   AWS SAM CLI
    -   無くても toolkit はインストールできるが、サーバレスアプリケーションには必須
-   Docker
    -   AWS SAM CLI に OSS コンテナプラットフォームが必要
    -   詳細は下記のダウンロードの説明に

## AWS SAM CLI と Docker のインストール方法(windows)

- 公式ドキュメントに従ってAWS SAM CLI と Dockerのインストールを行う

-   以下参照 (公式ドキュメント)
    https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-windows.html


## AWS Toolkit for VScode インストール

1. vscode エディタを開く
1. アクティヴィティバー>拡張機能>マーケットを開く
1. AWS Toolkit for VScode で検索
1. インストールし、エディタを再起動

## VScode の configure

-   VScode から AWS のリソースにアクセスできるように Credential を流し込む

1. コマンドパレットを開く
    - windows>Ctrl + Shift + P
1. AWS で検索
1. AWS:Create Credentials Profile を選択
1. name,ID,PassWord を入力

## アプリケーションをデバッグするまでのステップ

1. コマンドパレットを開く
    - AWS で検索
1. AWS: Create new AWS SAM Application を選択
1. Node10.x を選択
1. 保存先のローカルフォルダとアプリケーション名を入力
1. ローカルにアプリケーションが作成されているので選択
    - フォルダ内の app.js を開く

    ![VScode_local_app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534803/3c9bd13e-72ac-f4e4-a85f-923d83010ab7.jpeg)




1. lambda を編集
    - 以下黄色枠はデフォルトで書かれているもの
    - ここを消して Lambda 関数を書く
    
    ![VScode_local_lambda注意.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534803/3dbcef59-987f-e5d1-c492-de0666eb2d35.jpeg)

1. 17 行目あたりに**Run Locally|Debug Loccally|Condigure**

    ![VScode_local_run_debug_conf.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534803/64fb7af7-2a72-8ed3-8f0b-a945cdbe5328.jpeg)



1. Run Locally を選択
    - ローカルで lambda の実行ができる
    
    ![VScode_local_run_locally.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534803/c7314901-288a-fd06-f86d-1561b4a3846f.jpeg)





1. Debug Locally を選択
    - ローカルでデバッグできる



### 補足

- ローカルで作成し、AWS上にデプロイできます。
- デプロイ用のS3バケットを用意する必要があります。

- 以下公式ドキュメント
    - https://aws.amazon.com/jp/visualstudiocode/

    
    > 数回のクリックでサーバーレスアプリケーションをデプロイします。
    


## 参考

-   AWS Toolkit for Visual Studio Code (開発者向けプレビュー版) が マーケットプレイスからインストールできるようになったので、もう、コンパイルしなくてもレビューできます〜＼(^o^)／
    -   https://dev.classmethod.jp/cloud/aws-toolkit-for-visual-studio-code/
qsortの実装はなぜマージソート？ 高速な安定ソートとは？ (qs14)

#### 安定な比較ソート ssort(stable sort) (qs14) を作成しました
ssort の性能評価で悩んでいます。

https://ja.wikipedia.org/wiki/ソート
にあるように、ソートには安定なソートと安定でないソートがあります。

newlib の qsort のソースコードを読むと、伝統的なアルゴリズムによる実装です。
これは安定でないソートです。

一方、glibc の qsort のソースコードを読むと
その実装は、クイックソートではなくマージソートで実装されています。
マージソートは安定なソートです。

newlib・glibc の qsort の性能を比較すると、
ソート条件（キー値の分布・要素数・要素サイズ）により、速い/遅いが入れ替わります。

さて、私が用意したほとんどのソート条件において、ssort は glibc の qsort より高速です。
qs_glibc と ss14g1 を実行したときの 比較関数の呼出し回数・実行時間 を以下に示します。
各行の最後の数値がソート１回あたりの処理時間(10μ秒単位)です。
qs_glibc は、glibc の qsort を実験用に改造したものです。
使用したプログラムは https://github.com/kawamura1953/stable-sort にあります。

なぜ glibc の qsort はマージソートを採用しているのでしょうか？
「最悪計算時間が短いから」では補えないほど、平均計算時間が遅いと思うのですが・・・
何かご存じの方はお教えいただけないでしょうか。
　

```
----------------- benchmark.txt begin -------------------- 
 
キー種別:同値なし　要素数:1万個　要素サイズ:8,20,400byte 
qs_glibc d=-3 e=10000 s=8 R5000 M000:000:000:0: c=120451  602257294 T=12.01  240 
ss14g1   d=-3 e=10000 s=8 R5000 M090:200:000:0: c=129440  647203516 T=12.51  250 
 
qs_glibc d=-3 e=10000 s=20 R4000 M000:000:000:0: c=120451  481804645 T=30.00  750 
ss14g1   d=-3 e=10000 s=20 R4000 M090:200:000:0: c=129432  517729992 T=10.22  255 
 
qs_glibc d=-3 e=10000 s=400 R2000 M000:000:000:0: c=120449  240899735 T=10.86  543 
ss14g1   d=-3 e=10000 s=400 R2000 M090:200:000:0: c=129414  258828893 T=10.34  517 
 
キー種別:100種　要素数:1万個　要素サイズ:8,20,400byte 
qs_glibc d=100 e=10000 s=8 R6000 M000:000:000:0: c=120211  721269066 T=13.13  219 
ss14g1   d=100 e=10000 s=8 R6000 M090:200:000:0: c=62523   375140861 T=8.41  140 
 
qs_glibc d=100 e=10000 s=20 R5000 M000:000:000:0: c=120211  601058260 T=35.97  719 
ss14g1   d=100 e=10000 s=20 R5000 M090:200:000:0: c=62523   312616709 T=7.11  142 
 
qs_glibc d=100 e=10000 s=400 R2000 M000:000:000:0: c=120212  240424496 T=10.12  506 
ss14g1   d=100 e=10000 s=400 R2000 M090:200:000:0: c=62504   125008089 T=7.54  377 
 
キー種別:2種　要素数:1万個　要素サイズ:8,20,400byte 
qs_glibc d=2 e=10000 s=8 R8000 M000:000:000:0: c=94725   757804948 T=12.18  152 
ss14g1   d=2 e=10000 s=8 R8000 M090:200:000:0: c=15120   120964685 T=4.74   59 
 
qs_glibc d=2 e=10000 s=20 R8000 M000:000:000:0: c=94725   757804948 T=43.37  542 
ss14g1   d=2 e=10000 s=20 R8000 M090:200:000:0: c=15120   120964685 T=4.87   61 
 
qs_glibc d=2 e=10000 s=400 R3000 M000:000:000:0: c=94732   284197358 T=12.68  423 
ss14g1   d=2 e=10000 s=400 R3000 M090:200:000:0: c=15121    45364669 T=7.61  254 
 
 
キー種別:10種　要素数:1万,10万,100万個　要素サイズ:1000byte 
qs_glibc d=10 e=10000 s=1000 R2000 M000:000:000:0: c=116416  232833027 T=13.87  693 
ss14g1   d=10 e=10000 s=1000 R2000 M090:200:000:0: c=30010    60020710 T=10.70  535 
 
qs_glibc d=10 e=100000 s=1000 R100 M000:000:000:0: c=1479708  147970872 T=10.25 10247 
ss14g1   d=10 e=100000 s=1000 R100 M090:200:000:0: c=291330   29133013 T=7.25 7254 
 
qs_glibc d=10 e=1000000 s=1000 R10 M000:000:000:0: c=17952422  179524224 T=12.71 127130 
ss14g1   d=10 e=1000000 s=1000 R10 M090:200:000:0: c=2911052   29110528 T=8.52 85180 
 
=================  benchmark.txt end  ==================== 
各行の最後の数値がソート１回あたりの処理時間(10μ秒単位)です 
```
bashでシングルコーテーションをネストさせる

##経緯
シェルスクリプトを作成する際にどうしてもシングルコーテーションをネストさせる必要がありましたが、ちょっぴり悩んだのでいろいろと試しました(~~だいたいawkコマンドのせい~~)。

##解答
```:bash
[root@server]# echo 'Hello, '\''NEW'\'' world!'
Hello, 'NEW' world!
```
##解説
シングルコーテーションをネストすることは、**bashの仕様上そもそもできません**(~~タイトル詐欺では？~~)。
そこで、それっぽくするためにはネストさせる予定だったシングルコーテーションをシングルコーテーションの外に出し、外に出したシングルコーテーションをエスケープする必要があります。
上の例だと

'Hello, '
\'　　　←ネストさせたかったシングルコーテーション
'NEW'
\'　　　←ネストさせたかったシングルコーテーション
' world!'

を並べているだけです。

これができると下記のようなことができます。

```:bash
[root@server]# STATUS=OLD

[root@server]# echo 'Hello, '\''$STATUS'\'' world!'
Hello, '$STATUS' world!
#変数がシングルコーテーションで保護されている状態

[root@server]# eval echo 'Hello, '\''$STATUS'\'' world!'
Hello, $STATUS world!
#変数がシングルコーテーションで保護されているため二重展開では展開されない

[root@server]# eval eval echo 'Hello, '\''$STATUS'\'' world!'
Hello, OLD world!
#三重展開によってようやく変数が展開される
```

通常業務では使う機会ないと思いますが、変数でコマンドを生成する時によく使います。

##やったこと
色々試して失敗したものを備忘として下記にメモ書き

```:bash
[root@server]# echo 'Hello, "NEW" world!'
Hello, "NEW" world!
#ダブコであればいたって簡単
```

```:bash
[root@server]# echo 'Hello, 'NEW' world!'
Hello, NEW world!
#同じように入れたんじゃもちろん表示されない
```

```:bash
[root@server]# echo 'Hello, \'NEW\' world!'
-bash: !': event not found
#シングルコーテーション内でエスケープすると正しく認識されない
```

```:bash
[root@server]# echo 'Hello, '''NEW''' world!'
Hello, NEW world!
#VBっぽく書いてもダメ
```
```:bash
[root@server]# echo 'Hello, '"'"'NEW'"'"' world!'
Hello, 'NEW' world!
#ダブコをうまいこと使えば一応できる
```
```:bash
[root@server]# eval echo "'"'Hello, '"'"\\\'"'"'NEW'"'"\\\'"'"' world!'"'"
Hello, 'NEW' world!
#おまけ
```

シェル芸の片鱗を感じる
【備忘録】RLoginでよく使う機能まとめ

#インストール
[公式サイト](http://nanno.dip.jp/softlib/man/rlogin/)(1.3 インストールおよびアンインストール)

#設定
####サーバー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377686/2485e42a-7af3-aa89-52e5-aff23c2cc16e.png)

- エントリー(上)/コメント(下)
サーバ選択時に表示される名前

- タブ
入力するとサーバの選択が楽になる

- 前接続先
中継サーバを経て接続する必要がある場合に使用する(ポートフォワード)
※追加でプロキシ設定もいじる必要あり
　私が参考にしたのは[ここ](https://qiita.com/exjobo/items/ccbb33eca02fe63ed7b1)
例)
001に接続後、SSH接続で002に接続する必要がある場合
あらかじめ001のEntryを登録しておき
002のEntry登録の前接続先に001を指定することで
002に接続する際に自動で001からのSSH接続をやってくれる

#####スクリプト
別途スクリプトファイルを用意しておくことで起動時にいろいろ出来る
(teratermでいうところのttlに近いようで遠い)
記述方法があるため別途調べること

####クリップボード
・左クリックの範囲指定だけでクリップボードにコピーする
・コピー時に範囲指定を解除しない
にチェックを入れるとteratermの初期設定と同じような操作感になる

#####マウス関連
・マウスホイールのヌルヌル動作を無効にする
にチェックを入れた方が個人的には良い

#よく使うコマンド
####ウィンドウ生成 / 削除

- cntl + shift + → / cntl + shift + ↓
ウィンドウの右/下に新しい接続先を出す

- cntl + shift + ↑
表示されている接続先を自動で整列する
この時、各ウィンドウの大きさと配置が再設定される点に注意
繰り返し実施することで異なるパターンを表示していく

- cntl + F4
選択中の接続先を閉じる

####ウィンドウ移動

- cntl + ↑
選択中の接続先の表示位置を変更する

- alt + ↑ / ↓ / → / ← 
別の接続先にカーソルを移動する

私が使用するコマンドはこのくらい。

#小ネタ
ポートフォワードを使用して接続する際に
中継サーバの接続も表示されてしまうためウィンドウの整列をしたときに邪魔になる。
なので、あらかじめ別でRloginを起動し、中継サーバとの接続をしておくことで
新しく中継サーバの接続がされることなく目的の接続先だけをだすことが出来る。

#まとめ
Rloginは、慣れるととても便利。
KotlinでNullPointerExceptionを起こす方法

Kotlinいいですよね。色々おいしいところはあると思いますが、NullPointerExceptionが起きにくいのが個人的には一番好きです。

ただ、Javaでメモリーリークが完全になくなったわけではないのと同様に、おかしな書き方をすればヌルポを起こすことができます。反省と備忘録を兼ねてメモしておきます。

## 実際のコード

```Kotlin
class First {
    private val second : Second = Second(this)
    fun hello() = second.hello()
}

class Second(private val first: First) {
    init {
        first.hello()
    }

    fun hello() = print("hello")
}

fun main() {
    First()
}
```

こんな風にFirstクラスへの参照をSecondクラスに渡し、Secondのinitが終わる前にFirstからSecondを参照すると、当然初期化が終わっていないのでNullPointerExceptionにこんにちはできます。

あとJavaのライブラリを呼ぶ時も気を付けないといけないですよね。こちらが原因のNullPointerExceptionも前やったことがあります。https://kotlinlang.org/docs/reference/java-interop.html
How to notify alert to slack - Prometheusのalertmanagerでslackに通知する

# Overview

Prometheusのalertmangerを使うことでprometheusで取得しているデータについて
通知を行うことができる。

ただし、[こちら](https://prometheus.io/docs/alerting/notification_examples/)の通りに設定を行っても
通知自体はしてくれるが、メッセージが表示されない。

```rules.yml
groups:
  - name: InstanceDown
    rules:
    - alert: InstanceDdown
      expr: up == 0
      for: 30s
      labels:
        severity: critical
      annotations:
        description: '{{ $labels.instance }} of {{ $labels.description }} has been down for more than 1 minutes.'
        summary: 'Instance {{ $labels.instance }} down'
```

```alertmanager.yml
global:
  resolve_timeout: 5m
  slack_api_url: 'https://hooks.slack.com/services/hogehogefugafuga'

route:
  group_by: ['alertname','job', 'monitor']
  group_wait: 10s
  group_interval: 10s
  # repeat_interval: 1h
  routes:
    - receiver: slack-notifications
      match:
        severity: critical
  receiver: blackhole

- name: slack-notifications
  slack_configs:
  - channel: '#alerts'
    # Alertmanager templates apply here.
    text: "<!channel> \nsummary: {{ .CommonAnnotations.summary }}\ndescription: {{ .CommonAnnotations.description }}"
```
summary, descriptionともに見事に空になる。

## 何故そうなっているか

[こちら](https://github.com/prometheus/alertmanager/issues/250)にやりとりが記載されているが
要するに「Slackをはじめとするチャットツールへの通知は.Common.Annotationsを渡してないよ」とのこと。


## どうすれば良いか

alertmanagerのtitle, textを下記のような形で色々捻る。
GoTemplateで書けば良いのだが、難しいので[これ](https://juliusv.com/promslack/)を使う。
分かりづらいが要するにLabelを展開して色々入れてるだけ。
ただし、rulesの方で.Annotations.description　を使っているのでそのまま .Annotations.descriptionを使えば良いような気がする。


ただし、.Annotationsはより広範囲に作用するので慎重に扱え。とも書いてあるので注意深く推移を見守る必要がありそう。
スケーラビリティの五つの禁忌

# Intro
「成長するためにすべきでないこと」という質問は、「成長する方法」という質問よりも重要です。これから話すことのほとんどは、馴染みのあるシンプルなものに見えるかもしれません。しかし、プロジェクトのスケーリングを非常に複雑にしているのはまさにこちらの問題です。

# ゴールデンハンマー
この概念は、アメリカの格言から来ています。

`あなたが持っているすべてが一つのハンマーである場合、他のすべては釘のようにしか見えない。`

多くの開発者は、このアイデアの人質であり、あらゆるソリューションに同じテクノロジーを使用しています。適切じゃないテクノロジーを使用して問題を解決しようとすることは、開発における最悪の間違いの1つです。

良い例は、MySQLの代わりにRedisストレージを使用して、ユニークな値をカウントすることです。これは、2つの場合のリソースが数千または数百万回異なる場合の例です。

使用とゲームを混同しないことが重要です。最初の遅いリクエストが出た時は、データベースを変える必要がありません。最適化する必要があります。主なことは、さまざまな技術によって解決されるタスクの交差が非常に大きいということを忘れないことです。

# 泥の塊

アプリケーション内でいくつかの悪い決定を下すことはそれほど悪くありません。アプリケーション全体を完璧にしようとするのが最悪です。普段最初から完璧にアプリケーションを実装しようとする開発者は、当初よ​​りもさらに悪いソリューションを生み出してしまいます。

なぜこれが起こっているのですか？アプリケーション、特に成長中のアプリケーションは、進化する生物です。問題は一時的なもので、一部は1日でどうでも良くなるものもあれば、数年後にはどうでも良くなるものもあります。「リファクタリングして書き直すぞ！」という試みは、ほとんどの場合失敗につながります。これは、設計時には誰も未来を予測できないためです。

`その結果、泥の塊が別の泥の塊に変わってきます。`

泥の塊は避けられません。しかし、それを効果的に管理し、システムへの影響を減らす方法を学ぶことができます。マイクロサービスは良いアプローチです。

# ヒーロー

多くの人は、チーム内のすべての問題の解決を引き受ける「ヒーロー」の存在に気づいています。 このアプローチは拡張性がなく、非常にリスクが高いことは明らかです。

この問題の良い解決策は自動化です。

`あなたのヒーローがロボットなら、それほど怖くはありません。`

そして、プロジェクトの成長の過程では、常に少なくとも2人の開発者が関わるようにしてください。信頼性が高く便利です。

# 非自動化

開発の真実は、タスクの量がリソースの量を10倍くらい超えていることです。人間は心理的にできるだけ多くの問題を解決しようとしています。しかし、最終的には、私たちは簡単で緊急なタスクの罠に陥ります。それらはより速くより多く解決でき、多くの作業が行われているという感覚を生み出しています。

`十の簡単なタスクは、一つの大規模で複雑なタスクよりも多くの作業の印象を与えます`

自動化は大きな成果をもたらし、チームの生産性を数十倍に高めます。開発者が優れているのは、顧客向けのプログラムを開発できるだけでなく自分の仕事を自動化することもできるからです。

自動化を元にして成長するには計画と振り返りが必要です。振り返る時はどの作業を自動化できることが分かるので、その後計画を立てて分かったことを実現することできます。

再自動化の罠に陥らないことが重要です。何らかのアクションを1-2回しか実行しない場合、これは自動化に該当しなそうなアクションです。

# メトリックを測定しないこと

モニタリングはテストと同様に犠牲にされてしまうことが多いです。まあ、それは理解できます。何かを測定するよりも、既知の問題を修正した方が良いです。

`バグを修正することは即座の結果であり、仕事を測定する方法を学ぶことは長期的な結果です。`

具体的にどこをモニタリングすべきなのはそう重要ではありません。これは、CPUの使用率やDBのリクエスト数であるかもしれません。もしくは、商品の閲覧数やカートに追加された回数です。主なことは、ビジネスに不可欠なすべてのイベントを測定および観察することです。そうして初めて、いつでも2つの質問に答えることができます。

`現状順調か？`
`そうでない場合、正確に何が悪いのか？`

この質問に答えれることで対応も可能となるはずです。

# TL;DR

一連の単純なルールに従えば、成長できるシステムの構築はそれほど複雑なプロセスではありません。

- タスクに該当しないテクノロジーを使わないでください。
- 完璧なシステムを構築しようとせずに、変更と簡素化に焦点を合わせてください。 ある時点でマイクロサービスを使用することを考えてください。
- チーム内のヒロイズムを避けてください。
- バカな仕事に時間を使わないように自動化してください。
- 重要な指標を測定して、現状を把握するようにしてください。
Linuxを研修で学ぶ

##Linuxを今度こそマスターしたいと思いませんか?

Linuxをマスターしたいけれどマスターできなくていまだにターミナルなどを使いこなせないという方は実はいると思います。

実際私も業務で使うまではVimエディタなどが使いこなせずずっとnanoエディタを使っていたくらいです。

これも周知の事実ですが**クラウド環境など**はLinuxが多いにもかかわらず企業にはWindowsの管理者しかいないことが多いです。

結果、Linuxサーバー上の管理がわからず**サイトが落ちたときにどうしていいかわからない、バックアップなどの適切な処置がとれていなくて大切なウェブ上の資産が消えてしまう**

といったことが危惧されています。

##マスターするためには研修受講が最も手っ取り早い！

Linuxをマスターするためには専門家から教わるのが最も手っ取り早く効果的だと思います。

以下に研修事業者を挙げておきます。

|事業者名|研修名|期間|価格(※2019/12現在)|リンク先|
|---|---|---|---|---|
Linuxアカデミー|Linuxシステム管理|2日間or3日間合計15時間|￥66,000|[リンク](https://www.linuxacademy.ne.jp/biz/network/)
トレノゲート|Linuxシステム管理入門|3日間|￥148,500|[リンク](https://www.trainocate.co.jp/reference/os/linux.html)
CTC教育サービス|Linuxの基本操作を体で学ぼう|2日間|￥70,000|[リンク](https://www.school.ctc-g.co.jp/course/LI30.html)
NECマネジメントパートナー|UNIX/Linux基礎1 -基本機能とコマンド-|3日間|￥82,500|[リンク](https://www.neclearning.jp/courseoutline/courseId/LX014/)
Winスクール|Linuxサーバーコース|5日間から15日間|￥120,000～￥358,000|[リンク](https://www.winschool.jp/corporate/linux.html)
Linuxマスター|リナックスマスター２日間集中セミナー|2日間|￥59,800 |[リンク](https://www.linuxmaster.jp/2010/08/centos55.html)


##一部研修は企業しか受講できない

一部研修は企業の従業員むけのため個人での受講を受け付けていません。注意が必要です

##さいごに
Linuxのスキルは今後もっと必要になります。この際に2日や3日時間を取り体験型の研修を集中的に受講することをおススメいたします。
jsのloop処理速度実験（GAS上）

When I experimented what was the fastest in the JavaScript loop, "for" was the fastest!

```js
function getArray() {
  var array = []
  for(var i=1; i<=1000000; i++) {
    array.push(i)
  }
  return array
}

function test() {
  var array = getArray()
  testtest(array, forTest)
  
  testtest(array, forEachTest)
  
  testtest(array, mapTest)
  
  testtest(array, for2Test)
  
  testtest(array, whileTest)
}

function testtest(array, callback) {
  var start = new Date()
  callback(array)
  var end = new Date()
  var span_sec = (end - start)/1000
  Logger.log("処理時間は " + span_sec + " 秒でした" );
}


function forTest(array) {
  var l = array.length
  for(var i=0; i<l; i++) {
  }
}

function forEachTest(array) {
  array.forEach(function(i, e) {
  })
}

function mapTest(array) {
  array.map(function(e, i) {
  })
}

function for2Test(array) {
  for(var i in array) {
  }
}

function whileTest(array) {
  var i = array.length
  while(i > 0 ) {
    i--
  }
}
```

result

```
[19-11-29 15:20:48:459 JST] forTestの処理時間は 1.197 秒でした
[19-11-29 15:20:49:823 JST] forEachTestの処理時間は 1.364 秒でした
[19-11-29 15:20:51:461 JST] mapTestの処理時間は 1.637 秒でした
[19-11-29 15:20:52:912 JST] for2Testの処理時間は 1.451 秒でした
[19-11-29 15:20:54:404 JST] whileTestの処理時間は 1.491 秒でした
```
VSCodeでPHP+Vagrantのデバッグ環境を構築する

# 背景・動機

- デバッグ作業をする際にvar_dumpなどを使って出力していた。
- 場合によっては20個くらいvar_dumpするので、かなり非効率。
- マスターのソースコードに消し忘れたvar_dumpが混入している。

XDebug使えば？と言われて使ってみたらかなり便利で世界が変わったので、共有したいと思い投稿しました。

# 前提

- Vagrantで起動されたPHP環境がある。
- XDebugはインストール済み。
- VSCodeにPHP Debugプラグインがインストール済み。

# 手順

1. Vagrantのphp.iniファイルでXDebugを有効化
2. VSCodeのlaunch.jsonにデバッガの設定を追加
3. Chrome拡張をインストール
4. ブレークポイントをはる
5. デバッグモードにする
6. アプリケーションを起動

## 1. Vagrantのphp.iniファイルでXDebugを有効化

php.iniファイルに以下の設定を追記します。
追記後は`service httpd restart`しましょう。

```
xdebug.remote_enable=1
xdebug.idekey="vscode"
xdebug.remote_host=192.168.33.1
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_connect_back=1

xdebug.remote_log=/tmp/xdebug.log
```

## 2. VSCodeのlaunch.jsonにデバッガの設定を追加

VSCode左メニューのデバッグアイコンをクリックし、左上の歯車アイコンをクリックするとjsonファイルが開くので、以下のように追記します。

```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9000,
      "serverSourceRoot": "/path/to/app",
      "localSourceRoot": "${workspaceRoot}"
    }
  ]
}
```

## 3. Chrome拡張をインストール

[Xdebug helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?hl=ja)

※対象のアプリケーションがWebAPIなどの場合は、GETパラメータに`XDEBUG_SESSION_START=vscode`を追加することで、この手順を省略できます。

## 4. ブレークポイントをはる
<img width="381" alt="スクリーンショット 2019-11-28 15.46.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/faeba2eb-d49d-87d0-7dd3-ad62904eaf73.png">

- VSCode上で任意の行番号の左をクリック。

## 5. デバッグモードにする
<img width="319" alt="スクリーンショット 2019-11-28 15.46.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/8691dfcf-ed84-ba6e-fff7-26b1cdd15b52.png">

- 左メニューの虫アイコンをクリックし、デバッグ右の▶︎をクリック。

## 6. アプリケーションを起動
<img width="333" alt="スクリーンショット 2019-11-28 15.47.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/ed600d6b-421a-1528-5d60-c970ac1c2a8c.png">

- アプリケーションを起動すると、ブレークポイントをはった行で実行が止まり、変数の中身が一覧されます。

デバッガ便利なので是非使ってみてください。