OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleCTF #beginners/pwn-moar

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c8b655e0-7575-4749-8305-bb074e58d8ca.png)

#問題

https://capturetheflag.withgoogle.com/#beginners/pwn-moar

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9e2ccbb9-cafc-f6ef-3f0a-ac9e30d28726.png)

#解いてみた

今回は添付ファイルはありません。
問題に書かれている通信先にアクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/af68e54e-76db-84e5-8ad1-1d932412d8ba.png)

socatのマニュアルページ？
この中のどこかにflagがあるのか？
とりあえず検索したいけどやり方がわからないのでhでヘルプ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/48a76fcd-d8d9-67d0-522a-eab6a70097af.png)

search的な単語が見つからなかったのでたぶん検索はできなさそう。。。
zで1ページごとにページがめくれるらしいのでこれでやるしかないか。。。

と思ったら返事が返ってこない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/47852ebd-76a0-ef45-0401-4a2f6ec520ac.png)

向こうのサーバがいけてないんでしょうか。
さくさくコマンド打たないと返事しなくなる仕様なんでしょうか。

一度Ctrl+cで脱出してから再度アクセス。
時間かかりすぎると返事が返ってこないので高速目grep。
特にflagは見つかりませんでした。。。

ネットで調べてみたところLESSコマンド使っている間は!commandでコマンドが実行できるらしい。
どこかにflag.txtみたいなファイルがあって、それを見つける問題ということでしょうか。

とりあえずlsやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/44a9540e-7ffd-74e3-d4a6-ea2048650878.png)

すごいですね。こんなことができるとは。

早い話

```
grep -r "CTF{" /
```

をやれば終わりそうな気がしてきたのでやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/41698141-00db-23ab-617f-c9d55504121e.png)

途中でkillされてしまった。。。
負荷が重いプロセスはやられる仕組みなのか。
全体を一気にgrepするのは無理だとわかったのでもう少しフォルダを絞ってやってみます。
home、var、etc、usrあたりがよく使われるところですかね？

まずはhomeから。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/7527ae3a-2215-c349-7342-e25036019539.png)

見つかったｗ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/dbba5914-dafe-a97e-1120-a1394d7a0332.png)
Engineering Manager Meetup #4 勉強会メモ


# 概要

