OmniAICreator/Qiita-1.07M huggingface dataset:
Gitリポジトリ作成

#流れ
- centos上にリモートリポジトリ作成
- 作業端末上にSourcetreeをインストール
- sourcetreeの設定

#centos上にリモートリポジトリ作成
 以下コマンドを実行

```text
mkdir test.git
cd test.git
git init
git status
```

ファイルをtest.git配下においた状態で、以下コマンドを実行すると、リポジトリにファイルが追加される。
その後、commitを実行。

```text
git add .
git status
git commit -m "registaration test.txt"
git status
```

commitコマンドに-aをつけると、addからやってくれる。

```text
git commit -a -m "registaration test.txt"
git status
```


#作業端末上にSourcetreeをインストール
sourcetreeのインストーラを導入するだけ。
gitを事前に入れておく必要があったはず。


#sourcetreeの設定
リモートリポジトリのパスは、以下でうまくいった。
ポート番号は必要なかった。
認証の画面がうまく表示されず、最初はgitを認識しなかった。

```text
ssh://root@(IPアドレス)/(ディレクトリパス)
```
pushをするために、リモートリポジトリ側に、以下設定が必要。
falseになっていると、リモートリポジトリを更新できないのでtrueに変更。
.gitがある場所でやればよい？はず。

```text
git config --get-all core.bare
git config --bool core.bare true
```


#参考
- https://qiita.com/akihira207/items/920837686ebecbbbc9db
- https://qiita.com/ssm_snow/items/3041be842cadf68e6d67
カスタムUICollectionReusableViewをxibで利用する


・New File > User Interface の Empty を選択

![スクリーンショット 2019-06-01 14.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428301/a3faebec-c8e0-2e24-7015-a24bde4dca20.png)

・任意のファイル名を入力
・右上の□を○で囲ったアイコン（Library)ボタンを押下して　Collection Reusable View を右側の画面にドラッグ&ドロップ

![スクリーンショット 2019-06-01 14.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428301/8915cf38-c256-0635-718d-f4aa70764c1c.png)

・追加後の画面

![スクリーンショット 2019-06-01 14.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428301/8d7a0c61-dbda-9eac-d5d9-134052eeb176.png)


・今回のサンプルではこれにUILabelを追加したシンプルなヘッダービューを作成します。
・Libraryボタンから同じようにUILabelをReusableViewの中にドラッグ&ドロップ
・最低限のAutoLayoutを設定

![スクリーンショット 2019-06-01 14.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428301/556d1043-15d2-4f1b-a784-0b77c2c531ff.png)

・右ペインを出して以下のような感じでカスタムクラスを設定

![スクリーンショット 2019-06-01 14.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428301/20334926-63e8-fc2d-7885-53bf3ae50563.png)

・カスタムクラスの内容は以下

```swift:CollectionBaseHeaderView.swift

class CollectionBaseHeaderView:UICollectionReusableView{

    @IBOutlet weak var headerLabel: UILabel!
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
    }
}
```


・ここまでで作成したxibファイルをStoryboardで利用する為に以下の手順を踏みます。

・Storyboard上でCollectionViewをドラッグ&ドロップ
・Libraryボタンから Collection Reusable ViewをCollectionView上にドラッグ&ドロップ
・CustomClassにxibで設定したクラスと同じクラスを設定

![スクリーンショット 2019-06-01 14.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428301/b0c594e7-9678-9481-b969-e2ebf9d02652.png)

・CollectionViewを利用するクラスのviewDidLoadで再利用するセルの登録

```swift:SampleViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()
        profileCollectionView.register(UINib(nibName: "CollectionBaseHeaderView", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "CollectionBaseHeaderView")
    }
```

・あとは通常通りにセクションの設定をしていきます。

```swift:SampleViewController.swift
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let testSection = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "CollectionBaseHeaderView", for: indexPath) as! CollectionBaseHeaderView
        return testSection
    }
```
【Django】フォームでファイル送信エラーが発生したらまず確認すること

#概要
Djangoで< form >を使用した、ファイルアップロードや、ファイル更新でエラーが発生したときに、まず確認してほしいことがあります。

例としては、「フォームで画像のアップロードエラー」があるときです。（ImageFieldsやFileFieldsが該当します）

#エラー例
下記だとエラーが発生して、ファイル（image）の保存ができません。

```html:post_form.html
<form method="post">
  {% csrf_token %}
  <div>名前:{{ form.name }}</div>
  <div>画像:{{ form.image }}</div>
  <input type="submit" value="送信">
</form>
```

しっかりと動作させるには、下記のようにします。

```html:post_form.html
<form method="post" enctype="multipart/form-data">
  {% csrf_token %}
  <div>名前:{{ form.name }}</div>
  <div>画像:{{ form.image }}</div>
  <input type="submit" value="送信">
</form>
```

#ドキュメント
公式ドキュメントには...

> Note that request.FILES will only contain data if the request method was POST and the < form > that posted the request has the attribute enctype="multipart/form-data". Otherwise, request.FILES will be empty.