[Engineering Manager Meetup #4](https://engineering-manager-meetup.connpass.com/event/116235/)

> Engineering Manager Meetup はエンジニアリングマネージャやエンジニアリング組織、その周辺について関心のある方々が語り合い、知見や悩みを共有できる場です。
エンジニアリングマネージャと聞いたときにどういう役割を思い浮かべるでしょうか。
私が知る限りだと日本のソフトウェア業界で統一された定義・見解を見ることはほとんどありません。会社や人それぞれによって思い描く姿やその実態・運用が異なり、それぞれの創意工夫や悩みがあるのではないかと思います。
本イベントはエンジニアリングマネージャやエンジニアリング組織、その周辺について関心のある方々が語り合い、知見や悩みを共有できる場を目指します。

# 各発表

## [エンジニアチームビルディングジャーニー](https://www.slideshare.net/yusukehisatsu/ss-130125728)

- 成功の循環
 - 関係の質 → 思考の質 → 行動の質 → 成果の質 → 関係の質・・・
 - 悪いサイクルではなく、良いサイクルを回すことを目指す
- ビルディングジャーニー
 1. 外部環境を整える
     - 関係の質を上げる
     - 外部環境による無駄な作業を減らし、内部環境の改革に集中できる
 2. 内部環境を整える
     - 関係の質、思考の質、行動の質を上げる
     - メンバーからの提案が増え、メンバー間の関係性がよくなる
 3. 成長サイクルを回す

- 外部環境を整える
 - 一時的に案件を受けられなくなるが、長期的なメリットを説明し、チームの改革を宣言する
 - 案件依頼プロセスを統一とチーム状況の可視化で、業務負荷の調整
 - 技術的負債解消の定量的メリットの説明
- 内部環境を整える
 - チームの指針を共有し、メンバーへの信頼、期待を「口にする」
 - 心理的安全性を確保する
 - 1on1を通して、モチベーションを刺激する　モチベーション3.0
- 成長サイクルを回す
 - メンバーに合わせた成長へのステップを与える
 - 一定のレベルに来たら、自由にやらせる


- モチベーション3.0に基づく指針
 - 自立性タイプ　自分の人生を自ら導きたい
  - Whyをインプットして、WhatやWhenを自由度高くできるようにする 
 - マスタリー(熟達)　自分にとって意味のあることを上達させたい
  - Why/What/Whenをインプットして、極上のHowを期待する 
 - 目的　自分よりも大きいこと、自分の利益を超えたことのために活動したい
  - Whyをインプットして、Whatを考えてもらう

## [まだ何も始めてない会社での第一歩](https://www.slideshare.net/KouNakajima/ss-130131061)

- 受託開発 & 客先常駐
 - 常駐は各現場へ
 - 受託開発は社内へ

- 常駐勤務の人間と社内勤務のメンバーそれぞれで不満が出る
 - コミュニケーション不足が原因
- 解消のため、1on1と振り返りの実施
 - 1on1で電子工作をやる(?)
 - 言いたいことを言うきっかけに 

## Engineering Manager Job description

- EMのjob descriptionの作成

- Job descriptionとは？
 - 成果に基づいて賃金を決定するため(職務給)、職務を明確にし内容を明確にするもの
- 日本では、職務と職位が分離された職能給が多く採用されている

- EMのJob descriptionの共通化の壁
 - 組織の依存度が高い
 - エンジニアリングマネージャーという範囲が広い

## [1つの大きなプロダクトをみんなで作る](https://speakerdeck.com/tunepolo/develop-1-huge-product-with-multiple-teams)

- 30人前後の開発プロジェクト
 - 複数のコンポーネントから構成される
- 最初は少ない人数で始めてたのに、人数の増加
- 最初期
 - 機能・役割でチームを分ける
 - 機能追加と技術負債返却チームになった
 - 新機能をどのチームで行うかもめる
- 職能ごとにチームを分ける
 - コードは増えるが、他のチームが遅れると、機能がリリースできない
 - 会議や調整業務が増える
- 各チームが自律的に動き、協力し、1つのプロダクトを開発することを目指す
 - 複数チームで設計がぶれ、バグやデグレが起こりやすくなる
- フィーチャーチームを構成し、チーム名をつける
 - チーム単独で顧客に価値が提供できる体制にする
 - 設計レビューをチームで実施
 - コードのコンポーネントに監督者を置き、チェックをする (コードメンター)
 - 品質担保はチームで行う

- LeSS: Large Scale Scrum




## [開発部として良かった/うまくいかなかった取り組み、そして「評価」の難しさ](https://speakerdeck.com/mochizukikotaro/em-meetup-20190201)


## OST

時間の都合により、残念ながら参加できなかったので、特にありません。
Google Cloud SDKの認証方法

# はじめに
Google Cloud SDKの認証の備忘録です。

# Cloud SDK のインストール
````
$ curl https://sdk.cloud.google.com | bash
````
→いろいろ聞かれますが基本的にyesにしていけば大丈夫です。

````
$ exec -l $SHELL
$ which gcloud
````
→PATHを通します。

#認証
````
$ gcloud init
````
`You must log in to continue. Would you like to log in (Y/n)?  y`

どのアカウントでログインするか聞かれるので、任意のgoogleアカウントを選択しログインします。

<img width="1440" alt="スクリーンショット 2019-02-02 21.56.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/310688/bb3bcfd6-bc39-0d48-86d6-7736da4fca1b.png">

→完了です。

Cloud SDKの詳細は[ここ](https://cloud.google.com/sdk/downloads?hl=ja)を参照にしてください。
Synology DS218jのDDNS更新をタスクスケジューラーで行う

現状、pathconf: Permission deniedというエラーがメールで通知されてきて不安なのだが、mydnsのLOG INFOをみるとちゃんと更新されているので、大丈夫みたい……。
↓
その後、MyDNS.JPはちゃんと更新されているのに対してNo-IP.comは更新されずにexpireすることが判明。何が違うの……？？？


# はじめに
Amazonで人気のDS218jを導入しテケトーに使っていたが、「外部アクセス」機能を使ったDDNS更新がうまく行っていないことに気がついた。どうも、「外部IPアドレスが更新されないと通知しない」ようで、更新間隔が空きすぎてDDNSサービス提供者にexpireさせられるというお約束感のある問題のようである。
というわけで、MyDNS.JPとNo-IP.comの更新を「タスクスケジューラー」機能でやってみた。

# MyDNS.JPのDDNS情報を更新する
（わざわざ「カスタマイズ」で外部アクセスのDDNS設定を書いたのに、更新がうまくいかなくてしょんぼりしたワケで。）

HTTP-BASICアクセスなら、更新したいIPアドレス情報を持っていなくても、ユーザ情報だけ持ってアクセスすればアクセス元のIPに更新してくれる親切仕様。（つまり、ルータの下にDSを設置していて外部IPの取得に一手間いる場合に簡単。）
「タスクスケジューラー」で「作成」->「予約タスク」->「ユーザー指定のスクリプト」、「タスク設定」の「ユーザー指定のスクリプト」にwgetコマンドを書いて終了。よくあるシェルスクリプトのように、一行目にbashとかを書く必要も無し。（念のためログファイルの追記出力を書いたが、メールで通知される仕組みがあるからそれで十分な気もする。）

```
wget --http-user=USERNAME --http-password=PASSWORD http://ipv4.mydns.jp/login.html -a logfile
```

# No-IP.comのDDNS情報を更新する
no-ip.comのページからは情報が見つからなかったが、URLアクセスでIP更新が可能。外部IPアドレスの取得はcurlで。これが最良の方法なのかどうかは知らない。

```
ip=`curl ifconfig.moe`
wget "http://dynupdate.no-ip.com/update.php?username=USERNAME&pass=PASSWORD&host=HOST&ip=${ip}" -a logfile
```

# 補足
sshアクセス可能にしておいて、閲覧可能なパスにログを吐けばミスに気付きやすい。
そうでなくてもメールでレポートが飛ぶように設定できるけどさ。

# 参考文献
* [CentOS7でcronを使ってmydnsのDynamicDNSを更新する - Qiita](https://qiita.com/s-suefusa/items/adad003b83cf9ad1a8b8)
* [nlog(n): no-ip.com を wget で更新](http://nlogn.ath.cx/archives/001418.html)
VirtualBox 6にCentOS7をインストールする際にマウスのカーソルが効かない

macOSのVirtualBox 6.0でCentOS7をインストールする際、インストーラーの画面に表示されるマウスカーソルが消える、または効かないことがあったので、備忘録として回避策を記載します。

仮想マシンの設定を次のようにする。

- システムの「ポインティングデバイス」を「USBタブレット」にする
- ディスプレイの「Graphics Controller」を「VBoxVGA」にする

他にも回避策があるかもしれませんが、取り敢えずこれでうまくいっています。
Vagrantでローカルファイルと仮想環境の同期

前提： VirtualBoxとVagrantを導入済み

# ローカルと仮想環境のファイルと同期させたい

設定はVagrantfileの`config.vm.synced_folder`にパスを設定するだけ!

※typeの設定はvirtualboxにしておかないと一方通行編集になっちゃう。

```:Vagrantfile
# これを追記or編集
config.vm.synced_folder "ローカル（ホスト）のパス", "仮想環境の絶対パス" , type: "virtualbox"

# 例1
config.vm.synced_folder "/Users/testuser/projects/app", "/home/vagrant/app" , type: "virtualbox"

# 例2
# （vagrantfileのあるローカルディレクトリの1つ上の階層以下を仮想環境の/var/www/current以下共有）
config.vm.synced_folder "../", "/var/www/current" , type: "virtualbox"
```

## 再起動

`vagrant reload`などで再起動して新規ファイル作ったりしてテストしてみる！

## 参考

[windowsユーザがVagrantの共用フォルダを設定しようとした話](http://cot-cotton.com/server/2018/05/post-255/)
http://tech.respect-pal.jp/vagrant-synced_folder-type/
Racketでunreadできるストリーム(port)を書いた

Racketでunreadできるストリーム(port)を書きました。字句解析をしたいというニーズがあり、文字数制限を付けてunreadできるポートがあると便利だなーと。文字数制限を付けなければファイルを一括読み込みしたりランダムリードしたりすればいいわけですから。

port-with-unread%というクラスで実装しています。というのは、Racketにはたくさんの定義済み関数があり、それらと名前が被らないようにするにはクラスにするのが都合がいいと判断したためです。このクラスはread-charとunread-charしかできませんが私のニーズとしてはそれで十分です。

unreadを文字数制限付きで実現するためにはリングバッファというデータ構造が便利です。リングバッファを実現するには、循環リストやring-bufferパッケージを用いた方法なんかもあるわけですが結局vectorで実装するのが一番簡潔だったのでそれを採用しました。

### 来歴

2019.2.2 記事公開
2019.2.3 斎藤敦志さんから「unreadable-port」が「リードできないポート」という意味になるというご指摘があり、「unreadable-port」を「port-with-unread」に変更

# ソースコード

```port-with-unread.rkt
#lang racket/base
(require (rename-in racket (read-char racket-read-char)))

;
; アンリードできるストリーム(port)
;

(define port-with-unread%
  (class object%
    (init-field port bufsize)
    (super-new)
    
    (define v (make-vector bufsize #\0)) ; リングバッファ
    (define wp 0)
    (define rp 0)

    (define/public (read-char)
      (if (= rp wp)
          (let ((c (racket-read-char port)))
            (vector-set! v (remainder wp bufsize) c)
            (set! wp (add1 wp))
            (set! rp (add1 rp))
            c)
          (begin
            (when (> (- wp rp) bufsize)
              (error (string-append "port-with-unread% read-char: "
                                    "バッファサイズを超えています")))
            (let ((res (vector-ref v (remainder rp bufsize))))
              (set! rp (add1 rp))
              res))))

    (define/public (unread-char)
      (when (<= rp 0)
        (error "ポートの先頭より前にunreadすることはできません"))
      (when (>= (- wp rp) bufsize)
        (error (string-append "port-with-unread% unread-char: "
                              "バッファサイズを超えています")))
      (set! rp (sub1 rp)))))

(define a (open-input-string "ABCDEFGHIJ"))
(define b (new port-with-unread% [port a] [bufsize 3]))
```

# 実行結果

![001.png](https://qiita-image-store.s3.amazonaws.com/0/64229/a2ae467b-59d8-a577-4ac4-7cbda4c42c8d.png)
FlutterでPassword用のTextFieldを実装する

スマホアプリのパスワード入力欄でありがちなパスワードの表示/非表示を切り替えられるTextFieldをFlutterで実装する方法です。

```dart
TextField(
    obscureText: !_showPassword,
    controller: _passwordTextController,
    decoration: InputDecoration(
        labelText: "Password",
        suffixIcon: IconButton(
            icon: Icon(_showPassword
                ? FontAwesomeIcons.solidEye
                : FontAwesomeIcons.solidEyeSlash),
            onPressed: () {
            this.setState((){
                _showPassword = !_showPassword;
            });
            },
        )),
    )
```

`obscureText`プロパティ で パスワードの表示/非表示を指定することができます。
`decoration` プロパティの `suffixIcon` でTextFiledの右側にアイコンを設置できるので、そのボタンをタップした時に ステートを変更することでパスワードの表示/非表示を切り替えられます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/18273/fda98cea-0262-c9b5-644f-b462a84bfae2.gif" width="300px">
WebサービスやWebサイトがGoogleアドセンスに通らない時に出来る対処法

## 厳しいGoogleの審査
WebサービスやWebサイトの収益化の手段として、Googleアドセンスは第一候補にあがると思います。
しかし、時期によってがアドセンスの審査が厳しく通らないこともあると思います。

実際に、僕も2018年に簡単に合格したWebサービスと同じぐらいのコンテンツ量のWebサービスが2019年には通らないという事態に遭遇しました。
## WebサービスやWebサイトがGoogleアドセンスに通らない時に出来る対処法
そこで紹介したい対処法があります。
それは、**以前に合格したドメインのサブドメインでサービスを運営するという方法です。**
一度合格したドメインのサブドメインには審査を経ずにアドセンスを貼ることが出来ます。(管理画面からサブドメインを追加する必要があります。)


「一つもアドセンスに合格したドメインがないよ」という方もいらっしゃると思います。
その場合は、**独自ドメインでブログを始めましょう。**
公序良俗に反する内容でない限り、地道に記事を増やして行けばアドセンスに合格するはずです。
一つ合格してしまえば、サブドメインを使うことで多数のサイトにアドセンスを貼ることが出来ます。
## まとめ
1サイトでも良いのでアドセンスに合格しておくと便利です。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
DockerでEC2、ECS、EKSの運用想定まとめ

簡単に(後ほど整える)

## EC2 
- 1つのサーバーに複数コンテナ
- 1サーバーの中に1webサービスがある。ただそれだけ。
- 同じサーバー内なので複数コンテナはport管理が必要
- RDSとかELBとか使ってたら1EC2サーバーにはアプリケーションコンテナだけ
- ローカルかデプロイサーバーを立ててあらかじめデプロイ先のインスタンスを複数起動し、デプロイツールによって複数台に展開は可能
- スケール前提のものでない or 最初の構成から増減することがなければ良
- スケールはしずらい(できるが、Dockerの範疇を超える)

## ECS
- 複数サーバーに複数コンテナ
- 複数サーバーを管理するのはECS Cluster
- サービスをタスクで起動させる(ここでいうサービスとはざっくりコンテナのこと)
- タスクの定義はコンソール上から行う
- コンソール上でdocker-compose.yml(厳密にはECS用の記法がある)定義して実行するような感じ
- ELBの設定も必要
- コンテナを動かすEC2インスタンスの起動はタスクの実行単位で勝手に割り当て生成されるので、ポートの管理が不要
- スケール前提の設定ができる

## ECS(Fargate)
- Fargateというのは要するに、実体はECSで、内部のEC2部分(インフラ層)を気にしなくて良いという所だけが違う(起動タイプが違う)
- いわゆるマネージドサービス
- なぜこのサービスができたかというと、元々のECSは、実際スケールするとなると大変だから
- どう大変かというとコンテナをスケールするとなった時、インスタンスのリソースを超えてしまう場合EC2自体をまずスケールする必要がある
- つまりEC2起動タイプ(通常のECS)の場合管理対象が増える可能性がある
- EC2起動タイプでインスタンスの監視やスケールの自動化を行いたかったら、CloudWatchやCloudformationが必要になるがFargateはそこ勝手にスケールしてくれる
- それで少しEC2起動タイプより高い
- 資金を差し置いてEC2の監視コストやリソースをあえて必要とする場合を除いてはFargateの方が良さそう

## EKS
- 複数サーバーに複数コンテナ
- EKSはECSでいうクラスターの設定やタスクの設定をもコードで管理できる
- webサービス単位でも複数管理できる
- ECSはAWSでしか使えないがEKSはそうではなく、移管もし易い
- これから作る大きいシステムで運用を捗らせたいなら使うべき
- 運用事例は日本ではまだ少ない

## 参考記事
http://www.mpon.me/entry/2017/11/19/200000
https://qiita.com/NewGyu/items/9597ed2eda763bd504d7
http://www.atmarkit.co.jp/ait/articles/1806/11/news029.html
https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=2025
https://www.aquasec.com/wiki/plugins/servlet/mobile?contentId=2854889#content/view/2854889
https://www.aquasec.com/wiki/plugins/servlet/mobile?contentId=2855092#content/view/2855092

## 雑感
ひとまずDocker化しておくこと自体はどれで運用するにしても良さそう
AutoHotkeyで閉じカッコ入力を駆逐する

物書きです。
漢字変換が終わったあとに閉じカッコを入力するのが虫酸が走るほど嫌いな物書きです。
故にAutoHotkeyを導入しました。

# AutoHotkeyとは?
キーボード周り+αの雑用を代わりにやってくれる便利屋。
スニペットツールとして使ってもよし、ホットキーを仕込んでもよし、流行りのRPAツールとして使ってもよし。
[RobocopyをGUI化してコマンドを出力](http://retla.g.hatena.ne.jp/retla/20130818/1376819707)できる。

詳しくは[Wiki](http://ahkwiki.net/Top)を見るとよし(最近更新されてない)。

# AutoHotkeyでカッコ自動化
AutoHotkeyはクリップボードを変数として管理することができる。
これを使わない手はない。

```
PasteBracket(String){ ;関数と引数を定義して
	Backup := ClipboardAll ;現在のクリップボードをバックアップ
	Clipboard := String ;引数をクリップボードに代入
	Sleep, 50 ;処理待ち
	Send,^v ;キー入力で貼り付けて
	Sleep,50 ;ここも処理待ち
	Clipboard := Backup ;バックアップを書き戻して
	Sleep,50 ;クリップボードは重いのだ、50ms待て
	Send,{Blind}{Left} ;カッコの中にカーソルを移動させて
}	 ;関数を閉じる

::kk:: ;ここでホットキーを定義
PasteBracket("「」") ;カギカッコを定義
Return ;楽しい物書きライフを。
```

# その他
ホットキーを"mk"に、カッコ部分を"()"にすれば丸カッコを自動で入力できる。
カーソル入力の部分を消した関数を作り、stringに定型文を定義すればスニペットツールの完成だ。

たまにIMEの変換が発動したりするが、そういうときは落ち着いてEscを一度押そう。
そしてまた入力すれば、きっとカッコが出てくる。

そのうち別のAutoHotkeyネタを書くはず。予定は未定。

**追記　カッコ挿入関数を大幅に改修したので、[新しい記事](https://qiita.com/haoblackj/items/21bfcba44017ff1a3b62)を書きました。**
[Python]スライス操作でlistを逆順にする

# listの逆順を取得する
Pythonでは[::-1]でリストの逆順を取得できます。

``` python
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list
[1, 5, 2, 3, 4]
>>> num_list[::-1]
[4, 3, 2, 5, 1]
```

# 解説
Pythonではlistなどのシーケンスオブジェクトに対してスライスと呼ばれる操作で範囲を指定して要素を選択できます。スライスは以下のように3つの値(start, end, step)をコロンで区切って指定します。

``` python
[start:end:step]
```

startは指定する範囲の先頭、endは末尾(末尾は範囲に含まれない)、stepは間隔であり、それぞれを指定すると以下のように動作します。

``` python
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list[1:3:1] # 1番目から3番目までを1個間隔
[5, 2]
>>> num_list[0:4:2] # 0番目から4番目までを2個間隔
[1, 2]
>>> num_list[0:5:2] # 0番目から5番目までを2個間隔
[1, 2, 4]
>>> num_list[1:5:2] # 1番目から5番目までを2個間隔
[5, 3]
```

このstart、end、stepはそれぞれ省略可能であり、省略すると以下のように扱われます

- start : オブジェクトの最初の要素
- end : オブジェクトの最後の要素
- step : 1

``` python
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list[:4:1] # startを省略することで最初の要素から選択
[1, 5, 2, 3]
>>> num_list[1::1] # endを省略することで最後の要素まで選択
[5, 2, 3, 4]
>>> num_list[1:4:] # stepを省略することで1個間隔で選択
[5, 2, 3]
>>> num_list[1:4] # stepを省略する場合は2つ目のコロンを省略可能
[5, 2, 3]
```

また、start、end、stepにはそれぞれ負の値が指定可能であり、start、endはオブジェクトの末尾から数えた位置、stepは末尾から逆順で指定できます。

``` python
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list[-4:] # 末尾から4番目(2番目)から選択
[5, 2, 3]
>>> num_list[:-2] # 末尾から2番目(4番目)まで選択
[1, 5, 2]
>>> num_list[3:1:-1] # 3番目から1番目までを逆順に選択
[3, 2]
# stepが負の場合はstartとendの大小関係が逆になるので注意
```

なので、この記事の最初のスライス操作は__startとendをそれぞれ省略し、stepが-1なので逆順に1つ間隔でlistからlistを選択する操作__になります

``` python
>>> num_list = [1, 5, 2, 3, 4]
>>> num_list[::-1]
[4, 3, 2, 5, 1]
```

ただし、スライス操作で選択したリストは別のオブジェクトとして扱われます。なので、元のオブジェクトには影響を与えません。

``` python
>>> num_list = [1, 5, 2, 3, 4]
>>> id(num_list)
4513463240
>>> id(num_list[::-1])
4513365768 # 別のidになっている
>>> num_list # 逆順のlistを選択したが順番は変わっていない
[1, 5, 2, 3, 4]
>>> num_list[:] # start、end、stepを省略して同一な別オブジェクトのlistを選択
[1, 5, 2, 3, 4]
# start、end、stepを全て省略したスライスはshallow copyとして使うことができる
```
【微分積分】導関数の定義

# 定義
$y = f(x)$, $x=a$における微分係数（変化量）は次の式で定義される。
※変数はaからa+hまで変化

```math
f'(a) = \lim_{h \to 0}\frac{f(a+h)-f(a)}{h}
```
------

例： $f(x) = x^2$の場合

xの変化量は

```math
(a + h) - a = h
```
yの変化量は

```math
(a + h)^2 - a^2 = 2ah + h^2
```
なので、式に当てはめると

```math
\lim_{h \to 0}\frac{2ah + h^2}{h} = \lim_{h \to 0}{2a + h}
```

よって変化率は2a、これを変数xとし、

```math
微分係数：f'(x) = 2x
```
となる。
Rとdplyrでピボットテーブル

エクセルのピボットデーブルって便利ですよね。
Rで同じようなことやろうと思うとちょっと面倒、、、と思っていましたが、dplyrなら簡単でした。
エクセル同様、何も考えずにピボットテーブル的なものが作れます。

```r
library(tidyverse)  #まずはtidyverseを読み込む
```

```r
# 出土遺物の一覧表をイメージしたデータフレームを作成
a<-c("中期","後期","晩期","晩期","中期","後期","後期","晩期","中期","晩期")
b<-c("厚沢部","江差","江差","厚沢部","江差","厚沢部","江差","江差","厚沢部","江差")
d<-c(18,21,6,32,8,15,2,21,17,7)
data<-data.frame(時期=a,地域=b,数量=d)

head(data)  #こんな感じのデータ
   時期   地域 数量
1  中期 厚沢部   18
2  後期   江差   21
3  晩期   江差    6
4  晩期 厚沢部   32
5  中期   江差    8
6  後期 厚沢部   15
```

group_by()　%>%　summarize()　%>%　spread()　とデータを渡すとエクセルのピボットテーブルと同じものができます。

```r
data%>%
    group_by(時期,地域)　%>%　#goup_by()で時期と地域でグルーピング
    summarize(出土点数=sum(数量))　%>%　#summarize()　で時期と地域ごとの出土点数を合計する
    spread(地域,出土点数)　#spread()で時期を縦軸、地域を横軸にとって出土点数の合計を一覧にする

# A tibble: 3 x 3
# Groups:   時期 [3]
  時期  厚沢部  江差
  <fct>  <dbl> <dbl>
1 後期      15    23
2 中期      35     8
3 晩期      32    34
```

summarize()を平均（mean()）とか個数（count = n()）とかにしてやれば何でもできる。

## 補足

それぞれのプロセスでデータがどのように変形されているかをみてみる。

```r
## 中期の厚沢部、後期の江差、、、というようにデータをグループ化して次の関数に渡している。
## 実は見た目は元のデータと変わらない。
data%>%
    group_by(時期,地域) %>%
    head()
# A tibble: 10 x 3
# Groups:   時期, 地域 [6]
   時期  地域    数量
   <fct> <fct>  <dbl>
 1 中期  厚沢部    18
 2 後期  江差      21
 3 晩期  江差       6
 4 晩期  厚沢部    32
 5 中期  江差       8
 6 後期  厚沢部    15
```


```r
##group_by()で指定されたフィールド（地域と時期）ごとに合計を算出して「出土点数」というフィールドに格納
%>% summarize(出土点数=sum(数量))
# A tibble: 6 x 3
# Groups:   時期 [?]
  時期  地域   出土点数
  <fct> <fct>     <dbl>
1 後期  厚沢部       15
2 後期  江差         23
3 中期  厚沢部       35
4 中期  江差          8
5 晩期  厚沢部       32
6 晩期  江差         34
```


```r
##引数で「地域」を指定し、「地域」を横軸にとった一覧表が完成
%>%  spread(地域,出土点数)
# A tibble: 3 x 3
# Groups:   時期 [3]
  時期  厚沢部  江差
  <fct>  <dbl> <dbl>
1 後期      15    23
2 中期      35     8
3 晩期      32    34
```
NeDBのElectron（Nuxt）での永続化について：小さな見落とし

## 前提
自分用の小さなアプリをElectronで制作しようと思い立ちました。その際簡単なDBが欲しいと思い、導入が簡単で記事も多い[NeDB](https://github.com/louischatriot/nedb)を選択しました。その際に永続化の手順について調べたので共有します。
### 環境
- electron: ^4.0.3
- nuxt: ^2.4.2
- nedb: ^1.8.0

ElectronとNuxtの準備は出来ているものとします。
Nuxtのテンプレートだと最新版が入らないので、今回はNuxtを入れてからElectronを追加する手順で準備しました。


## NeDBの導入と永続化
先ず、NeDBをNuxtに追加します。最終的に$nedbでアクセスしたかったので、pluginsにプラグインを追加します。Electronの**getPath**を使ってユーザーデータの領域に、**data.nedb**というファイルを作成することで永続化をします。

```js:plugins/nedb.js
import path from 'path'
import { remote } from 'electron'
import Nedb from 'nedb'

export default ({ app }, inject) => {
  if (process.browser) {
    const db = new Nedb({
      filename: path.join(remote.app.getPath('userData'), './data.nedb'),
      autoload: true
    })
    inject('nedb', db)
  }
}
```

- [inject／統合された注入](https://ja.nuxtjs.org/guide/plugins/#%E7%B5%B1%E5%90%88%E3%81%95%E3%82%8C%E3%81%9F%E6%B3%A8%E5%85%A5)

### 書き込み

**$nedb**でNeDBのメソッドを呼び出して確認します。
**insert**でテストデータを書き込んできます。問題なく実行できると思います。

```vue:pages/index.vue
<template>
  ···
</template>

<script>
export default {
  mounted() {
    this.$nedb.insert({
      data: 'Hello World!'
    })
  }
}
</script>
```

### 読み込み

NeDBからデータを読み込んでみます。**find**でデータを読み込みます。docsに先程書き込んだデータが取得出来ることを期待します。
一度アプリを閉じて書き換えて再度実行してみます。

```vue:pages/index.vue
<template>
  ···
</template>

<script>
export default {
  mounted() {
    this.$nedb.find({}, function (error, docs) {
      if (!error) {
        console.log(docs)
      }
    })
  }
}
</script>
```
## 問題発生
上記で問題なく取得出来ると思ったのですが、**docs**にデータがありません。エラーも出ていません。
調べたところ

- NeDBはElectronの**renderer**側でインスタンス化？された場合indexedDBを使うようです。
- **main**側でインスタンス化された場合は、期待したとおりuserDataにファイルが作成されるようです。

indexedDBはuserDataに有るので確認したところ、userData/IndexedDBに作られているのを確認しました。ただ、なぜか読み込みが出来ていません。

### ポート番号
と、気づいた事が、IndexedDBのフォルダ名にポート番号が！indexedDBはURL毎に作られるので当然です。そこで**main.js**を確認します。

```js:main.js

const http = require('http')
const { Nuxt, Builder } = require('nuxt')
const config = require('./nuxt.config.js')
config.rootDir = __dirname
// Init Nuxt.js
const nuxt = new Nuxt(config)
const builder = new Builder(nuxt)
const server = http.createServer(nuxt.render)
//
// Build only in dev mode
if (config.dev) {
  builder.build().catch((err) => {
    console.error(err)
    process.exit(1)
  })
}
// Listen the server
server.listen()
//
const _NUXT_URL_ = `http://localhost:${server.address().port}`

···

```
- **server.listen()**

ポート番号をここで指定するのですが、空なので都度ポート番号が振られていたようです。
修正後、追加と読み込みを行ったところ無事に読み込めました。小さな見落としです。

### メインプロセスを使う
試していませんが、下記の様にメインプロセスを使う方法も有るようです。
globalというのも知りませんでした。

- https://github.com/louischatriot/nedb/issues/531#issuecomment-439599145

### IndexedDBの容量
IndexedDBはブラウザでの使用が想定されているので容量はどうなんだろうと思いググってみました。
記事によると全然心配ないみたいです。これでレンダープロセスだけで十分ですね。

- [ChromeのIndexedDB(2.0)に、限界までデータを登録してみました](http://iwatendo.hateblo.jp/entry/2018/02/15/215811)

## 参照
- [NeDB](https://github.com/louischatriot/nedb)
IFTTTを使って、Twitterにハッシュタグつきでツイートしたら、はてなブログに自動投稿する例。画像表示もインライン対応。

IFTTTを使って、Twitterにハッシュタグつきでツイートしたら、はてなブログに自動投稿する例。画像表示もインライン対応。

# はてなのメール投稿用のアドレスをゲット

メルアドは 設定 > 詳細から取得可能

こんなURL

https://blog.hatena.ne.jp/yumainaura/yumainaura.hateblo.jp/config/detail

[メールで記事を投稿する - はてなブログ ヘルプ](http://help.hatenablog.com/entry/mailpost)


# はてなの設定を、見たままモードにしておく

Twitter埋め込みのHTMLが、そのまま使えるようにしておく

![image](https://user-images.githubusercontent.com/13635059/52164053-9e572180-272e-11e9-9539-258d0f0ed6fc.png)

# IFTTTでハッシュタグつきツイートをトリガーにする<<

![image](https://user-images.githubusercontent.com/13635059/52163983-f2153b00-272d-11e9-9bca-ffd36f754dac.png)
![image](https://user-images.githubusercontent.com/13635059/52163992-0fe2a000-272e-11e9-9227-c74771a3c717.png)


# Gmail 送信をアクションにする

![image](https://user-images.githubusercontent.com/13635059/52163996-1e30bc00-272e-11e9-8046-53caf088e99e.png)

# ToAdress に はてなブログの投稿用メールアドレスを入れる




# Subject とか Text とか調整する

```

```

```
<br>
from Twitter https://twitter.com/<br>
<br>
<br>
via <a href="https://ifttt.com/?ref=da&site=gmail">IFTTT</a>


```

# 結果の例

ツイートをリプライで連鎖させていると、ひとつ親のツイートまで表示してくれるっぽい。


![image](https://user-images.githubusercontent.com/13635059/52164078-06a60300-272f-11e9-9d37-7b198f4b5088.png)
![image](https://user-images.githubusercontent.com/13635059/52164079-07d73000-272f-11e9-8c58-ae21efd98188.png)

http://yumainaura.hateblo.jp/entry/2019/02/02/205113

# はてな編集画面の例

![image](https://user-images.githubusercontent.com/13635059/52164072-ee35e880-272e-11e9-902a-83195ca9634a.png)

# はてなに投稿されたHTMLの例

![image](https://user-images.githubusercontent.com/13635059/52164069-de1e0900-272e-11e9-94c4-6a635fc1c8b7.png)

# NOTE

Gmail送信のAttachmentにTwitterの First Link を指定しても、うまく動かなかった。Twitterはそもそも画像URLの扱いが厳しそうな。

メールでMarkdownを強制指定できるかどうかは、はてなに問い合わせてみた。結果待ち。

![image](https://user-images.githubusercontent.com/13635059/52164091-508ee900-272f-11e9-8c12-9bd292487f68.png)

Markdown or はてな記法をデフォルト設定にしていて、変えたくない場合は、とりあえず、Twitter連携用の別ブログを作っておいても良いかもしれない。


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WebpackバンドルにsetImmediateがいらないときに

Webpackのビルドにあるときから`setimmediate`などのパッケージが含まれて容量を食うようになってしまったのですが、これは設定で回避できることが判明しました。

## `setImmediate`とは

JavaScript環境ではおなじみの`setTimeout`ですが、[処理を非同期にするだけ](https://qiita.com/jkr_2255/items/17693ab77beea71a871c)の目的でも使われます。ただ、待ち時間を完全に0とすることはできず、4ミリ秒程度待たされることとなります。

そこで、「非同期にしたいけど、できるだけ待たせたくない」という需要が生じるわけですが、環境によってはそれが`setImmediate`という名前で実装されています。そして、存在しないブラウザ環境でも[`postMessage`を使うことで実装可能です](https://qiita.com/hiruberuto/items/0b89c36556cadbd751e2)。

## Webpack時の問題

`setImmediate`のある環境は、Node.js・IE・Edgeとなっていて、ChromeやFirefoxには存在しません。そして、Node.jsに存在することもあって、Webpackではコードにグローバルな`setImmediate`が登場すると、[YuzuJS/setImmediate](https://github.com/YuzuJS/setImmediate)を使ったPolyfillへと置き換えていきます。

さらに、YuzuJS/setImmediateのコード内で、古いNode向けのコードとして`process.nextTick`が使われているために、これもPolyfillされます。結果、[defunctzombie/node-process](https://github.com/defunctzombie/node-process)と[browserify/timers-browserify](https://github.com/browserify/timers-browserify)も入って、3つで都合4.2kB、Gzip後でも1.6kBという容量を消費してしまいます。

## 不要な場面

もちろん、Node前提のライブラリで、`setImmediate`に問答無用で依存しているライブラリであれば、頑張ってPolyfillをかける必要もあるかもしれません[^1]。

一方で、ブラウザ向けのライブラリの場合、`setImmediate`がネイティブのある環境が限られますので、以下のような「`setImmediate`があれば使う」コードを見かけます。

```javascript
const asyncRun = typeof setImmediate === 'function' ? 
  func => setImmediate(func) :
  func => setTimeout(func, 0);
```

標準設定のWebpackでは、このようなコードにもPolyfillを施していってしまいます。

## 設定で止められる

ちょうど`@fortawesome/fontawesome-svg-core`で、「`Promise`がない環境のPolyfillコード[^2]」で`setImmediate`があれば使うようになっていて、かなり過剰感もあったので削減したくなりました。調べてみると、`webpack.config.js`で`node.setImmediate = false`とすることで、`setImmediate`のPolyfillが省略できることが判明しました。

[Node - Webpack configuration](https://webpack.js.org/configuration/node/)

指定することで、3つのパッケージはきれいに消滅しました。


[^1]: もっとも、`process.nextTick`向けのPolyfillはほとんどの用法で余計だと思われます。
[^2]: 別な場所でも`Promise`が必要なのでグローバルにPolyfillしてあり、これ自体が不要なのですが、そこはいったん置いておきます。
macOS上でRaspbianのイメージを編集する

# 概要
RaspbianのLinuxイメージを自分がビルドしたLinux kernelやLinux root file systemに変更して動作させたい。
Raspbianのイメージ作成方法はちょっとよくわからないので手っ取り早くRaspbianのイメージをマウントして編集するようにする。

# 課題
macOSではデフォルトではext3のファイルシステムをサポートしていないためSD cardをUSB card reader経由でマウントしてもfat32のbootディレクトリしか見えない

# 解決方法
ext4fuseを使ってマウントする
今回はDesktop上のフォルダにマウントするようにした

# やり方
```
unzip 2018-11-13-raspbian-stretch-lite.zip 
sudo dd bs=1m if=~/Desktop/2018-11-13-raspbian-stretch-lite.img of=rdisk2 conv=sync
diskutil list

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.7 GB    disk2
   1:             Windows_FAT_32 boot                    46.0 MB    disk2s1
   2:                      Linux                         1.8 GB     disk2s2


brew cask install osxfuse
brew install ext4fuse
sudo ext4fuse -o allow_other /dev/disk2s2 ~/Desktop/rpi_ext3
sudo diskutil mount -mountPoint ~/Desktop/rpi_boot /dev/disk2s1

df -H
Filesystem          Size   Used  Avail Capacity iused               ifree %iused  Mounted on
......
ext4fuse@osxfuse0     0B     0B     0B   100%       0                   0  100%   /Users/yshr1982/Desktop/rpi_ext3
/dev/disk2s1         45M    23M    22M    51%       0                   0  100%   /Users/yshr1982/Desktop/rpi_boot
```
できた。
あとはマウントしたディレクトリへ自分で作成したものに置き換えればOK
？？？　もしかしてread onlyかも
php-master-changes 2019-02-01

今日はドキュメントの修正、PCRE のビルドシステムの修正、mb_ereg_replace() への非文字列引数の扱いの修正、mb_ereg() と mb_eregi() のパターン指定引数の扱いの修正があった！

あと 8 月頭くらいから大体半年 ROM った形になった気がする！

# 2019-02-01
## cmb69: Fix version.inc update notes
- https://github.com/php/php-src/commit/a851f16b2b0b21fe84116bf4c71cea4312ade0ce
- README.RELEASE_PROCESS で、version.inc の更新についてマイナーバージョンを考慮に入れた記述へ修正
- 公式 Web サイトの更新に使われる奴かな

## nikic: Fix bogus $PHP_PCRE_REGEX checks
- https://github.com/php/php-src/commit/882dcb43f72d14ad52be6f911d398f527d05a0cf
- [7.4~]
- ext/pcre で、pkg-config への移行によって無くなった $PHP_PCRE_REGEX のチェックを修正
- 誤った判定により外部の PCRE 利用で valgrind を使う際警告が出るようになっていた

## nikic: Deprecate mb_ereg_replace with non-string pattern
- https://github.com/php/php-src/commit/e366ceebade0fb3c30d4f99b82a11e5fc879d22e
- [7.4~]
- ext/mbstring で、[mb_ereg_replace()](http://php.net/manual/ja/function.mb-ereg-replace.php) を非文字列のパターン指定で使うのを非推奨化

## nikic: Make mb_ereg_replace() pattern argument a string
- https://github.com/php/php-src/commit/06ed6b89780a5eada4966f4a0512d58cda2936c9
- ext/mbstring で、[mb_ereg_replace()](http://php.net/manual/ja/function.mb-ereg-replace.php) のパターン指定引数を文字列型とするよう修正

## nikic: Make mb_ereg(i) argument a normal string argument
- https://github.com/php/php-src/commit/4a4c68d90d8fac4c54932d356a156d000c9c684c
- ext/mbstring で、[mb_ereg](http://php.net/manual/ja/function.mb-ereg.php) と [mb_eregi()](http://php.net/manual/ja/function.mb-eregi.php) の引数を通常の ZPP の処理で文字列引数とするよう修正
【Xamarin.Forms&Prism】ソリューション作成直後のAndroidプロジェクトでビルドエラー

#はじめに
VisualStudio2017 for MACのPrism Template Studio and Developer Toolkitのテンプレートで作成したソリューションでAndroidプロジェクトをビルドするとエラーがでました。

テンプレートで作成しただけなのにビルドエラーが出るとホント萎える。。。

対策を記録に残しておきます。

#環境
- macOS 10.14 Mojave
- Visual Studio Community 2017 for MAC(7.7.4)
- Prism Template Studio and Developer Toolkit(2.2.0.434)

#状況
Prism Template Studio and Developer ToolkitのテンプレートでBlank Prism Applicationを作成しました。

<img width="1013" alt="スクリーンショット 2019-02-02 20.27.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/d75fbd1d-2932-ddc9-68a4-e8fb10af1de3.png">

作成直後にAndroidプロジェクトをビルドするとビルドエラー。
テンプレートから作成しただけなのに（泣
<img width="1223" alt="スクリーンショット 2019-02-02 20.26.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/c90d08f9-04ee-291b-ad34-8d3f69c434b1.png">


```
Resources/values/styles.xml(2): error APT0000: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.
```

 
#対策
Androidプロジェクトの「プロジェクトオプション」を開き、[ビルド]-[全般]の「Compile using Android Version:(Target Framework)」が「Android 8.0(Oreo)」になっていたので「Android 8.1(Oreo)」に変更します。
<img width="1072" alt="スクリーンショット 2019-02-02 20.33.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/1d9ba4b6-d19f-eafc-d910-239b0d12df2b.png">

さらに、[ビルド]-[Android アプリケーション]の「対象のAndroidバージョン」も「Android 8.0(API level26」となっていたのを「Android 8.1(API level27」に変更します。
<img width="1100" alt="スクリーンショット 2019-02-02 20.37.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/a8ce1fc6-0f2d-d75b-edfe-d8dcc5c194a9.png">
「プロジェクトオプション」のOKボタンをクリックして、Androidプロジェクトをリビルドするとビルドに成功しました。
<img width="1104" alt="スクリーンショット 2019-02-02 20.44.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/f1f20d2b-b726-b21b-f409-758fa4417b06.png">

ビルドエラーが出た時、思い切ってstyle.xmlをルート要素だけにしたら「パッケージAppCompatはmono.android8.0じゃだめだよー8.1にして」みたいなエラーが出たので、上記の対策をしたらビルドが通りました。
【初心者向け】ColaboratoryでCSVを読み込む最も簡単な方法 ⇒ Pandas (+Github)

#概要：
Web上にあるCSVファイルはpandasを利用すると実質1行でデータをインポート可能

##例：
日経平均に採用された225社の会社名、コード、額面をインポートする


###入力：

```python

import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/zaq9/nk225_list/master/nk225_list.csv')
df

```

※　[Colabo 上で実行してみる場合はこちらのリンクから](https://colab.research.google.com/github/zaq9/nk225_list/blob/master/read_sample.ipynb)

###出力：

![csv_rei.JPG](https://qiita-image-store.s3.amazonaws.com/0/351020/14822acd-eba9-6345-b074-ec404447a21e.jpeg)
(...以下222社分　省略）

##Web上にCSVをアップロードする時、Githubやgistを経由するメリット：
- 無料（最近、プライベート版も無料に）
- アップロード＆更新手段が豊富（CUI,各種GUI,ブラウザからのアップロード等）
- 更新履歴が管理できる（これが本来のメリット）


#注意点：（CSVのURLには「Raw」を利用する）

×：　https://github.com/zaq9/nk225_list/blob/master/nk225_list.csv
〇:　https://raw.githubusercontent.com/zaq9/nk225_list/master/nk225_list.csv

![koko.JPG](https://qiita-image-store.s3.amazonaws.com/0/351020/c782e51e-293a-7f1f-abe6-b1ccb237a7a7.jpeg)


#参考:
- [Google Colaboratory内で画像やCSVファイルにアクセスするのが一苦労だった話](https://qiita.com/yoshizaki_kkgk/items/bf01842d1a80c0f9e56c)

- [google Colaboratoryでファイルを読み込む方法](https://qiita.com/uni-3/items/201aaa2708260cc790b8)
【Swift4】TableViewの特定の行だけをリロードする、reloadRowsメソッドについて調べてみた

# reloadRowsメソッドの使い方
```swift
let indexPath = IndexPath(row: 1, section: 0)
tableView.reloadRows(at: [indexPath], with: .fade)
```

[reloadRows(at:with:) - UITableView | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uitableview/1614935-reloadrows)

# 解説
## 第一引数 `at: [indexPath]`
リロードする行を指定します。
NSIndexPathオブジェクトの配列なので、下記のように複数行を指定することもできます。

```swift
let indexPath_1 = IndexPath(row: 1, section: 0)
let indexPath_2 = IndexPath(row: 2, section: 0)
tableView.reloadRows(at: [indexPath_1, indexPath_2], with: .fade)
```

[NSIndexPath - Foundation | Apple Developer Documentation](https://developer.apple.com/documentation/foundation/nsindexpath)

## 第二引数 `with: .fade`
リロード時のアニメーションの仕方を指定します。
アニメーションにはいくつか種類があり、TableViewクラスの中で下記のように定義されています。

```swift
public enum RowAnimation : Int {
   
    case fade

    case right // slide in from right (or out to right)

    case left

    case top

    case bottom

    case none // available in iOS 3.0

    case middle // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy

    case automatic // available in iOS 5.0.  chooses an appropriate animation style for you
}
```

違いを見るために、reloadボタンを押すとTableViewの上5行がリロードされるサンプルを作ります。

### `.fade`
よく見るリロードという感じ。
![reload_fade.gif](https://qiita-image-store.s3.amazonaws.com/0/112818/d0af86ae-5f34-d880-cc42-0c169dad577e.gif)


### `.right`
左から右へとリロードがかかります。
![reload_right.gif](https://qiita-image-store.s3.amazonaws.com/0/112818/34eaafe7-6764-0cbb-3fb1-c4f9686d0981.gif)


### `.bottom`
上から下に向かってリロードがかかります。
![reload_bottom.gif](https://qiita-image-store.s3.amazonaws.com/0/112818/4c4da1ca-c2c3-af67-563b-9dd24a2a2a8e.gif)

思ったよりも違いが顕著で面白かったですが、普段使うのは無難な`.fade`か、アニメーションのない`.none`あたりが多そうです。

[UITableView.RowAnimation - UITableView | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uitableview/rowanimation)
【微分積分】微分の基本ルールと公式

# 微分の基本ルール

```math
f(x) \to f'(x)\quad※ y', \frac{dy}{dx} 表記も同義
```

```math
定数 \to 0
```

```math
x \to 1
```

```math
kf(x) \to kf'(x)\quad※kは定数
```

```math
f(x) + g(x) \to f'(x) + g'(x)
```


```math
f(x) - g(x)\to f'(x) - g'(x)
```

```math
f(x)g(x)\to f'(x)g(x)・f(x)g'(x)
```

```math
f(g(x)) \to f'(g(x))・g'(x)
```

# 公式
```math
(x^n)' = nx^{n-1}
```
C++でフォルダ以下にあるファイル一覧を取得し、同じグループの画像(ファイル名で判別)を配列にまとめる

#1 はじめに
学生時代はOpenCVを使って画像処理系の研究をしており、そのときに作成したC++の関数を共有します。
また、C++でフォルダ以下にあるファイル一覧を取得する方法は以下のQiitaに書いていますので、そちらを参照ください。
[C++でフォルダ以下にあるファイル一覧を取得する][1]
[1]:https://qiita.com/tes2840/items/8d295b1caaf10eaf33ad

環境：Visual Studio 2017

#2 やりたいこと
フォルダ以下にあるファイル一覧を取得し、同じグループの画像(ファイル名で判別)を配列にまとめたい。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/242136/83f962f0-f78c-9b5f-15ec-8845535d42b8.png)


#3 ソースコード
```GroupingImage.cpp
#define SAME_GROUP 0	/* 同じグループ(memcmpで文字列一致した) */

/**
* @brief		フォルダ以下の同じグループの画像をまとめる関数
*				画像の命名規則: xx.yy.拡張子(xxを同じグループの場合は同一にする)
* @param[in]	folderPath	フォルダパス
* @param[out]	fileGroups	同じグループの画像をまとめた配列
* @return		true:成功, false:失敗
* @detail		
*/
bool getImageGroups(std::string folderPath, std::vector< std::vector<std::string> >& imageGroups)
{
	bool result = false;					/* 処理結果 */
	std::vector<std::string> fileNames;	/* フォルダ内にあるファイル一覧 */

	/* フォルダパス以下にあるファイル一覧を取得する */
	result = getFileNames(folderPath, fileNames);

	/* ファイル一覧の取得に失敗した場合はfalseを返す */
	if (result == false) {
		return false;
	}

	/* ファイル一覧から同じグループのファイルを動的配列にまとめる
	*  画像の命名規則: xx.yy.拡張子とし、xxを判別用パスとする
	*  判別用パスが同一なら同じグループの画像である
	*/
	const std::string distinction = ".";						/* 判別用文字 */
	std::vector<std::string>::iterator it = fileNames.begin();

	while (it != fileNames.end()){
		std::vector<std::string> sameImageGroup;				/* 同じ画像のグループ */
		std::string searchStr = *it;							/* 判別する画像のパス */
		size_t searchStrPos = 0;								/* 判別用文字の位置 */

		/*配列の先頭の画像をグループに追加し、追加した画像はファイル一覧から削除する */
		sameImageGroup.push_back(*it);						
		it = fileNames.erase(it);

		/* 判別用文字の位置を取得する */
		searchStrPos = searchStr.find(distinction);
		
		/* ファイル一覧から同じグループのものを取得する */
		std::vector<std::string>::iterator tempIt = it;
		while (tempIt != fileNames.end()){
			int result = std::memcmp(searchStr.c_str(), tempIt->c_str(), searchStrPos);

			if (result == SAME_GROUP){
				/* 同じグループの画像を配列に追加し、ファイル一覧から削除する */
				sameImageGroup.push_back(*tempIt);
				tempIt = fileNames.erase(tempIt);

				/* すでに削除しているイテレータを参照しているため更新する */
				it = tempIt;
			}
			else{
				/* 同じグループでない場合はイテレータを進める */
				tempIt++;
			}
		}

		/* グループを追加する */
		imageGroups.push_back(sameImageGroup);
	}

	return true;
}

/**
* @brief フォルダ以下のファイル一覧を取得する関数
* @param[in]	folderPath	フォルダパス
* @param[out]	fileNames	ファイル名一覧
* return		true:成功, false:失敗
*/
bool getFileNames(std::string folderPath, std::vector<std::string> &fileNames)
{
	using namespace std::filesystem;
	directory_iterator iter(folderPath), end;
	std::error_code err;

	for (; iter != end && !err; iter.increment(err)){
		const directory_entry entry = *iter;

		fileNames.push_back( entry.path().string() );
		printf("%s\n", fileNames.back().c_str());
	}

	/* エラー処理 */
	if (err){
		std::cout << err.value() << std::endl;
		std::cout << err.message() << std::endl;
		return false;
	}

	return true;
}
```

#4 出力結果
同じグループの画像のパスを一つの配列にまとめています。そして、そのグループを配列に格納した2次元配列で出力します。
![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/242136/919b1b53-24b1-a7ca-7733-083c77d4995d.png)
macOS上のfishと他シェルで$PATH共有

ツッコミ歓迎.

まずは現状での最終形態
===================

以下のようなシェルスクリプトを作成:

```sh
#!/bin/sh
. /etc/profile
. 共有したいPATHを記述した設定ファイル
FISH_PATH_TMP=$PATH /usr/local/bin/fish --init-command='set PATH $FISH_PATH_TMP' "$@"
```

これをデフォルトシェルに設定する.

※ ここでは `/etc/profile` は変更されていないものとする.
※ 「共有したいPATHを記述した設定ファイル」は他シェルの設定ファイルでも読み込まれるようにしておくこと.


どうしてこうなった？
=================

* fish は Bourne Shell 系ではないので, `PATH` の設定ひとつとっても書式が違う. よって単純に設定ファイルの分割だけでは共有できない.
* でも親シェルで設定した環境変数は引き継ぐので, fish をサブシェルとして起動すれば `PATH` を引き継げる.
* しかし macOS の場合, その方法だと `/usr/bin` などの標準的なものより優先したいパスがある場合もサブシェルとして fish が起動した際に `/etc/paths` が再読込されてしまい, 元のパスが後ろに来てしまう.
* なので, 一旦 `PATH` を別の環境変数に退避し, fish 起動後に復元している.
MacでRazerマウスを使っているとFinderが常にリネームになる

## 概要
MacでRazerのマウスを使用していて
Finderでファイルを選択しても、常にリネームしかできなくなる現象が発生して困っていました。

いろいろ試した結果シンプルに以下で解決出来ました。

```
killall Finder
```

## 環境
- iMac (Retina 4K, 21.5-inch, 2017)
- High Sierra 10.13.6（17G65）
- Razer Naga Hex V2 MOBA
- Razer Synapse 1.85
- SteerMouse 5.3.3


## 効果がないこと
- マウスコネクタの抜き差し
- Razer Synapseのkill

## これまでの解決方法
- Macの再起動 (いろいろ開いてると辛い)

## その他
- Windowsでは発生しない
- このマウス4個目なので個体差ではない
- El Capitanの頃は起きなかった気がする


## 余談
マウスいろいろ買いましたが親指で意識せずにコントロールできるのは7個が限度でした。
ロジクールのサムボタンのみで16個とかは誤爆します。
Razer Naga Trinityとかも気になったけど交換しないと思う。

Windows環境ではアプリごとの機能の切り替えにSynapse側でタイムラグがあるので
AutoHotkeyCompilerで補っています。
その辺も需要があれば書きます('◇')ゞ

## 最後に
Razerのマウスに対応して頂いたSteerMouse開発元プレンティコム・システムズ有限会社様に感謝致します。
Windows版の開発にも期待してます！
GatsbyJSのおじさんを表示して、styled-components追加

# 概要

<img width="338" alt="Screen Shot 2019-02-02 at 19.44.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/117615/92eadcec-f35f-2f89-2c19-72c988d7c9aa.png">

このおじさんを表示させます。

https://www.gatsbyjs.org/

# 手順

```
npx gatsby new gatsby-app
cd gatsby-app

yarn develop
```

<img width="1059" alt="Screen Shot 2019-02-02 at 19.54.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/117615/2a601864-37f9-a299-3767-61e0ec602119.png">


おじさん表示成功！

# styled-components追加

関係モジュール追加

```
yarn add gatsby-plugin-styled-components styled-components babel-plugin-styled-components
```

gatsby-config.jsを編集

```js:gatsby-config.js
...
plugins: [
    `gatsby-plugin-react-helmet`,
    `gatsby-plugin-styled-components`,
...
```

これでOK :ok:
Let's Encryptで発行した証明書がUbuntuで拒否されないようにしたい！

## 解決したいこと

まだ、Let's Encryptの証明書をUbuntuが信用してくれてないようです。信用されていないため、拒否されてしまいます。それを解決したいです。

例えば、<https://hogehoge.io>　がLet's EncryptのSSL証明書を使っているときに、
以下のようにUbuntuで`curl`すると、エラー"server certificate verification failed."などといわれて、接続を拒否されることがあります。

```bash
$ curl https://hogehoge.io
curl: (60) server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
```

環境は以下のとおりです。

```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
```
（環境はクライアントの環境です。hogehoge.ioが運営されているサーバーの環境は今回は全く関係ありません）

## [追記]　サーバーの設定ミス
Let's Encryptを使っているサーバーの設定のミスで発生していることが分かったので追記します。

`/etc/letsencrypt/live/hogehoge.io/fullchain.pem`をcertとすべきところを`cert.pem`にしてました。


## その場しのぎの対処方法

上のエラー文にも出ているとおり、`-k`か`--insecure`を使えば無理やり`curl`できます。

```bash
curl -k https://hogehoge.io
```

ただし、恒久的な対処方法ではないです。

## 恒久的な対処法

恒久的な対象方法として、
Let's EncryptのRoot Certificatesをインストールします。

```bash
# ディレクトリを移動する
cd /usr/share/ca-certificates
# crtをダウンロードする
sudo wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem.txt
# 何らかのエディタで/etc/ca-certificates.confに一行追記する
sudo vim /etc/ca-certificates.conf
```


一行追記するのは、ダウンロードした `lets-encrypt-x3-cross-signed.pem.txt`　です。
具体的には以下のように追記します。新しく追加したファイルのパスを**/usr/share/ce-certificetsからの相対パス**で追記すれば良いようです。

```txt:/etc/ca-certificates.conf
... .crtがたくさん並んでいる ...
mozilla/OpenTrust_Root_CA_G2.crt
mozilla/OpenTrust_Root_CA_G3.crt
mozilla/SZAFIR_ROOT_CA2.crt
mozilla/TUBITAK_Kamu_SM_SSL_Kok_Sertifikasi_-_Surum_1.crt

# 以下の行を追加する
lets-encrypt-x3-cross-signed.pem.txt
```


追記後に以下のコマンドで設定を反映させます。

```bash
sudo update-ca-certificates
```

以上で完了です。

## 参考
* [Chain of Trust - Let's Encrypt - Free SSL/TLS Certificates](https://letsencrypt.org/certificates/)
* [独自のルートCA証明書を追加する方法（Ubuntu, CentOS 7） - 雑記帳(2015-07-15)](http://muramasa64.fprog.org/diary/?date=20150715)
Vueの「はじめに」を読んで、TODOアプリを作ってみた。

## はじめに
この前、30分アウトプットという話を聞いた。
その手始めに、Vueをちゃんとやってみようと思った。

Vueをやろうと思ったら、必ず見る「はじめに」のページ
https://jp.vuejs.org/v2/guide/

### 作成物
Todoアプリは作れた。（※保存はできません）

[デモ](https://codepen.io/hanlio/pen/qgmmWz)
<img width="315" alt="スクリーンショット 2019-02-02 19.30.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/185846/5308c6b9-c5ce-94b3-480f-cc0ddc7407ca.png">

### コード

#### html
```html
<div id="app">
  <ol>
    <li v-for="(todo, i) in todos">
     {{ todo.text }}
     <button @click="removeTodo(i)">
    削除
  </button>
    </li>
  </ol>
  <input v-model="todo" >
  <button @click="addTodo">
    Todoに追加
  </button>
</div>
```

#### javascript
```javascript
var app = new Vue({
  el: '#app',
  data: {
    todos: [
      { text: 'Learn Javascript' },
      { text: 'Learn Vue' },
      { text: 'Build something sweome'}
    ],
    
    todo: 'Hello Vue',
  },
  
  methods: {
    addTodo() {
      this.todos.push({ text: this.todo })
    },
    
    removeTodo(i) {
      this.todos.splice(i, 1) 
    }
  }
}) 
```

### 参考
はじめに -- Vue.js
https://jp.vuejs.org/v2/guide/

Vue.jsは気難しい（配列編）
https://qiita.com/tmak_tsukamoto/items/e303328681f20a036530

## 2日目
前回の続き
今回は、「はじめに」の「コンポーネントによる構成」から再開

### コンポーネントによる構成
Vueには、コンポネートというものがあり、いわゆるパーツのようなもの。
前回書いたコードをコンポーネントに、当てはめると以下のようになる。

#### html
```html
<div id="app">
  <ol>
    <todo-item
        v-for="item in todos"
        v-bind:todo="item"
        v-bind:key="item.id"
      ></todo-item>
  </ol>
  <input v-model="todo" >
  <button @click="addTodo">
    Todoに追加
  </button>
</div>
```

#### javascript
```javascript
Vue.component('todo-item', {
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})

var app = new Vue({
  el: '#app',
  data: {
    todos: [
      {
        id: 1,
        text: 'Learn Javascript'
      },
      {
        id: 2,
        text: 'Learn Vue'
      },
      {
        id: 3,
        text: 'Build something sweome'
      }
    ],

    todo: 'Hello Vue',
  },

  methods: {
    addTodo() {
      this.todos.push({ text: this.todo })
    },

    removeTodo(i) {
      this.todos.splice(i, 1) 
    }
  }
})
```

ただ、コンポーネント化はできたが、削除ボタンが上手く機能しなかった。
そこで、手間取り今日のアウトプットは終了。
GitLabのSSH鍵設定

##はじめに
gitlabに接続するために、いちいちパスワードを聞かれるのは面倒なので、ssh接続にして公開鍵認証でログインする手順をまとめます。

##SSH鍵の作成
````
# 公開鍵生成
$ ssh-keygen
# パスとパスフレーズ設定(デフォルトでもよい。今回はEnter３回押す)

# 公開鍵をコピーする
$ cat ~/.ssh/id_rsa.pub | pbcopy .
````
##GitLabでの設定
・GitLabにログイン
・右上のアカウント内にある"settings"をクリック
・左側タブの"SSH Keys"をクリック
・下記BOX内にコピーした公開鍵をペーストする
<img width="1440" alt="スクリーンショット 2019-02-02 19.45.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/310688/85918e23-6a8a-d4c0-5842-25a7a18967e0.png">

・titleは適当に入れ"add key"をクリック

##接続テスト
````
$ ssh -T git@gitlab.com
````

Welcome to GitLab, @●●●●!と出れば成功。
Live AAC audio streaming with ffmpeg.exe and live docode with MediaCodec class of Android (Xamarin)

# ffmpeg.exe (encode PCM to AAC-LC and pack the data to adts format)
- exec ffmpeg.exe from my program
- `ffmpeg.exe -f f32le -ar 48000 -ac 2 -i - -f u16le -ar 24000 -ac 1 -map 0 -codec:a aac -profile aac_low -ab 8k -f adts -`
- my program passes captured PC internal sound data through stdin of ffmpeg.exe process
- IMPORTANT: passing samples is needed 1024 samples at the same time (= pass 1024 samples with one write call and then call flush)
- stdout of ffmpeg.exe is read by my program and send it to Android app.
  - IMPORTANT: you should read ffmpeg write data with one read call (it should be a adts frame)

# Decoder with MediaCodec class
```decode.cs
            HandlerThread callbackThread = new HandlerThread("AACDecodingHandler");
            callbackThread.Start();
            Handler handler = new Handler(callbackThread.Looper);

            decoder = MediaCodec.CreateDecoderByType("audio/mp4a-latm");
            // samplingRate and ch is your required value
            var format = MediaFormat.CreateAudioFormat("audio/mp4a-latm", samplingRate, ch);

            // IMPORTANT: csd_data is byte array (7 elements). this data is exist head of stream (= stdout of ffmpeg.exe)
            //            this 7 bytes is adts fixed header of first frame but you should not removed it from frame.
            //            you should pass first adts frame to InputBuffer with header (first 7 bytes).
            int profile = (csd_data[2] & 0xC0) >> 6;
            int srate = (csd_data[2] & 0x3C) >> 2;
            int channel = ((csd_data[2] & 0x01) << 2) | ((csd_data[3] & 0xC0) >> 6);
            byte csd0_0 = (byte)(((profile + 1) << 3) | srate >> 1);
            byte csd0_1 = (byte)(((srate << 7) & 0x80) | channel << 3 );
            byte[] bytes = new byte[] { csd0_0, csd0_1 };
            ByteBuffer csd = ByteBuffer.Wrap(bytes);
            format.SetInteger(MediaFormat.KeyIsAdts, 1);

            format.SetByteBuffer("csd-0", csd);

            // cbk is your callback class
            decoder.SetCallback(cbk, handler);
            decoder.Configure(format, null, null, 0);

            decoder.Start();
```
# Useful tool for validating your AAC adts data
- https://gist.github.com/yohhoy/8ccd6d89e18818662bd4/#file-aac_parser-py

# Whole code
- https://github.com/ryogrid/RemoteDesktopOneWindowForNovelGrame/tree/4112bfac2b23de7b551e86c46c69241ce81f1faf/RemoteDesktop.Server.XamaOk
- https://github.com/ryogrid/RemoteDesktopOneWindowForNovelGrame/tree/4112bfac2b23de7b551e86c46c69241ce81f1faf/RemoteDesktop.Client.Android

# **Enjoy!**
homebrewでreadline7

[2019/06/15追記]
現在は`readline8`への対応が進んでおり、`tig`は`readline8`で動作するようになりました。
`awk`は依然対応されていないようです(そもそも更新される予定があるのか不安になってきた)
自分は`gawk`(GNU実装の`awk`)に移行しました

---

[![tipmona](https://img.shields.io/badge/tipme-%40tipmona-orange.svg)](https://twitter.com/share?text=%40tipmona%20tip%20%40Cj-bc%2039)  [![monya/mona](https://img.shields.io/badge/tipme-%40monya/mona-orange.svg)](https://monya-wallet.github.io/a/?address=MBdCkYyfTsCxtm1wZ1XyKWNLFLYj8zMK3V&scheme=monacoin)  [![tipkotone](https://img.shields.io/badge/tipme-%40tipkotone-orange.svg)](https://twitter.com/share?text=%40tipkotone%20tip%20%40Cj-bc%20{1:39})

# readlineとは

readlineは、行編集用のライブラリでbashやvimなど、様々なところで使われています。

# 現在homebrewで入るreadlineはv8.0.0

現在、`homebrew`を使うとインストールできるのはバージョン`8.0.0`です。
しかしながら、 **まだversion7系統を使っているプログラムがいくつかある**のです。

例:
  - awk
 ~~- tig~~

これらを使うためには、**readlineは7系を使わないといけません**

# readlineの7系を使う

実はhomebrewではバージョン切り替えが可能なので、readlineの7系(最新だと7.0.5)を使うことができます。

## パターン1: 昔のCellarが残っている

*昔readlineがまだ7系だった頃にreadlineをインストール*していて、*brew cleanupをしていなければ*以下のようにしてバージョンを切り替えることができます。

```sh
# brew switch <formula名> <バージョン>
$ brew switch readline 7.0.5
```

`brew info readline`をした時、以下のように使用可能なバージョンが表示されます(自分は後述の方法で7.0.5入れたので7.0.5が入っています)

```sh
readline: stable 8.0.0 (bottled) [keg-only]
Library for command-line editing
https://tiswww.case.edu/php/chet/readline/rltop.html
/usr/local/Cellar/readline/7.0.5 (46 files, 1.5MB) # <-- この行
  Built from source on 2019-02-02 at 18:34:08
/usr/local/Cellar/readline/8.0.0 (48 files, 1.5MB)
  Poured from bottle on 2019-01-13 at 23:06:35
```

## パターン2: homebrew cleanupしてしまった

`Homebrew cleanup`をしてしまい、Cellarが残っていない場合はどうしようもありません...~~諦めまし~~
なんてわけはもちろんないです。
**readlineのformulaを古いのを使えばいい**んです。
ということで、古い(7.0.5用の)formulaを本体から抜き出してきてここに置いてあります: [Cj-bc/homebrew-cj-bc/readline.rb](https://github.com/Cj-bc/homebrew-cj-bc/blob/master/readline.rb)


普通にtapしても良いですが、自分は他のformulaも同じレポジトリに置いているので割と混同するので以下のように直接インストールするのをお勧めします(もちろん自分で取ってきても良いと思います。)

```sh
$ brew unlink readline # 8.0.0 のリンクを外しておく。必要かはわからないですが自分は外しました。
$ brew install cj-bc/cj-bc/readline
```

こうすることで、`7.0.5`が使えるようになります。


ちなみに私は: **homebrewに勝手にcleanupされました**