>引用：[Django公式ドキュメント](https://docs.djangoproject.com/en/2.2/topics/http/file-uploads/#basic-file-uploads)

ざっくりまとめると、`ファイルはpostメソッドにして、enctype入れないとダメだよ`ってことです。

#最後に
もしエラーが発生していれば`enctype`の入れ忘れがないか確認してみてください。

```diff:post_form.py
- <form method="post">
+ <form method="post" enctype="multipart/form-data">
```

以上
GraphvizでStanfordNLPの係り受け構造を描画

pythonでpipインストールできるStanfordNLPには係り受け構造を描画する機能がありません。というわけで、Graphvizを使って木構造を描いてみました。コードは[Github](https://github.com/Nakamurus/dependency_visualized)にもあります。間違いなどありましたら、ご指摘いただければ幸いです。

## 完成品
[ご指摘いただき](https://qiita.com/Nakamurus/items/eab0556327aaeeac0a21?utm_campaign=email&utm_content=link&utm_medium=email&utm_source=public_comment#comment-9b0d9dedf3be6896beab)修正しました！ありがとうございます！
修正内容：ラベルを付けました（ただしコメント欄のモデルのほうはroot、品詞タグ付き+文の構成が一目してわかるリッチな良プロダクト）。



描画した構造のファイルはこんな感じです。数字はindexで、同じ単語だけど違うindexのワードを混同しないためのものです（'て 22''て 13'など）。
![graphs0 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420110/982e8250-b0ff-be75-003f-73f1993dabef.png)



## 準備
StanfordNLPの使い方や、今回使う文章は[前回の記事](https://qiita.com/Nakamurus/items/03f674b0eab161dd8477)通りです。

GraphvizとStanfordNLPのpipインストールと、日本語対応フォントのインストールを行います。


```
pip install stanfordnlp
pip install graphviz
apt-get -y install fonts-ipafont-gothic
```

日本語言語モデルをダウンロードし、テキストを指定。

```
import stanfordnlp
stanfordnlp.download('ja')

nlp = stanfordnlp.Pipeline(processors= 'tokenize,mwt,pos,lemma,depparse', lang='ja')

doc = nlp('一年ほど前、私は何人かと共にインドに向けて文学作品を放送する事業に携わっていた。種々のものをとりあげた中で、かなりの部分が現代ないしそれに近い時代の英国作家の韻文だった――例えばエリオット、ハーバート・リード、オーデン、スペンダー、ディラン・トーマス、ヘンリー・トリース、アレックス・コンフォート、ロバート・ブリッジズ、エドムンド・ブルンデン、Ｄ・Ｈ・ローレンス。詩の実作者に参加してもらえる場合はいつでもそうしていた。何故にこういう特殊な番組（ラジオ戦争における遠方からのささやかな側面攻撃だ）が始められることになったかは改めて説明するまでもないが、インド人聴衆に向けた放送である、という事実によって、我々の技法がある程度まで規定されていたという点には触れる必要があるだろう。要点はこうだ。我々の文芸番組はインド大学の学生たちをターゲットにしていた。彼らは少数かつ敵対的な聴衆で、英国のプロパガンダと表現しうるものは一つとして届かなかった。あらかじめ、聴取者は多めに見積もっても数千人を越すことはないだろうということがわかっていた。これが通常オンエアできる範囲を超えて「ハイブロウ」な番組を作るための口実になったのだ。')

```


## コード



i=0を先頭に置き、1プラスしていくのは一文ごとに個別のファイルを作り、番号付けするためです。
追記：ラベルを追加するよう修正（label=f'{wrd[1]}'）

```
from graphviz import Digraph

def dependency_visualized(doc):
  i = 0 # to name file, including dependency in a sentence
  for sent in doc.sentences:
    dot = Digraph(format='png', filename=f'test/graphs{i}')
    dot.attr('node', shape='square', style='filled', fontname="IPAGothic")
    for wrd in sent.dependencies:
      if wrd[0].text != 'ROOT':
        dot.edge(f'{wrd[0].text} {wrd[0].index}', f'{wrd[2].text} {wrd[2].index}',label=f'{wrd[1]}', fontname="IPAGothic")
        # specify index because there is the same word(like 'で、。') but with different indexes
      else:
        pass
    dot.render()
    i += 1 

dependency_visualized(doc)
```

## 利用したテキスト
利用したテキストは青空文庫にあるオーウェルの『[詩とマイクロホン](https://www.aozora.gr.jp/cards/002035/files/59408_67530.html)』の冒頭です。
The Creative CATさんによる翻訳。感謝。
<a rel="license" href="http://creativecommons.org/licenses/by/3.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/3.0/88x31.png" /></a><br />この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">クリエイティブ・コモンズ 表示 3.0 非移植 ライセンス</a>の下に提供されています。
picoCTF2018 writeup (absolutely relative)

# 問題

与えられたプログラムを実行して，flag.txtの中身を出力させます．

# 解法

そのまま実行すると，権限がないのでダメだと言われます．
ソースコードを見てみると，以下のような行があります．

```c:absolutely-relative.c
15:     file = fopen("/problems/absolutely-relative_1_15eb86fcf5d05ec169cc417d24e02c87/flag.txt" , "r");
21:     file = fopen( "./permission.txt" , "r");
30:     if (!strncmp(permission, yes, yes_len)) {
```

permission.txt を読んで，中にyesと書かれていれば，flag.txtを読み込めるらしい．

しかし，プログラムを実行するディレクトリでは新たにファイルを作成することができません．
ここで，permission.txt が相対パスで書かれていることに注目します．
つまり，ファイルを作成可能なディレクトリからプログラムを実行すればいいわけです．

ホームディレクトリに移動し，権限ファイルを作成して，プログラムを実行したらフラグを獲得できました．

```bash
$ cd ~
$ echo "yes" > permission.txt
$ /problems/absolutely-relative_1_15eb86fcf5d05ec169cc417d24e02c87/absolutely-relative 
(略)
```
rails console が起動できない！

## rails cをやったら固まった！


```
$ bundle exec rails c



```


...。
...動かない！

## 結論
springを止めたら起動できるようになった！

```
$ bundle exec spring stop
Spring stopped.
```

## やったこと

### 裏で動いているプロセスがないか確認

```
$ ps aux | grep rails
yuma             45034   0.0  0.0  4294644    828 s002  S+    4:12PM   0:00.01 grep rails
yuma             44972   0.0  0.1  4308436  11600 s005  S+    4:09PM   0:01.31 /Users/yuma/.rbenv/versions/2.5.1/bin/ruby bin/rails c 
```

怪しいプロセスがあったのでkillしてみる。

```
$ kill -9 44972
```


```
$ bundle exec rails c



Killed: 9
```
固まってたプロセスをkillしただけだった。

### ググった
springって奴が悪さしているらしい。

springってなんだ？
Githubから引用[https://github.com/rails/spring]
> Spring is a Rails application preloader. It speeds up development by keeping your application running in the background so you don't need to boot it every time you run a test, rake task or migration.

裏で動いてアプリを快適にしてくれるものらしい。
プロセスを確認しよう。

```
$ ps aux | grep spring
yuma             44038   0.0  0.1  4331580   7464   ??  Ss    2:50PM   0:05.84 spring app    | hoge | started 4 secs ago | development mode      
yuma             16044   0.0  0.0  4314604   1140 s004  S     7 519    0:01.07 spring server | hoge | started 171 hours ago   
yuma             45196   0.0  0.0  4286452    820 s002  S+    4:17PM   0:00.01 grep spring
```
16044がすでに立っていた。
 `$ spring stop`で止まるらしい。

```
$ bundle exec spring stop
Spring stopped.
```


これで動いたー！
Android の Camera2 API を使って オートフォーカスする

[Android の Camera2 API を使って カメラのプレビュー画面を表示する](https://qiita.com/ohwada/items/7bb65a566114066c8ced)
の続きです。

### 概要

プレビュー画面をタッチして、その位置に焦点を合わせる。

下記の記事とコードを参考にした。

[Camera2フォーカス設定の方法](https://moewe-net.com/android/camera2-auto-focus)

[Basic functionalities of both Camera1 API and Camera2 API with a Google Vision Face Detector added]
(https://github.com/EzequielAdrianM/Camera2Vision)

### オートフォーカスをサポートしているか

下記のように、オートフォーカスで使用できる測光領域の最大数
を取得する。
取得した値が１以上ならば、オートフォーカスをサポートしている
Nexus5 では、１です。

[reference: CameraCharacteristics.html#CONTROL_MAX_REGIONS_AF](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#CONTROL_MAX_REGIONS_AF)

```
    Integer maxAFRegions = characteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AF);
```

### MeteringRectangle

焦点合せを行う測光領域を示すクラス。

センサのxy座標で表した長方形 (Rectangle) です。

プレビュー画面をタッチした位置をセンサのxy座標に変換する。
プレビュー画面とセンサのxy座標の対応は、下記の記事を参考のこと。

[Android の Camera2 API を使って 顔検出する](https://qiita.com/ohwada/items/94105a7ea134ab4d2734)

プレビュー画面とセンサーのxy座標の対応は下図のようになります。
![correspondence_xy_coordinates_of_camera_sensor_and_view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/a1773c1b-17c5-a5b7-f4d5-716a78d342a2.png)

ビュー画面の xy 座標をセンサーの xy 座標に変換する式は下記のようになる。
xy 座標はそれぞれの辺に対する比率


```
sensorX = viewY
 sensorY = 1- viewX
```

### オートフォーカスを要求する

```
    MeteringRectangle[] af_regions 
    previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
    previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
    previewRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, af_regions);
    captureSession.capture(previewRequestBuilder.build(), captureCallback, backgroundHandler);
```

サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Camera211
配列と連想配列の違いと使い方

#はじめに
しばらくRubyを勉強しているのですが、配列と連想配列違いや使い方を復習するために、記事にまとめていこうと思います。

#配列とは
配列とは、値を入れる箱のようなもの。複数のデータを扱う際、配列を使うと非常に便利。順番で入力し、0から順に番号で呼び出すことが出来る。

書き方は、[ ]で囲い、カンマで区切る。

```ruby
array  = ["value1", "value2", "value3"]
```

後から配列に数値を加える際は<<メソッドを使い、下記のように記載する。

```ruby
array << "value4"
```

#連想配列とは
キーとバリューという2つの紐付いた数値を管理できるというのが特徴。キーを叩くとバリューが呼び出すことが出来る。例えば、人の名前と性別など、2つでセットにして管理したい場合に非常に便利。
書き方は以下のように、{ } で囲み、キーとバリューは => で繋ぐ。

```ruby
hash = { "key1" => "value1", "key2" => "value2", "key3" => "value3"}

#又はこちらで書く(こっちの方が処理が速いらしい）
hash = { :key1 => "value1", :key2 => "value2", :key3 => "value3"}
```

配列やハッシュはeach doメソッドで回して、値を出すことが多い。

```ruby
#配列をeachで回す
array.each do |data|
   put data
end

#ハッシュをeachで回す
hash.each do|key, value|
   put key
   put value
end
```
GitHubにユーザー登録し、リポジトリを作成する

# はじめに

GitHubにユーザー登録するための手順です。

# 手順

以下のURLにブラウザでアクセスする。

https://github.com/

Username、Email、Passwordを入力し、「Sign up for GitHub」をクリックする。
既にGitHubでほかのユーザーが使用しているUsernameは使用することができません。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/cbae7f18-107a-1040-aebd-c990f57e0b21.png)

「検証開始」をクリックする。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/49ba1a8e-a9f8-f62e-aa9b-cdb172756643.png)

表示されているメッセージに従って、画像を操作する。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/e0fdadd1-f0ca-2093-cf1f-dc2b9cba69ba.png)

「Free」を選択して、「Continue」をクリックする。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/1a955cc0-6456-abdd-13d8-66e5e4ff86bf.png)

特に何も選択せずに、「Submit」をクリックする。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/5e516881-0610-5efc-ffa8-ce32199e8d6d.png)

以下のようなメールが登録したメールアドレスに届くので、「Verify email address」をクリックする。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/af9e2e73-cee4-e97c-cc78-e0fe71582c84.png)

「Start a project」をクリックする。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/ad42f12f-68ef-745d-2b81-826420434a7f.png)

「Repository name」に任意のリポジトリ名を入力し、「Private」を選択し、「Create repository」をクリックする。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/53f5f6c6-e33a-5cd4-16f6-1fd544f575ea.png)

以下のように表示されれば、リポジトリの作成が完了。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254172/9d6e533e-d7c9-21b1-c32a-a387a7a53424.png)
【Node.js】Masto.jsでMastodonのタイムラインを見る with TypeScript

__タイトルを一番最初に決めたおかげで、公開から30分間ぐらいタイトル詐欺になっていました。申し訳ございません。__

# [Masto.js](https://www.npmjs.com/package/masto) とは？

- MastodonのAPIをぶっ叩くためのライブラリ[^1]。
- ブラウザでもNode.jsでも動く。

今回は初歩の初歩なので、Node.jsでしか試してないです。

### インストール

`npm i --save masto`これで終わり。npmさまさまですね。


# 環境

- Wnidows10 1903
- WSL Ubuntu 18.04 LTS
- Node 10.16.0
- npm 6.9.0
- TypeScript 3.5.1
- Masto.js 2.1.1

VSCodeのターミナルでWSLを呼び出して使っています。WSLすごいですね。これ2まで出るんですよ。
ちなみに今回はTypeScriptを使っていますが、JavaScriptでも動くんじゃなかろうかと思います。

# 使い方

を載せたいのですが、実行しようとしたらエラーが出たので軽く解決[^2]しておきます。


## 面倒そうなタイプのエラー
(TypeScriptだけに)
くだらんギャグを飛ばしてる場合じゃありません。なんかtsc兄貴が

```
Module '"/mnt/c/Users/user/Documents/GitHub/KannaBot/node_modules/eventemitter3/index"' can only be default-imported using the 'esModuleInterop' flag
This module is declared with using 'export =', and can only be used with a default import when using the 'esModuleInterop' flag.
```
などと長ったらしいエラーを吐き出しやがりました。
`import Masto from 'masto'`(後述)をやめて`const Masto = require('masto')`で呼んだらコンパイル通りましたが、型をanyにされるのは嫌なので解決策を探すことに。しかし__ググっても出てこない__。
`node_modules`深層のほうの型定義ファイルで`export =`になってるのが原因くさいのでそこに向かい、`export default`にすり替えてみます。すると__コンパイルが通りました__。なんというか、どうなってるのか、全然わからん！

Node.jsに詳しい方、どなたかご教示願います。
「こんなエラー出ずに普通に動いたけど…」「エラー出た…」という方も教えてくださると嬉しいです。


## 気を取り直して…

```ts:local.ts

import Masto from "masto";

(async () => {
    const client = await Masto.login({
        uri: //hogehoge
    });
    const stream = await client.streamCommunityTimeline();
    
    stream.on('update', status => {
        console.log(`${status.account.display_name}(${status.account.acct}): ${status.content}  ${status.created_at}`);
    });
})()

```

`hogehoge`の部分は適当なインスタンスに変えてください。
`streamCommunityTimeline()`はローカルTLのストリーミングです。`streamPublicTimeline()`に変えると、連合TLのストリーミングができます。

`stream.on()`のコールバックにより、新しいトゥートが来るたび
`もみにす/Mominis(mn): <p>平和そう</p>  2019-06-01T04:12:04.753Z`
`もみにす/Mominis(m@kiritan.work): <p>Node.jsと和解できそう</p>  2019-06-01T04:20:45.000Z`
こんな感じのトゥート内容がconsoleに垂れ流されます。

下の表は、上にある`console.log`の中身メソッドの紹介です。`uri`を"[best-friends.chat](https://best-friends.chat)"に設定したときのものになっており、他のインスタンスから見ると若干変わって見えるやもしれません。

| `status.account.display_name` | `status.account.acct` | `status.content` | `status.created_at` |
|:------------------------------|:----------------------|:-----------------|:--------------------|
|自由に変更できる、ディスプレイネーム。|メンションするときとかに使う変更不可の名前。他鯖の人には`@ドメイン名`がつく。|トゥート内容。|トゥート日時。|
|`もみにす/Mominis`|`mn`|`<p>平和そう</p>`|`2019-06-01T04:12:04.753Z`|
|`もみにす/Mominis`|`m@kiritan.work`|`<p>Node.jsと和解できそう</p>`|`2019-06-01T04:20:45.000Z`|
![mastodon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411269/630f2602-cbbd-92dd-6e32-33429dd7c4c3.png)
イメージ図。

# アプリ認証とかについて

アプリ認証になると大変そうだし、この記事は初歩の初歩だし、インスタンスへの登録なしで使えるAPIだけ叩きました。登録が必要な本格APIについてはあとで書くつもりです。


# おわりに

TypeScript要素なかった…タグ付け詐欺だ…

[^1]: ライブラリ、であってると思うんだけど用語の暗記が適当すぎて自信がない。
[^2]: その場しのぎ、とも言います。
Hello Qiita

どうもはじめまして。

タカシと申します。
(HNはBenjaminです)

初投稿です。

プロフの通り、
インフラ系エンジニア🥚です。
約1年間、日英ヘルプデスクと
監視を経験しました。
より技術者としてのスキルを
上げるために転職をし、
この7月あたりからネットワーク設計構築の
レビューに携われることになりました。
今後、その設計構築のフェーズで
仕事をして行くことになりそうです。

Qiitaは開発系の言語が多いイメージがあります。
しかし。それもこれも、ごちゃ混ぜで学んで
インプット、アウトプット出来るよう投稿していきます。

本日はこの辺で。
おじさんLINEジェネレーターをDockerで動かす

# とりあえず動かしたい

ojichatという、[おじさんがLINEやメールで送ってきそうな文を生成するコマンド](https://github.com/greymd/ojichat)がリリースされてめっちゃ面白かった。

が、手元には残念ながらgo環境がなかったのでDockerイメージを作ってアップしてみた。まさか人生初のDockerhubデビューがおじさんLINEジェネレーターになるとは、、

https://hub.docker.com/r/amanekey/ojichat

```
$docker run -it amanekey/ojichat
トモカちゃん❗😄😘（笑）元気、ないのかなぁ😰大丈夫❗❓✋❓ゆっくり、身体休めてね❗😃☀ 😄オヤスミナサイ(^^;;

$docker run -it amanekey/ojichat ウサミン
ウサミンちゃん、今日もお仕事かな(^_^)😘ちょっと電話できるかな🤔❓😜⁉️✋❓ウサミンちゃん(^з<)元気、ないのかなァ(^▽^;)大丈夫😜⁉️
```

以下メモ

# Dockerfileを書く

どうやら`go pet`でインストールしたバイナリは/go/binに入るらしい。のでWORKDIRを/go/binに設定

```dockerfile
FROM golang:latest

RUN go get -u github.com/greymd/ojichat
WORKDIR /go/bin
ENTRYPOINT ["ojichat"]
```

# ビルド

```sh
docker build -t amanekey/ojichat:latest .
```

# アップロード

```
docker login
```

で先にログインしておき、

```
docker push amanekey/ojichat:latest
```

でおｋ

初だしもっといいやり方があるかもしれない。指摘あればぜひ ナンチャッテσ(^_^;)
lxdeでchromeのデスクトップショートカットアイコンを変える方法

## 環境

- OS： Ubuntu 18.04
- デスクトップ環境： LXDE

## デスクトップ上に置かれたショートカットを変更する場合

1. ショートカットを右クリックする
2. アプリケーションで開く でテキストエディタを選択する
3. Icon=~ の項目を設定したいアイコン画像のフルパスに変更する
4. 保存する

## メニュー > Chromeアプリで表示されるアイコンを変更する場合

1. 変更したいアイコンを右クリックしてプロパティを見る
2. ファイル名を控えておく
3. .local/share/applicationsのディレクトリを開く
4. 控えたファイル名と同じ名前のファイルをテキストエディタで開く
5. Icon=~ の項目を設定したいアイコン画像のフルパスに変更する
6. 保存する

## 参考
[xdotool: what are "class" and "classname" for a window? - Ask Ubuntu](https://askubuntu.com/questions/1060170/xdotool-what-are-class-and-classname-for-a-window)
自然言語処理入門編！

##はじめに

こんにちは！
今回は今まで書いたことのない**「自然言語処理」**に関する記事です。
初学者は画像分類などに興味が向きがちですが僕も自然言語処理を勉強してみて面白いと感じた一人なので、初学者なりに面白さを共有できたらいいなと思います。

##自然言語処理とは？

最近プログラミングを始めた方でも、一度は自然言語処理というジャンルを耳にしたことはあるのではないでしょうか？

そもそも**「自然言語」**とは私たちが普段話している日本語や英語などの言語のことです。
具体的な処理ですが、まず**形態素解析**といって文章を可能な限り小さい単位（名詞、動詞、助詞など）に分割することから始まり、次にかがり受けなどの構造を明らかにする**構文解析**を行います。
そして最後に文の中で「誰がいつどこで何をした」という5W1Hを**意味解析**で判定します。
「私はご飯を食べる」という例文で考えてみましょう
![スクリーンショット 2019-06-01 13.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/e28032e0-d2b1-f96f-07d0-ce552c7e984b.png)

このような手順で文章を解析していくのが自然言語処理です。
次はさらに具体的な種類を見ていきましょう。

##word2vec
word2vecとは、簡潔に言えば**単語をベクトル化する技術**のことです。
リンゴとバナナを例にとって考えてみます。
リンゴのベクトルが(0.3,0.4,0.7,0.9)
バナナのベクトルが(0.2,0.3,0.6,0.8)
だったとしましょう。
この場合、二つのベクトルの要素はそれぞれ似ていますよね？このように単語をベクトル化することで単語の関連性や類似度を目に見える形で判定できるようになるのです。

なおかつ、ベクトルで表現した単語は演算ができます。
例えば、
俳優（0.9,0.7,0.8,0.6)
男優 (0.5,0.3,0.4,0.2)
女優 (0.4,0.4,0.4,0.4)
のようなベクトルが存在するとき、俳優−男優=女優という計算ができます。

word2vecに用いられるのはCBOW(continuous bag-of-words)やskip-gramといったニューラルネットワークです。

##seq2seq

seq2seqとは、系列(sequence)を受け取り、別の系列へ変換するモデルを指し、文章などの入力を圧縮するencoderと、出力を展開するdecoderからなります。
実際の活用例をあげると
機械翻訳(例:日本語→英語）
対話文生成（例:自分の発言→相手の発言）
文章要約（例:元の文章→要約文）

など様々なものがあり、どれも身近なものばかりです。パっと思いつくもので言えばSiriなどの会話botがありますね！


##自然言語処理に使うライブラリ

ここまで説明されても、実際に自分のパソコンで自然言語処理をするために必要なものはわかりませんよね。
なので、これだけはインストールしておいて間違いないというライブラリをご紹介します。

・numpy
・matplotlib
・tensorflow
・keras
・nomkl
・gensim(word2vecで使う)
・janome(形態素解析で使う）

とりあえずこれさえあれば、さわりの部分は何とかなります。アナコンダなどでサクッとインストールして実際にやってみちゃいましょう！

##実践（形態素解析）
では早速、最も簡単な形態素解析をやってみましょう。
先ほど挙げたライブラリをまだインストールしてない方はまずインストールを、インストール済みの方はjupyter notebook上で

```python

from janome.tokenizer import Tokenizer

t = Tokenizer()

s = "私はご飯を食べる。そして学校へ行く。"

for token in t.tokenize(s):
    print(token)
```

と入力してみてください。

するとこのような画面が出て、文章が単語ごとに解析されているのが確認できるかと思います。
![スクリーンショット 2019-06-01 13.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/e305e198-7359-597b-c91a-8f4cd73abcdf.png)

これができたら自然言語処理の仲間入りです。本当の本当に初歩的な部分ですが、自然言語処理の面白さが伝わるでしょう。

この他にも色々と調べて、word2vecやseq2seqなどを使って自分なりの対話botを作っても楽しいと思います！

##終わりに

いかがだったでしょうか？
自然言語処理ってなかなか教材が少なくて、勉強しにくいというのが難点です。
この記事はそんな理由でお悩みの方には役立つかと思います。
特に、必要なライブラリの部分とか！

これからはさらに実践的な自然言語処理も記事にできたらいいなと考えていますので、ぜひ読んでみてください！

最後に、医学生である僕が所属しているツカザキ病院眼科AIチームのページも見ていただけたら幸いです！ぜひご覧ください！
[ツカザキ病院眼科AIチーム DeepOculus](https://qiita.com/organizations/deepoculus)

では、また次の記事で！
Pythonでbackspace(0x08)をprintすると前の文字が消える

後輩が次のようなコードの挙動で悩んでいました。

```python
user = User()
print(user.name)
# => ninomiyt

# ただの文字列
print(type(user.name)
# => str

print("Hello, {}!".format(user.name))
# => Hello, ninomiy! 
```

たしかに不審な挙動だったので調べたところ、

* MacのVSCodeで[backspaceの制御文字が混ざる](http://kawaken.hateblo.jp/entry/2018/04/02/234339)ことがある
* Pythonの `print` 関数が[backspaceで文字を消した上で出力する](https://stackoverflow.com/questions/2856344/backspace-character-weirdness)

ことのコンボが決まった結果「実は`{}`の後ろにbackspaceの制御文字が混ざっていて一文字消えてしまう」ような現象が発生していたようです。

無事、以下のようなコードで再現することができました。変なバグじゃなくてよかった。

```python
text = "text" + chr(0x08)
print(text)
# => tex

# 文字列としては保持している
print(len(text))
# => 5
```
-初心者でもわかるエラー解決-ActionController::UnknownFormat in 〇〇Controller#アクション名

# ActionController::UnknownFormat in 〇〇Controller#アクション名の解決方法

自分の備忘録として、エラーの解決方法を記載していこうと思います！

## ActionController::UnknownFormat in 〇〇Controller#アクション名
エラーの本文はこんな感じ。

> 〇〇Controller#アクション名 is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: [] NOTE! For XHR/Ajax or API requests, this action would normally respond with 204 No Content: an empty white screen. Since you're loading it in a web browser, we assume that you expected to actually render a template, not nothing, so we're showing an error to be extra-clear. If you expect 204 No Content, carry on. That's what you'll get from an XHR or API request. Give it a shot.
>> **Extracted source (around line #55):**
53  "That's what you'll get from an XHR or API request. Give it a shot."
54 **raise ActionController::UnknownFormat, message**
55 else
56 logger.info "No template found for #{self.class.name}\##{action_name}, 
57 rendering head :no_content" if logger
58 super

・・・こんなところいじった覚えはない。。。

ただ、ここがヒントかなと思います。

> **missing a template for this request format**

リクエストされたフォーマットに対して、テンプレートがないと言われています。
・・・ビューファイルをまだ作っていないことで発生していたエラーのようです。

アプリを作り始めた時にこのエラーがでた場合は焦ることなくビューの実装を行いましょう！
jupyter_notebookでグラフをHTML保存する方法

よく忘れるので備忘録。

### インタラクティブプロットツール`cufflinks`と`plotly`をインポートする。

```python:package_import
import cufflinks  # df.iplotを使うため
import plotly
plotly.offline.init_notebook_mode(connected=False)
```

### 何かしらのグラフをノートブック上にプロットする。
> HTMLをエクスポートしたいだけだったらこの手順は省略

```python:ノートブックにプロット
# グラフ描画のセッティング
setting = dict(title='グラフの上のタイトル',
               colors=['purple', 'red', 'green', 'blue'],
               xTitle='横軸',
               yTitle='縦軸',
               legend='top',
               width=0.3,
               )
df.iplot(**setting)
```

### HTMLとしてエクスポート

```python
# HTML化
setting['asFigure'] = True  # dictオブジェクトにするために必要？
fig = df.iplot(**setting)
plotly.offline.plot(fig, filename='graph.html')  # ファイル名
```
Exchange Server CASアレイの注意点

ExchangeServerの仕様上、ExchangeServerを同一ドメインかつ同一サイト内に新規構築すると、既存のExchange CASアレイ内に統合されてしまう。これは異なるバージョン(例.ExchangeServer2010のCASアレイ環境に、ExchangeServer2013を新規構築する)の場合にも統合が発生する。

以下の問題等が発生する
・新規構築したExchangeにクライアントからのアクセスが発生する。Hybridサーバー等で、クライアントからのアクセスを想定していなかった場合は問題となる。
・CASサーバーに証明書が導入されていない場合、クライアント側でOutlookの証明書のエラー
・メールフローが既存のCASアレイを経由してしまう場合がある。新規構築したExchangeとメールフローを分ける想定だった場合は問題となる。

CASアレイ統合を回避するためには、以下の対応が考えられる。
・同一ドメイン、別サイトにADを構築する
・新規構築したADのサイトに参加する形でExchangeServerを構築する。
Charanim3DとSAColliderBuilderを併用する際に注意する点

Unityでアニメーションをやってみようと思ったとき、いくつか方法はあると思いますが、最近Charanim3Dというアセットの存在を知り、いじっていました。

[Charanim3D](https://assetstore.unity.com/packages/3d/animations/charanim3d-143181)

Charanim3Dではアニメーションのみ生成して、コライダは自力で準備とのことなのでSAColliderBuilderを使ってみました

[SAColliderBuilder](https://assetstore.unity.com/packages/tools/sacolliderbuilder-15058)

ここで、Charanim3Dの挙動に習って、SAColliderBuilderの設定に「Collider To Child」というものがあります。これは、コライダはそれぞれの対象オブジェクトにコライダコンポーネントをくっつけたGameobjectを追加というものです。

しかし、Charanim3Dでは子供オブジェクトにコライダをくっつけるとワーニングが起きるため、「Collider To Child」をオフにして生成するといいでしょう、という話でした。
Qt C++ コードいろいろメモ 

Qt C++ コードいろいろメモ

時々しか使わないので書き方思い出すためのメモ

■ charからQStringへの変換

```
QTextCodec* tc = QTextCodec::codecForLocale();

char *chr = "日本語";
QString qStr = QString(tc->toUnicode(chr));
```

■ QStringからcharへの変換

```
方法1
QString string = "moji";
char* pChar = string.toUtf8().data();

方法2
QString str ("Something");
char* ch = str.toStdString().C_str();

方法3
std::string str = my_qstring.toStdString();
const char* p = str.c_str();

方法4
QString str1 = "Test";
QByteArray ba = str1.toLocal8Bit();
const char *c_str2 = ba.data();
```


■ Qtでビルドして作成した.exeのあるパスの取得

```
QString exeFileDir= QApplication::applicationDirPath();
```


■ 外部Exeファイルの呼び出し

```
//exeファイル起動
QProcess *process_tmp = new QProcess(this);
QString exeFileDir= QApplication::applicationDirPath();
QString exefile = exeFileDir + "/---.exe";
process_tmp->start(exefile);
```

■ 2次元配列

```
//配列の作成
count = 10;
int **tmpAry = new int*[count];
for(int j = 0; j < count; j++){
    tmpAry[j] = new int[count]();
}

//配列の利用
for(int k = 0; k < count; k++){
    for(int j = 0; j < count; j++){
            tmpRound[j][k] = 1;
        }
    }
}

//配列開放
for(int j = 0; j < count; j++){
    delete[] tmpAry[j];
}
delete[] tmpAry;
```

■ 3次元配列

```
//配列の作成
int ***tmpAry = new int**[cntX];
for(int l = 0; l < cntX; l++){
    tmpAry[l] = new int*[cntY];
    for(int m = 0; m < cntY; m++){
        tmpAry[l][m] = new int[cntZ]();
    }
}

//配列の利用
for(int n = 0; n < cntZ; n++){
    for(int m = 0; m < cntY; m++){
        for(int l = 0; l < cntX; l++){
            if(tmptmpAry[int(double(l) * ratioMax / ratioX)][int(double(m) * ratioMax / ratioY)][int(double(n) * ratioMax / ratioZ)] == 1){
                tmpAry[l][m][n] = 1;
            }
        }
    }
}

//配列開放
for(int l = 0; l < cntX; l++){
    for(int m = 0; m < cntY; m++){
        delete[] tmpAry[l][m];
    }
    delete[] tmpAry[l];
}
delete[] tmpAry;
```
ちょう楽にlinuxでwindowsのアプリを使う

# はじめに
wineというwindowsエミュレータを使って、linux上でwindowsアプリを動かせるようにします。

# 参考
[こちらも参考にしました](https://amzn.to/2WCAfu1)

# 方法

[Wine公式サイトリンク](https://wiki.winehq.org/Ubuntu)

```
sudo dpkg --add-architecture i386
```

```
wget -nc https://dl.winehq.org/wine-builds/winehq.key
```
```
sudo apt-key add winehq.key
```
```bash:Ubuntu
sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ xenial main'
```
```
sudo apt update && sudo apt install --install-recommends winehq-stable
```


## 日本語文字化対策

日本語フォントを追加しないと文字化けするので`winetricks`をインストールして`cjkfonts`を導入する。
```
sudo apt install -y winetricks
winetricks
```

インストールオプションを以下のように選択する。
Select the default wineprefix
↓
Install a font
↓
cjkfonts

エラーでるけど気にせずエンター！以上！文字化け直ってるはず。

# kindle for PCをインストール
**kindle for PCのバージョン**は`1.17.44183`
たぶんこれより新しいバージョンは使えないと思う。
ググればアーカイブが簡単に見つかる。
**wineのバージョンは**`4.0`以上
**wine設定のwindowsのバージョン**は``8.0``

# おすすめ

<a href="https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E-ebook/dp/B072K1NH76/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=linux&qid=1589688259&sr=8-1&linkCode=li3&tag=hurryth30-22&linkId=9482cb57043320a0da551d94c514374b&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B072K1NH76&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=hurryth30-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=hurryth30-22&language=ja_JP&l=li3&o=9&a=B072K1NH76" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
class クラス名 end;という記述を用いないで、クラスを定義する方法とそのメリットについて

#1 定義方法

``` 　
クラス名 = Class.new do 

#メソッドの定義

end
```
たとえば、

```Ruby
animal = 'dog'

Message = Class.new do

  puts animal

end
```
という記述をする。

#2 この定義方法のメリットについて

上記の例のコードにおいて、一般的なクラスの定義方法で記述してしまうと、クラスの外部にあるanimalという変数が呼び出すことができない。

しかし、今回のような定義方法であれば、クラスの外部にあるanimalという変数が呼び出すことができるため、クラス内で変数を定義する必要性がなくなるというメリットがある。
ブロックチェーン開発フレームワーク「Substrate」とは？

この記事は、Substrate Tutorial
https://www.shawntabrizi.com/substrate-collectables-workshop/
を実行する上で、知っておくと進めやすそうな情報を要約する趣旨である。

# Substrateとは？
新しいブロックチェーンをカスタムして作ることが出来るフレームワークである。言語はRustが用いられている。
Webアプリを作る時にExpressなどを用いてサーバーの実装が簡単に出来るように、ブロックチェーンを作る際にP2P通信やデータストレージなどの低レイヤーな概念を気にせずに実装できる。

# Substrateの構成
大雑把に言うと、Substrate Coreの上にSubstrate Runtime Module Libraryが乗っかっていて、これらを用いてブロックチェーンを作る。

## Substrate Core
ブロックチェーンを作る上での最低限の機能が実装されている。暗号関数やp2p通信、コンセンサスなど。

参考:https://coinchoice.net/describe-the-components-of-substrate/#Substrate_Core

## Substrate Runtime Module Library
Substrate Coreに組み合わせることで、様々な機能を付与する。暗号通貨の残高を管理するアカウント機能や、スマートコントラクト機能など色々ある。

参考：https://coinchoice.net/describe-the-components-of-substrate/#Substrate_Runtime_Module_LibrarySRML

<img width="470" alt="スクリーンショット 2019-06-01 10.52.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214076/7cd925bd-49c3-44e3-7911-cf56f781c13d.png">

Substrate Runtimeの構成は上の図のようになっており、Substrate Runtime Module Libraryを組み合わせてRuntimeを作成する。(construct_runtime!マクロで行う)

また、RuntimeのみのUpdateであれば、管理者ユーザーによって既存のチェーンを壊さずに行える(ハードフォークしない)

## カスタムモジュールの定義
チュートリアルでは、既存のSRMLも利用して自らモジュールを定義することになる。
よく出てくるマクロについて解説する。マクロなので、通常のRustとは違う構文になることに注意。

### decl_storage!
ブロックチェーンに保存するデータを定義する。

基本的な構文は以下のようになる。値を使うことも、mapを使うこともできる。(それぞれuse support::StoreValue,use support::StoreMapが必要である)

```rust
decl_storage! {
	trait Store for Module<T: Trait> as MyStore {
		MyValue : u32;
		MyMap: map u32 => u32;
	}
}
```

wasmコンパイルされると、javascriptからは

```javascript
runtime.mysrml.myValue
runtime.mysrml.myMap(1)
```
のように呼び出せる。先頭が小文字になるので注意。


### decl_module!
ユーザーが最終的に呼び出すことになるpublicな関数を定義する。(Polkadot UIで言うExtrinct)

基本的な構文は以下のようになる。これはdecl_storage!で定義したMyValueとMyMapに値を設定する関数である。

```rust
decl_module! {
  pub struct Module<T: Trait> for enum Call where origin: T::Origin {
    fn set_my_value(origin, my_value: u32) -> Result {
      let _sender = ensure_signed(origin)?;
      <MyValue<T>>::put(my_value);
      Ok(())
    }

    fn set_my_map(origin, key: u32, val: u32) -> Result {
      let _sender = ensure_signed(origin)?;
      <MyMap<T>>::insert(key,Val);
      Ok(())
    }
  }
}
```

- pub struct〜の定義はおまじないのようにほぼそのまま書くことになると思われる。
- originは関数を実行しているアカウントを指すので、関数を定義する際に必要となる。関数定義にoriginの型指定がないが、(Rustでは関数定義の際に必要)これはマクロなのでなんか上手いことやってくれいてる。

というのも、マクロが展開されると内部的にはCallというenumが作られ、それを呼び出すことになる。

```rust
pub enum Call<T: Trait> {
    set_my_value(u32),
    set_my_map(u32,u32),
}
```

wasmコンパイルされると、javascriptからは

```javascript
call.mysrml.setMyValue(1)
call.mysrml.setMyMap(1,2)
```
のように呼び出せるようになる。(命名規則に注意)


# 参考記事
- ParityによるSubstrateの紹介記事
https://medium.com/paritytech/what-is-substrate-29af4231d7e0

- Substrate公式ドキュメント
https://docs.substrate.dev/

- Substrateチュートリアル
https://www.shawntabrizi.com/substrate-collectables-workshop/#/


- Substrate Github
正しいMySQLのバックアップの取り方

### 事象
MySQLのDBのバックアップを作成する場合、よく紹介されている書き方が下記の通り

```
mysqldump -u root -p[PASSWORD] -h [DBのIP] [DB名] > [出力ファイル名]
```

実際に現場でこのようにバックアップを作成していたところ問題が発生
調べてみると、あるはずのストアドがバックアップに含まれていない。。。

### 原因
MySQLコマンドオプションを調べてみたところ下記の通り
https://dev.mysql.com/doc/refman/5.6/ja/mysqldump-stored-programs.html

**MySQL ver5.5～8.0はデフォルトでストアドとイベントスケジュールは出力されない！！！**

### 対応
ということで、MySQLのバックアップに
「ストアドプロシージャ」「ストアドファンクション」「イベント」は、
デフォルトで含まれないので、オプション「--routines」「--events」を明示的に付加する必要がある。

```
mysqldump -u root -p[PASSWORD] -h [DBのIP] --routines --events [DB名] > [出力ファイル名]
```
正しいバックアップ手順は下記の通り

```
mysqladmin -u root -p[PASSWORD] -h [DBのIP] create [バックアップDB名]
mysqldump -u root -p[PASSWORD] -h [DBのIP] --routines --events [DB名] > [出力ファイル名]
mysql -u root -p[PASSWORD] -h [DBのIP] [バックアップDB名] < [出力ファイル名]
```

#### おまけ
MySQLのDBバックアップ作成ワンライナー

```
mysqladmin -u root -p[PASSWORD] -h [DBのIP] create [バックアップDB名] && mysqldump -u root -p[PASSWORD] -h [DBのIP] --routines --events [DB名] | mysql -u root -p[PASSWORD] -h [DBのIP] [バックアップDB名]
```

### 追記 2019/12/11
pvコマンドを使うと進捗状況を表示できるゾ

[シェルのパイプの速度(進捗バー) は pv で](https://qiita.com/kitsuyui/items/549c8e786e7d456e0923)

エクスポート（〇〇の部分は想定されるGBを入れよう）

```
mysqldump -u root -p[PASSWORD] -h [DBのIP] --routines --events [DB名] | pv -s ○○g > [出力ファイル名]
```

インポート

```
pv [入力ファイル名] | mysql -u root -p[PASSWORD] -h [DBのIP] [バックアップDB名]
```

#### 参考
[【MySQL】 データのエクスポート / バックアップを行うには... ～ mysqldump ～ ( ソフトウェア ) - プログラム の個人的なメモ - Yahoo!ブログ](https://blogs.yahoo.co.jp/dk521123/36680883.html)

[mysqldumpリカバリの進捗を表示する](https://qiita.com/shouta-dev/items/af9bebecaeabff5fb62f)
【Googleアナリティクスの設定】自分のIPアドレスを対象外にする方法

#１．はじめに
前回投稿した[「GoogleアナリティクスでQiitaへのアクセス状況を可視化してみた（初期設定編）」](https://qiita.com/paco_itengineer/items/f1d50ff8ff214fcf98f9)では、Googleアナリティクスの初期設定を行いました。

この段階では、私自身が閲覧した情報もGoogleアナリティクスの集計対象になっています。自分自身はメンテナンスのために高頻度でページを閲覧するので、純粋な閲覧状況が分からなくなってしまいます。

そこで今回は、**自分の閲覧履歴をGoogleアナリティクスの集計対象外**にすることにしました。

#２．自分のIPアドレスの確認
まず、初めに、自分のIPアドレスの確認を行います。
IPアドレスには以下の２種類があります。今回必要になるのは**「グローバルIPアドレス」**です。

| 種類    　　　　　　　|説明              　　　　　　　　　　　　　　　　　　　　　　　|今回|
|:---------------------|:----------------------------------------------------------|:-----:|
| プライベートIPアドレス | ローカルで一意に割り振られるIPアドレス 　　　　　　　　　　　　　|  ×  |
| グローバルIPアドレス   | インターネットに接続されている機器に一意に割り振られるIPアドレス |  〇|

また、IPアドレスには**IPv4**と**IPv6**があります。使っているプロバイダがどちらに対応しているのか知る必要があります。

これらについては以下のサイトで調べることができました。

**あなたの IPv6 接続性をテストしましょう。**
http://test-ipv6.com/index.html.ja_JP

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/6a1ed063-5da9-d7de-a8f5-aebac289b8c8.png)

私の場合は、「IPv6」が使われていることが分かりましたので、2行目に記載されているIPv6のアドレスをコピーしておきます。



#３．Googleアナリティクスのフィルター設定
①Googleアナリティクスの「管理」-「すべてのフィルタ」をクリックします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/78a62c07-1ae2-d6b6-36d4-b40e3b9c9175.png)

②「フィルタを追加」をクリックします。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/f7c0eb8a-1f85-af44-6bd6-541bf79b0895.png)

③以下のとおり入力して、「保存」ボタンをクリックします。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/e026ab54-c131-998b-75fc-8515d2a20401.png)

| 　　　項目    　　　|　　　　　設定　　　　　|
|:-----------------|:---------------------------|
|フィルタ名|自分のIP（何でもよいです)|
|フィルタの種類|定義済み|
|選択１|除外|
|選択２|IPアドレスからのトラフィック|
|選択３|等しい|
|IPアドレス|先ほど調べたIPv4またはIPv6のグローバルIPアドレス|
|ビューにフィルターを適用|すべてのWEBサイトのデータ|

④以下の通りフィルタの設定が完了しました。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299024/c6738262-229a-4936-b923-e46b05cb55ba.png)

#４．動作確認
フィルターが正しく設定されているか以下の手順で確認します。

①Googleアナリティクスの「リアルタイム」-「概要」でアクティブユーザが０であることを確認。
②自分でQiitaのマイページ（Googleアナリティクスを埋めたページ）を参照する。
③Googleアナリティクスの「リアルタイム」-「概要」でアクティブユーザが０であることを確認。

これで正しく設定していることが確認できました😊

#５．苦労した点（フィルタが適用されない！？）
最初、IPv4でフィルタの設定をしてしまっていたため、フィルタ設定後もGoogleアナリティクスに自分のアクセスが集計されてしまうという問題が発生しました。
よくよく考えてみると、最近IPv6（IPv4 over IPv6だったかな？）に対応しているプロバイダに変更したことを思い出し、IPv6のアドレスでフィルタをかけたところ、うまくいきました。**自分の環境がIPv4かIPv6かを確認しましょう！**
TumblrのSSLが無効になっていたので復旧

# TumblrのSSLが無効になっていたので復旧

## 概要

- 元々Tumblrを独自ドメイン、SSLで設定していたが無効になっていた
- Tumblrのアカウントの設定のSSLが勝手に無効になっていたので戻した
- twitterで検索かけてみたら同じ症状の方が散見されたので復旧方法をまとめておこうと思った

## 症状

ある日、ChromeでTumblrを開いたら、こうなっていた。
![tumblr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290284/d079a341-0c3f-01c3-4de3-5aec8f1773be.png)

スマホでSafariから開いても同じ状態でした。

## 何故？

[Tumblrがようやく全アカウントでHTTPS通信が有効に](https://jp.techcrunch.com/2019/04/24/2019-04-23-https-tumblr/)

こういうのが進んでたらしい。
おそらくその影響で既存ユーザーが受けたんだと推測。
~~それならそれでメールアドレス登録してるんだから通知してくれよ~~

## 具体的な復旧方法

### 1. Tumblrにログインします

[Tumbler ログイン](https://www.tumblr.com/login)

単純にTumblrのアカウントでログインします。
設定している自分自身のドメインからだと上記の症状の画像の状態になるので、こっちから入ったほうがわかりやすいかと。
ブラウザによるかと思いますが上記の症状の画像の状態から、「無視してサイトを表示する」的なものがある場合そこから表示しても良いと思います。

### 2. Tumblrの設定画面を開く

右上の赤丸部分をクリックします
![ategasa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290284/b1226cc4-c78a-b1a8-da6a-632025dc6e1f.png)

外観を編集をクリックします
![ategasaaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290284/3002bfe7-b133-b007-d440-dbc5b2bb018c.png)

### 3. SSLを有効にする

勝手に無効になっているはずので有効にする。画像は無効の状態です。
余談ですがこういうボタンって有効/無効がわかりづらいの自分だけ？
![aaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290284/4ebe3f23-6e46-3d6c-aac8-062380c5e099.png)

### 4. 実際にSSL設定が有効になるまで待つ

ここは反映されるまで早かったり遅かったりすると思いますが、
自分は1日ちょいくらいでSSLが再び有効になった状態に戻りました。
有効になったらメールで通知されると書いてあったのですが受信拒否とかしてないのに送られてこなかった…^^;
過去に有効にしていたからかもしれませんが通知ルールが曖昧ですねえ…。

## 総評

Tumblrの最近の動きを見ていると、
今回の件やコンテンツ規制の件など色々ルールを変えている真っ最中と見受けられるので導入をお考えの方は一度そういった面を考えてから導入したほうが良さそうです！
clearfixの定義、役割、使い方について

#clearfixとは？
clearfixとは、floatを使ったときに生じる不具合を解消してくれるcssのプロパティのことをいう。

#clearfixの役割
　では、「floatを使ったときに生じる不都合」とは、なにか？
まず、floatとは、htmlやhamlの要素を横並びにするcssのプロパティをいう。
次に、floatを使ったときに生じる不都合とは、floatを使い子要素を横並びにしたとき、子要素の上位の要素である親要素の高さ(height)や幅（weight）のプロパティが０になってしまう。それにより、ブラウザ上では、親要素が画面上から消えてしまう現象が起こる。
**つまり、floatを使うことによって、親要素の高さが0になってしまうことが問題なのである。**

```css

.contents {
  background-color: gray;
  margin: 0 auto;
  width: 960px;
}

.left-content {
  background-color: red;
  float: left;
  height: 300px;
  width: 300px;
}

.right-content {
  background-color: green;
  float: right;
  height: 500px;
  width: 200px;
}
```
上記のコードでいうと、親要素であるcontentsが画面に反映されなくなる。

これが、floatを使ったときに生じる不都合である。これを解消するのが、clearfixである。


#clearfixの使い方

では、clearfixをどう使えばよいのか？

```css
clearfix {
    content: "";
    clear: both;
    display: block;
  }
```
以上のコードを親要素であるcontentsにcssプロパティとして、適用させてあげえれればよい。

つまり、上記のコードでは、以下のような記述をすればよい。

```css
clearfix {
    content: "";
    clear: both;
    display: block;
  }

.contents {
  background-color: gray;
  margin: 0 auto;
  width: 960px;
}

.left-content {
  background-color: red;
  float: left;
  height: 300px;
  width: 300px;
}

.right-content {
  background-color: green;
  float: right;
  height: 500px;
  width: 200px;
}
```

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　                                 以上
Rails における日付範囲で無限大 Float::INFINITY の扱う方法について調べたこと

## はじめに

Rails で日付の範囲指定をしてレコードを絞り込むことがあると思います。

範囲の両端が決まっているときは簡単なのですが、片方の端が決まっていない場合にどうするのか、無限大を使う方法があるとのことだったのですが、ちょっと調べないとわからなかったので、備忘としてまとめます。

## 環境情報

* PostgreSQL 10.5
* Rails 5.2.2
* ruby 2.4.2

## 前提

記事を表す `Post` モデルに、`published_at` のような公開日カラムがあるとします。

## ある期間に公開された記事を検索する場合

例えば 2019/05/01 ~ 2019/06/01 の間に公開された記事を検索する場合は、以下のように書くことができると思います。

```ruby
Post.where(published_at: Time.local(2019,5,1)..Time.local(2019,6,1))
```

SQL は `BETWEEN` を使う形になっています。

```ruby
irb(main):019:0> Post.where(published_at: Time.local(2019,5,1)..Time.local(2019,6,1)).to_sql
=> "SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"published_at\" BETWEEN '2019-04-30 15:00:00' AND '2019-05-31 15:00:00'"
```

## ある期間を越えている記事のみ検索する場合

すぐわからなかったのが、`published_at >= 2019/05/01` のような、ある期間を越えている記事のみ検索したいという場合についてでした。
結果としては、以下のような形で可能でした。

```ruby
Post.where(published_at: Time.local(2019,5,1)..Float::INFINITY)
```

端を指定しない側に、浮動小数点数の無限大を表す `Float::INFINITY` を指定する方法です。

ruby の `Range` クラスにおいて、無限遠を指定する際には `Float::INFINITY` を指定できますが、
`Time` クラス、`Date` クラス、`DateTime` クラスでも使えるようでした。

SQL は以下のように、不等号の形となっています。

```ruby
irb(main):018:0> Post.where(published_at: Time.local(2019,5,1)..Float::INFINITY).to_sql                              │
=> "SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"published_at\" >= '2019-04-30 15:00:00'"
```

## 利用にあたってハマったところ

上記で片端のみ指定する形で日付の範囲指定ができるようになったのですが、
利用にあたってハマったところがあったので、そちらもまとめます。

### 負の無限大で範囲指定できない

上記の例では以下のように、正の無限大 `Float::INFINITY` を指定し、「ある日付を越えた日付を持つレコード」を表したのですが、
逆に「ある日付より以前の日付を持つレコード」を検索したい場合もあると思います。

そんなとき、以下のように書きたい気持ちになるのですが、これを実行すると `ArgumentError: bad value for range` というエラーが発生します。

```ruby

Post.where(published_at: -::Float::INFINITY..Time.local(2019,5,1))
```

こちらは [ruby のバグ](https://bugs.ruby-lang.org/issues/12961)として報告されているようで、まだ解決していないようでした。。

そのため以下のように `not` を使い、あくまで正の無限大を範囲に指定してあげる必要がありました。

```ruby

Post.where.not(published_at: Time.local(2019,5,1)..Float::INFINITY)
```

### null になっている値を検索できない

上記のように範囲検索を使う形にすると、日付のカラム値が `null` になっているレコードが検索対象外になってしまいます。

そのため、マイグレーション作成時に `null: false` としてあげるのが良さそうですが、
ではデフォルト値はどうするんだ？ということで悩みました。

postgresql であれば、文字列として `infinity` と指定してあげることで、
日付における無限大が表せるようで、rails 側で範囲検索の対象に含めることができるようになりました。

例ですが、マイグレーションはこんな感じになるかと思います。

```ruby
class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :title
      t.datetime :published_at, null: false, default: 'infinity'

      t.timestamps
    end
  end
end
```

以下コミットで、`date`、`datetime`、`timestamp` 型にも対応されているようです。

https://github.com/rails/rails/commit/d75063ce3ece4d1d0d06a9088cefb7713eb3cb8d

## おわりに

利用にあたっていろいろ気をつけないといけないことが多かったですが、使えるようになると実装の幅が広がるのでは、と思いました。

これから利用する機会があれば使ってみようと思います。

## 参考記事

* [class Range (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/class/Range.html)
* [週刊Railsウォッチ（20180302）Ruby 2.6.0-preview1とWebpack 4.0リリース、爆速検索APIサービスAlgolia、Clowneでモデルをクローンほか](https://techracho.bpsinc.jp/hachi8833/2018_03_02/53412)
* [Bug #12961: Bad value for range using infinity for Date or Time - Ruby trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/12961)
.net Core3.0にて「NETSDK1045」でコンパイルエラーとなる問題

VS2019をいれてCore3.0(というかBlazor)を試そう…と思ってプロジェクトを立ち上げてもうまくいかない場合の対策。
状況としては、依存関係がうまく設定されていない(黄色い参画のアラートがファイル名にでる)、
「対象のフレームワーク」が空欄設定されている等の場合が該当する。

というわけで以下2点を確認。

①メニュー[ツール]から[オプション]を選択、ダイアログにて[環境] →[プレビュー機能]の[.NET コア SDKプレビューを使用する]をチェック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/6ebcc42d-feab-31e7-6a5f-77a090fe3c16.png)

②x86のSDKを入れたか
　→64BitOSなのでとりま64入れておいたものの、どうやら86が必要らしい…(64、86両方必要かは未検証)

②のほうで大量の時間を使った…
将来的にはデフォルトで組み込まれるようになるだろうからこの半年くらいの問題ではあるもののSDK配布するならもう少し何とか…
Gitの使い方（備忘録）

<p>Progateでのレッスンを簡単にまとめてみました。</p>

<h2>Gitの概要</h2>
<p>Gitは共同開発を行うときに用いられるツールです。</p>
<p>「リモート」と言う場所に保存します。</p>
<p>完成または変更したファイルを「リモート」と言う場所にアップロード（保存）し、「リモート」からファイルをダウンロードする事ができます。</p>
<p>Gitに特徴として、最新のファイルだけでなく過去にアップロードしたファイルもダウンロード出来ます。</p>
<p>これによりバグやエラーがあったとき、原因を見つけやすく、迅速に対処が可能です。</p>

<h2>Gitの使い方</h2>
<h3>基本</h3>
<p>Gitの操作の流れは</p>
<ol>
  <li>ファイルの選択</li>
  <li>ファイルの記録</li>
  <li>ファイルのアップロード</li>
  <li>ファイルのダウンロード</li>
</ol>
<p>です。</p>

<h4>1.ファイルの選択について</h4>
<p>ファイルの選択には、⬇️で実行</p>
```
git add ファイル名（index.htmlなど）
```



<h4>2.ファイルの記録</h4>
<p>ファイルの記録には、⬇️で実行</p>
```
git commit  -m "コミットメッセージ"(コミットメッセージは分かりやすいものに。何をどう変更したか)
```


<h4>3.ファイルのアップロード</h4>
<p>アップロード・ダウンロードするには、リモートを登録する必要があります。</p>
<p>リモートに登録するには、リモートの名前とURLの登録をしなくてはいけません。</p>
<p>リモートの登録方法は、以下の通りです。</p>
```
git remote add リモート名 リモートのURL
```



<p>ファイルのアップロードには、⬇️で実行</p>

```
git push origin master(originはgit remote addでつけてリモート名、masterはリモートブランチのこと)
```

<h4>4.ファイルのダウンロード</h4>
<p>ファイルのダウンロードには、⬇️で実行</p>

```
git pull origin master(origin masterはアップロードの説明を参照)
```

<h3>その他の操作</h3>
<p>・どのファイルを変更したのか、addしたファイルか確認する</p>
```
git status
```
<p>※変更されたファイルは赤色、addされたファイルは緑色で表示される</p>


<p>・変更した内容を確認する</p>
```
git diff
```
<p>※変更前のコードは赤色、変更後のコードは緑色で表示される</p>



<p>・他の人のコミット（commit）を確認</p>
```
git log
```


<p>・コミットの変更内容を確認する</p>
```
git lpg -p
```
<p>※Qキーで終了出来る</p>

<h2>参照</h2>
[プロゲート](https://prog-8.com/git/study/1/1#/0)
[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)
【Python エラー】No module xlrd の対処法。権限がなくてxlrdモジュールをインストールできないとき。

# 結論
```python

pip install xlrd --user
```
`--user`オプションをつけて、`xlrd`モジュールをインストールしたら解決

# しようとしていたこと
Excel（.xlsx）を`pandas.Dataframe`として`pandas.excel_read()`を使って読み込もうとしたら表れたエラー

# 解決の経緯
①エクセルファイルを読み込もうとしたら、

```python
import pandas as pd

# Excelファイルの読み込み
data = pd.read_excel('hoge.xlsx', 'Sheet1', index_col=None)
```

②「モジュールがないよ」と、エラーが返ってきたので、

```python

ModuleNotFoundError: No module named 'xlrd' 
```

③`xlrd`モジュールをインストールしようとしたら、

```python

pip install xlrd
```

④「許可がないよ」と、怒られたので、
※会社PCなので管理者権限なし  

```python

PermissionError: [Errno 13] 許可がありません: '/opt/miniconda3/lib/python3.6/site-packages/xlrd'
```

⑤`--user`オプションを付けて、ローカルのユーザーディレクトリにインストールしたらできました。

```python

pip install xlrd --user
```

# 参考にしたサイト＼Special Thanks!／
- [note.nkmk.me/pandasでExcelファイル（xlsx, xls）の読み込み（read_excel）](https://note.nkmk.me/python-pandas-read-excel/)
ダブルクオートなどの特殊文字をエスケープするサービスを公開しました

# 概要

javaなどでシングルクオート、ダブルクオートなどを文字列として認識させるときにシングルクオート、ダブルクオートにバックスラッシュをつけたり、改行を改行コードに修正するのって面倒ですよね。

テストデータを作るときとか必要なのですが、私は今まですごく面倒でした。

便利なサービスはないかなと思って探したのですが、案外、見つからなかったので、自作して公開してみました。
javascriptで組んでいるだけのシンプルなサービスです。

## サイトURL

https://yukifujisawa.github.io/special_character_converter/

<img width="829" alt="スクリーンショット 2019-06-01 11.36.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112294/250026b4-5abc-6f8a-7237-5afa9de124ce.png">

## 変換表

|文字|エスケープ|
|---|---|
|改行|\n|
|タブ|\t|
|ダブルクオート|\"|
|シングルクオート|\'|

## サンプル

### 変換前

```python
rowNum = int(input())

for i in range(rowNum):
    inputs = input()
    if inputs == "[]":
        inputs = []
    else:
        inputs = inputs.rstrip().split(' ')
        inputs = list(map(float, inputs))

    print(check_sample(inputs))
```

### 変換後


```python
rowNum = int(input())\n\nfor i in range(rowNum):\n    inputs = input()\n    if inputs == \"[]\":\n        inputs = []\n    else:\n        inputs = inputs.rstrip().split(\' \')\n        inputs = list(map(float, inputs))\n\n    print(check_sample(inputs))
【備忘録】ebitenで画像のサイズを変換し表示させる

##備忘録##
hajimehoshi氏によって作られた
2Dゲームを作れるgo言語のフレームワークである "ebiten"を使う

##code##
~~~Go
func Update(r *ebiten.Image){
		var err error
		img, _, err = ebitenutil.NewImageFromFile("test.jpeg", ebiten.FilterDefault)
		if err != nil {
			log.Fatal(err)
		}
		w, h := img.Size()
		imgDst := image.NewRGBA(image.Rect(0,0,w/2,h/2))
		draw.CatmullRom.Scale(imgDst, imgDst.Bounds(), img, img.Bounds(), draw.Over, nil)
		ebitenImage,_ :=ebiten.NewImageFromImage(imgDst,ebiten.FilterDefault)
~~~
**NewImageFromFile**について
この関数で画像を読み取り、Decodeしてくれて Image として返してくれる。

**image.NewRGBA**について
彼がこれから私が変更したい画像サイズの型を作ってくれる。

**draw.CatmullRom.Scale**について
彼はNewRGBAさんが作った型にドロドロに溶けたImageを流し込む
出来たImageはただのImageなのでebitenで表示できない

**ebiten.NewImageFromImage**について
この人が表示できるように加工してくれる

**追記**
ebitenの作者の方からのコメントがあり、
NewImage系の関数はUpdate関数で毎回読みだす必要はなく初期化の欄に記入する方がいいらしいです。

###参考文献###
[Go 言語で画像のサイズを変更する](https://text.baldanders.info/golang/resize-image/)
[ebiten](https://ebiten.org/)

####最後に####
もし違うところがあったら教えてください
ATOM のインストール方法(Mac)

# ATOM のインストール方法(Mac)
環境: macOS Mojave(10.14.5)

## ATOM とは

- テキストエディタ
- GitHub 共同創業者の Chris Wanstrath 氏によって開始されたプロジェクト
- オープンソース
    - Electron

## Mac
homebrew cask を使ってインストールできます。

```
$ brew cask install atom
```
Amazon S3 って何？

Amazon S3 Amazon Simple Storage Service
https://aws.amazon.com/jp/s3/



#amazon
AWS re:Invent 2018 新サービス・新機能まとめ
https://qiita.com/some-nyan/items/47b95ed80f83690b3c33


AWS re:Invent 2018 新機能・新サービス纏め
https://qiita.com/hideki/items/41b254405a062851b8d9

サーバーサイドエンジニア向け AWS re:Invent 2018 まとめ
https://qiita.com/kouryou/items/5bf0b9937f6ac8f0ee01

#S3
Amazon S3についてまとめてみた
https://qiita.com/quwtoy/items/24c7ad604966f48393cc

S3の基本事項
https://qiita.com/peg/items/d30574747076ee12f697

【AWS】S3まとめ
https://qiita.com/iron-breaker/items/f35c1d54887c434a321a

AWSソリューションアーキテクトへの道　-Amazon S3のポイントまとめ-
https://qiita.com/namihitoo/items/81e5f2cbef266adab50f

#耐久性

Amazon RDSの信頼性（可用性と耐久性）について
https://qiita.com/ausuited/items/14354e248845c45a2eb3
バージョニング

#S3 Intelligent-Tiering

#Amazon S3 標準 - IA(低頻度アクセス)


#コンプライアンスプログラム 
PCI-DSS
HIPAA/HITECH
FedRAMP
EU データ保護指令
FISMA 


#query-in-place

Amazon Athena 

Amazon Redshift Spectrum

#AWS Partner Network (APN) 
AWS Marketplace

#AWS Lambda
Androidでさくっと画面の操作を無効化する方法

アプリを作っていると、一時的に画面の操作を無効化（タップを受け付けない）したい時があったりすると思います。
（何らかのアニメーション中にボタンとかを押してほしくない、など）

対処法としては、「ダイアログを表示する」「透明なViewを最前面に置く」などがありますが、もっとさくっと画面の操作を無効化する方法があったのでご紹介


```kotlin:SampleActivity.kt

// 無効化
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)

// 無効化解除
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
```

[FLAG_NOT_TOUCHABLE](https://developer.android.com/reference/android/view/WindowManager.LayoutParams#FLAG_NOT_TOUCHABLE) を使えばさくっと実現できました。

P.S.
画面操作は出来なくても、バックキーは有効なため、注意が必要です。