OmniAICreator/Qiita-1.07M huggingface dataset:
proxy内でGo環境の構築

# 環境
- Windows 10
- httpプロキシが存在するネットワーク（）
- JetBrains Goland

# Goのインストール

[ここからダウンロード](https://qiita.com/maruyama42/items/7b6cd82eb37e2a524572)

パスは最初から通ってるはず。通っていなかったら、[ここ](https://qiita.com/maruyama42/items/7b6cd82eb37e2a524572)を参考に手動で追加する。

うまくいっている場合はコマンドプロンプトから
```> go version
```
と打つと、バージョンが出力される。

うまくいかない場合は環境変数がまだ有効化されていないので再起動すればうまく行くと考えられる。


# JetBrains GoLand

[ここからダウンロード](https://www.jetbrains.com/go/)
学生だと(GitHub Education)[https://education.github.com/] の特典で無料で使用することが出来る。


# git bash のインストール
Goではライブラリを取得するのにgo getコマンドというのを使用するが、中身はgitコマンドを使用するのでgit bashのインストールが必要になる。

[ここ](https://git-scm.com/downloads)からダウンロードできる

インストール後はパスが通っているかの確認
```> git --version
```
うまくいってなかった場合は再起動、それでもだめならパスを手動で通す。


# proxyの設定

このままではGitHubからのcloneがproxyによりできなくなってしまう

ここからproxy内での設定を行う

コマンドプロンプトで以下の設定を行う

```sh
git config --global http.proxy http://proxy.example.com:8080
git config --global https.proxy http://proxy.example.com:8080
git config --global http.sslVerify false 
```

設定後は一応再起動しておく、

設定後、適当なリポジトリをgit cloneで引っ張ってこれたら成功。
go getもうまくいくと思う
【和訳】必要事項のインストール（Ubuntu 用）

# はじめに

和訳第三弾。

[Installing pre-requisites](https://hyperledger.github.io/composer/latest/installing/installing-prereqs.html) の和訳です。
ガバガバ和訳でも英語読むよりマシという方は御覧ください。
関連チュートリアルに関しても（たぶん）上げます。
当方 Hyperledger Composer について学び始めたばかりであるため、指摘等大歓迎です。

MacOS 環境がないので、Ubuntu のみの和訳となります。

---

Hyperledger Composer は Ubuntu または MacOS 上で動作します。OS を選択し、チュートリアルを実行してください。

# Ubuntu

Hyperledger Composer と Hyperledger Fabric を実行するには、最低でも 4GB のメモリの使用をおすすめします[^1]。

以下が開発ツールインストールのために必要な項目のリストです[^2]。

- OS：Ubuntu Linux 14.04 / 16.04 LTS（共に 64 bit）、もしくは MacOS 10.12
- Docker Engine：17.03 以上
- Docker-Compose：1.8 以上
- Node：8.9 以上（9 以上はサポート外）
- npm：5.x
- git：2.9.x 以上
- Python：2.7.x
- コードエディタ（おすすめは VSCode）

以下の点に注意してください。

- root ではなく一般ユーザでログインしてください。
- root に **su** しないでください。
- 必要事項のインストール時には、curl を使用し、sudo を用いて解凍してください。
- 一般ユーザとして prereqs-ubuntu.sh を実行してください。一部のアクションは root として実行する必要があるため、root パスワードを要求することがあります。
- npm 実行時に **sudo** もしくは **su** を使用しないでください。
- node を root としてグローバルにインストールすることは避けてください。

下記のコマンドで必要事項をインストールすることができます。

```
curl -O https://hyperledger.github.io/composer/latest/prereqs-ubuntu.sh

chmod u+x prereqs-ubuntu.sh
```

下記のスクリプトを実行します。実行中に一時的に sudo を利用するため、パスワードの入力を求められます。

```
./prereqs-ubuntu.sh
```

[^1]: 当環境では VirtualBox 上の Ubuntu に 2GB しか割り当ててないです
[^2]: 当環境 - OS：Ubuntu 16.04 / Docker：18.09.1 / docker-compose：1.13.0 / Node：8.15.0 / npm：6.7.0 / git：2.20.1 / Python 2.7.12 - npm のバージョンが異なるけど動いてます

# What's Next?

必要事項のインストールが完了しました。[開発環境の構築](https://qiita.com/Saya_K/items/82dae077eca669840aa5) に進むことができます。
めちゃめちゃ早くHelloWorldプログラムを書く(Windows)

# めちゃめちゃ早くHelloWorldプログラムを書く（Windows）
## HelloWorldプログラムとは
初心者プログラマが最初に書かなければならないプログラム。

## 手順
### 拡張子を表示する
なんでもいいのでフォルダを開く。一番上の|ファイル|ホーム|共有|表示|管理|など表示されてる部分の表示を開き、ファイル名拡張子にチェック。

### プログラムを作成する
デスクトップ上で右クリック→新規作成→テキストドキュメント。

名前を「hw.vbs」にする。アイコンが変わる。

hw.vbs上で右クリック→編集。

文字を入力して保存する。

```vbs:hw.vbs 
MsgBox("Hello world.")
```

hw.vbsをダブルクリックして実行。ウィンドウが出てきてHello world.と表示されれば完了。

## VBScriptという言語を使ったプログラムです
あとは「vbscript　入門」などで検索してがんばる。
create - 一時テーブル - 項目+データコピー


```sql:copy-temp-Table.sql
select *
 into #test
  from [DT_Table]

```
from の中身を test 一時テーブルを作りぶち込む
鯖直下の一時テーブルフォルダにテーブルできる

データは直接見れないらしい

***************************************

#### 追記：

```sql:copy-temp-Table.sql
select *
 into test
  from [DT_Table]

```
これでDT_Tableのコピーとしてtest作れる
一時テーブルはあくまでおまけじゃったか...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 106165: invalid start byte

##以下の箇所で発生
```
if any(kw in c.decode("utf-8") for kw in ROBOT_KW):
```

##修正後
```
if any(kw in c.decode('ISO-8859-1') for kw in ROBOT_KW):
                      ^^^^^^^^^^^^
```

utf-8へのデコードがうまく行ってなかった
unicode開発前のISO企画であるISO-8859-1を指定すると何故かうまく行った

####参考
https://stackoverflow.com/questions/22216076/unicodedecodeerror-utf8-codec-cant-decode-byte-0xa5-in-position-0-invalid-s
PythonでClassのメンバ変数が更新されたのを確認する

# はじめに

PythonでClassのメンバ変数（アトリビュート）の値が不意に書き換わっていて困ったときに調べた内容のメモです．（既存のコードでClassのメンバ変数が外から直接書き換えられてるっぽい！？みたいなしんどい状況）

# プロパティに変更する

ぱっと思いつくのはプロパティを用意することですね．あまりPythonで書いたことがなかったのと，プロパティの書き方が何種類かあっていつも調べてしまうので，簡単にまとめておきます．
ここではデコレータを使った書き方を載せておきます．

```python:spam.py
class Spam():
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        print(f'Get Value: {self._value}')
        return self._value

    @value.setter
    def value(self, value):
        self._value = value
        print(f'Set Value: {self._value}')

def main():
    spam = Spam(42)
    print(spam.value)
    spam.value = 23
    print(spam.value)

if __name__ == "__main__":
    main()
```

```console:実行結果
$ python spam.py
Get Value: 42
42
Set Value: 23
Get Value: 23
23
```

setter，getterメソッドを用意して`property`関数で登録する書き方もありますが，デコレータを使った方法のほうがシンプルかと思います．また読み取り専用のプロパティにしておきたい場合は，setterを用意する必要はありません．
外部からClassのメンバ変数を直接書き換えるようなコードになっていても，同名のプロパティを用意すれば呼び出し側のコードを変更せずに今回のようなログを追加することができそうです．

# \_\_setattr\_\_をオーバーライド

ざっとメンバ変数の更新を確認したいだけなら，`__setattr__`という特殊メソッドを使う方法もあります．
`spam.value = 23`みたいなコードを書くと，内部で\_\_setattr\_\_が呼ばれているため，このメソッドをオーバーライドすることでロギング処理などを差し込めます．

```python:spam.py
class Spam():
    def __init__(self, value):
        self.value = value

    def __setattr__(self, name, value):
        print(f'Set {name}: {value}')
        object.__setattr__(self, name, value)

def main():
    spam = Spam(42)
    print(spam.value)
    spam.value = 23
    print(spam.value)

if __name__ == "__main__":
    main()
```

```console:実行結果
$ python spam.py
Set value: 42
42
Set value: 23
23
```

注意点は\_\_setattr\_\_の中で基底クラス（明示的に継承していなければ`object`）の\_\_setattr\_\_を呼び出さないと値がセットされなくなります．
確認をしたいメンバ変数が複数ある場合でも\_\_setattr\_\_をひとつ実装するだけで済みますし，逆に特定のメンバ変数だけ確認を取りたい場合は引数で渡ってくる`name`を見てロギング処理を分岐させるとよいです．

# おわりに

普段の単純なコードではあまり\_\_setattr\_\_なんかを触る機会は少ないかもですが，知っておくと何かのときに便利ですね．
Ruby 学習　基本　（Dateクラス）

#はじめに
Rubyの学習を始めました。学んだことを忘れないように備忘録として残しています。

##Date クラス
日付を扱うDateクラスはRequireを用いて読み込むことで
自分でクラス定義をしなくても使うことができる。

```Ruby

require "date" # Dateクラスの読み込み※”./date"ではないことに注意！

date1 = Date.new(2019,2,20)
puts date1   # 2019-02-20

puts date1.sunday? # sundayかどうかを真偽値で返すSunday?メソッド　

date2 = Date.today  #クラスメソッド　今日の日付のインスタンスをつくる
puts date2 　　　　　# 2019-2-21

```
Ruby 学習　基本　（クラス 継承）

#はじめに
Rubyの学習を始めました。学んだことを忘れないように備忘録として残しています。

##クラスの継承
あるクラスを元に新たなクラスを作ることを継承と呼ぶ。
「class新しいクラス名<元となるクラス名」
新しいクラス→　子クラス
元となるクラス→親クラス

継承すると、子クラスは親クラスのインスタンス変数とインスタンスメソッドを引き継ぐ。

```ruby

require "./menu" # menu.rb読み込みß

class Food < Menu

end

food1 = Food.new(name:"sushi",price:1500) #FoodクラスはMenuクラスを継承
puts food1.name # インスタンス変数
puts food1.info # インスタンスメソッド

```

##子クラスにインスタンス変数,インスタンスメソッドを追加

```Ruby
class Food < Menu
 attr_accessor:calorie    # Foodクラスにcalorie を追加

 def calorie_info #  Foodクラスに独自のインスタンスメソッドを追加
  ...
 end
end

#FoodクラスはMenuクラスを継承しているので
#　name price calorie の3つのインスタンス変数を持つ

```

##オーバーライド
親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると
メソッドを上書きすることができる。これをメソッドのオーバーライドと呼ぶ。
オーバーライドすると、子クラスのインスタンスは親クラスのメソッドではなく、
子クラスで定義したメソッドを呼ぶようになる。
レンタルサーバー上でLaravleのドキュメントルートを変える

備忘録的に書いていきたいと思います。

コアサーバー等の格安レンタルサーバーでLaravleを動かすにあたり、
レンタルサーバーでよくある、ドメイン名配下のみで完結させたかった。
※シンボリックリンクは使えない前提

基本的なディレクトリ構成はこんな感じ

```
/public_html/ドメイン名/ドキュメントルート（ここで完結させたい）
```

色々なサイトを参考にさせていただいた感じ、下記の手順を踏む場合が多いみたい。
・publicフォルダの中身をドキュメントルートに展開
・public_pathで取得するパスがドキュメントルートになるように上書き

これらで問題点感じたものは、下記でした。
A.publicフォルダの中身をドキュメントルートに展開だけの場合
　public_pathが返す値が元のパスのままだった
　上記の問題でファイルアップロードが上手く動作しなくなってしまった
B.public_pathで取得するパスがドキュメントルートになるように上書きまで実施
　上書きしたファイルを他の環境でも共通で使うのか、不安

やったこと
結果はすごくシンプルでhtaccessを使って、すべてのアクセスを転送する
現状はこれで問題なく動いているんで、何かあれば、また追記します。
※以下ララベルフォルダを[laravel]とします。

```
/public_html/ドメイン名/[laravel]＆.htaccess 
```

```ruby:.htaccessの中身
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^$ [laravel]/public/index.php [L]
    RewriteRule ^(.+)$ [laravel]/public/$1 [L]
</IfModule>
```
logback.xmlでspring.profiles.activeを判定する方法

探してなかなか見つからなかったので備忘録を兼ねて投稿させていただきます。
以下にソースを公開くださっていました。
https://gist.github.com/syakuis/e9d89e0267d96cff72f23a682ea34cb6

``` logback.xml
<if condition='"${spring.profiles.active}".contains("判定したいプロファイル")'>
    <then>
        <!-- -->
    </then>
    <else>
        <!-- -->
    </else>
</if>
```
windows10 proのRDPサーバー設定を変更し、快適な操作を目指す

## 目的

iOSのRDPクライアントでは以下に対応していない。

* 色数の制限
* 壁紙を表示しない

そこで、RDPサーバーのグループポリシーで制限することとする。

## グループポリシー設定

`gpedit.msc`を起動し以下まで開く。

1. コンピューターの構成
2. 管理者用テンプレート
3. Windowsコンポーネント
4. リモートデスクトップサービス
5. リモートデスクトップ セッション ホスト
6.  リモート セッション環境

* 色の解像度を制限する -> `15bit`
* リモートデスクトップ壁紙を強制的に削除する -> `有効`


![スクリーンショット_2019-02-22_08-19-56.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0437f00e-a57e-a1eb-7f1a-d02c0b164f65.png)

## 視覚効果などのパフォーマンス設定

1. マイコンピュータを右クリック -> プロパティ
2. システムの詳細設定
3. パフォーマンス -> 設定
4. パフォーマンスを優先する (`スクリーンフォントの縁を滑らかにする`のみ有効) -> OK

## (注意) Windows Defenderのリアルタイムスキャンを無効

* 別途ウィルス対策ソフトを入れている場合以外は非推奨

![スクリーンショット_2019-02-22_09-32-08.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3f2b104d-9818-e869-5f59-f765234145f0.png)


操作が軽くなったことを確認。
ハッカソンに初めて出たよ！ヤァ!ヤァ!ヤァ!

# ハッカソンに出た

ハッカソンに初めて出たので感想雑記を書いた。
scrapboxで書いちゃいました。運営さんすいません、、、、、

[ハッカソン感想](https://scrapbox.io/mistletoeopen/%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3%E6%84%9F%E6%83%B3)
あなたの使ってるuWSGI、本当にmax-requests-delta効いてますか？

# 結論
何も考えずにpipで入れてたら効いてないよそれ。
ネットの記事を見たり、公式のマニュアルを読んだりじゃなく、それだけじゃなくて、採用バージョンのソースまでちゃんと読まないとだめだし、ちゃんと動作検証しないとダメだよってお話。
色々考えた結果、gunicornに移行しました。

# 発端
現在、携わっている案件でuWSGIが採用されており、性能改善のためのチューニングをしていたところ、よくわからないタイミングでエラーが頻発するケースがあった。

# 調査
どうにもuWSGIのプロセスがほぼ同時に全部落ちるというタイミングが存在。
このオプションに指定した閾値分のリクエストを処理したworkerは再起動されるという、`max-requests`という設定が入っていた。
uWSGIは指定したworker数分のプロセスを立ち上げて動作するため、workerはコア数分あればいいと思う。
uWSGIは、複数のworkerに対して均等に仕事を割りふろうとするので、この`max-requests`にある程度同時に到達する可能性が高く、そうなった時にuWSGIが一切のリクエストが受け付けられなくなる。
例えば、フロントがnginxの場合、一時的に502エラーの嵐となる。
この問題の対策として、`max-requests-delta`というオプションがある。

例えば、以下の記事などで説明されている。
https://qiita.com/wapa5pow/items/f4326aed6c0b63617ebd

このオプションは、　uwsgiのマニュアルのここで説明されている。
https://uwsgi-docs.readthedocs.io/en/latest/Options.html?highlight=max-requests-delta#max-requests-delta

説明としては、各ワーカーのmax_requests値に（worker_id * delta）を追加しますとなっており、このオプションを設定することで完全とは言わないまでもある程度のプロセス同時多発キルを解消できそうだ。

このオプションはuWSGIのここで設定されている。
<img width="966" alt="スクリーンショット 2019-02-22 7.28.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/153437/0d21b70d-4195-d3cb-7c59-57b6fa07fa38.png">


以下は、この記事を書いている時点での最新のコミットIDの該当箇所。
https://github.com/unbit/uwsgi/blob/f17bdbd1b59565a0d6e81e7b825ee6e08ec8e29e/core/uwsgi.c#L299

一見するとさも使えそうなのだが、これを使うためには、最新のmasterブランチから自分でビルドをした場合に使うことが許される。

uWSGIの最新リリースは、現時点では、2.0.18であるが、該当のソースを見に行くとそんなオプションはない。
<img width="982" alt="スクリーンショット 2019-02-22 7.29.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/153437/3edee6b8-efcd-3e70-4d94-dfd485af9a4f.png">

https://github.com/unbit/uwsgi/blob/2.0.18/core/uwsgi.c#L275-L276

このオプション自体は5年前から存在はするものの恐ろしいことにstableにのってないのである。

<img width="1402" alt="スクリーンショット 2019-02-22 7.31.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/153437/65816487-ce3a-f3cf-1741-a2950788d758.png">

おしまい
unity5.2の作法 その5 HingeJoint

#概要

unity5.2の作法、調べてみた。


#写真


![20190222_070826.gif](https://qiita-image-store.s3.amazonaws.com/0/18104/3cf17046-1d5f-ae24-43da-9163250262b9.gif)

#HingeJointを使った、倒立振子

```
public class ba1 : MonoBehaviour 
{
    public HingeJoint Cylinder;
    public double Kp = 0.001;
    public double Kd = 0.001;
    private double errd2 = 0;
    private double errd = 0;
    private Rigidbody rid;
    void Start()
    {
        rid = GetComponent<Rigidbody>();
    }
    void Update()
    {
    }
    void FixedUpdate()
    {
        var error = -rid.rotation.y;
        var output = Kp * error + Kd * (error - errd2) / Time.deltaTime;
        var motor = Cylinder.motor;
        motor.targetVelocity = (float) output;
        Cylinder.motor = motor;
        errd2 = errd;
        errd = error;
    }
}



```

以上。
「障碍者差別解消法」 は、東京都条例で民間も「対応必須」に？


## もとの記事

* https://qiita.com/SatoshiMukainakano/items/6a23f4ca90579eeff277

この記事の執筆時点（2017春）では、
「不当な差別」 は、行政公共だろうと 民間だろうと 「してはいけない」 ものの、

「合理的配慮の提供」 については
行政や公共の機関のみが「対応必須」であるのに対し、
民間では「努力義務」にとどまっていた。

## 何か変わった？

東京都では、
民間事業者 にも、行政・公共機関 と同じ対応を「必須」とする 都条例 が
【2018年10月1日 に施行】 されていた

### ◆条例
* http://www.fukushihoken.metro.tokyo.jp/shougai/shougai_shisaku/sabetsukaisho_yougo/kaisyoujourei/sabetsu_kaisho_jourei.html

### ◆普及啓発記事・パンフレットなど
* http://www.metro.tokyo.jp/tosei/hodohappyo/press/2018/11/19/documents/13.pdf
* http://www.metro.tokyo.jp/tosei/hodohappyo/press/2018/11/19/13.html

## 運営・制作に関わるwebサイトへの影響

基本線として、前述の「もとの記事」項にある Qiita記事 においての
「行政・公共機関」の立場だったら求められること・義務を果たしていくもの、
という感触をえているが、詳報は条例細部まで確認してからまとめたいところ。　（※読み下し中）

※早急に調べて、できれば何かにまとめておきたい
※WCAG2.0 適合レベルAA を準拠させる、までがひとつの目安
※そうでなくても、「ウェブアクセシビリティ方針を策定」し、「公開」することも？
※１年に１回、「ウェブアクセシビリティ取組確認・評価表」の公開も？
※早いうちに調べておかないと、、、
※ちなみに、秘密漏らす系以外での罰則はないように読めるが、社会的制裁みたいな余地はありそう、、、？

## 殴り書き

* 商圏・ユーザ層が「東京都以外の特定の範囲」に絞られない 国内の民間事業者のwebサイト は すべて対象になりうる？
* 商圏・ユーザ層が「東京都にかかわっていても」、「事業所が都外にあれば対象外」になりうる？
* 東京都以外に、同様の条例を定めている自治体はほかにある？

## 参考・ヒント・関連など

* https://jlsa-net.jp/s-sol/gouritekihairyo-tokyozyourei/
* https://qiita.com/sipadan2003/items/81e5189d4bfab307da5d
トランザクションの確認エラーの対処法

###エラー内容

```
 sudo yum install MariaDB-server MariaDB-client
```

MariaDBを導入しよう以上のコマンドを入力したら、
トランザクションの確認エラーと表示されました。
エラーの意味を調べてみると古いレポジトリと新しいレポジトリが衝突しているということがわかりました。

※レポジトリ
ファイルやプログラム、設定情報などの貯蔵庫のこと

###エラー対応

```
$sudo yum clean all
```

すべてのキャッシュ(rpmファイルなど）を削除しました。

```
$sudo yum update
```

次に、yumのアップデートをして最新のものを入手しました。

以上でエラーを解消できました。
Healthcare Mobile App Development: Types, Trends, & Features

The healthcare industry, among all others, is applying digital technologies and utilizing mobile devices for healthcare app development. mHealth is a common term used for applying mobile technologies and devices in medical and public health practice. Healthcare mobile app development provides lots of benefits.

Around 3.7 billion apps were downloaded in 2017 offering mHealth services. This number is expected to grow by 16% within the next year and should result in a commercial success by making a total of $26 billion worldwide. The heavy usage of smartphones and smartwatches contributed even greater growth to the mobile health consumer app market.

Thus, this is the right time for healthcare mobile app development, and here you will find out all the answers to questions that you have been searching for.

Types of Healthcare Apps 

In general, all healthcare apps can be divided into two categories - professional healthcare apps and healthcare apps for patients. Doctor apps are used for medical instruction, access to healthcare records and diagnoses, medical prescriptions, and essentially all other internal matters.

The other category consists of medical apps used by patients in clinics or personal healthcare apps.

Professional Healthcare Apps

![mobile healthcare applications](https://qiita-image-store.s3.amazonaws.com/0/290718/c75c6b7d-bb3d-5d9a-9521-4f64eab355a8.png)

Medical reference & database apps

These medical apps assist doctors with keeping all the information regarding diseases, drugs, and prescriptions in one place (e.g Medscape, Epocrates, VisualDX).

Professional networking apps

These are thematic social networks where healthcare providers and professionals can connect, interact, exchange knowledge, and grow professional community (e.g. DailyRounds, Figure 1, Among Doctors).

Patient medical health tracking apps

Logically, these healthcare apps help doctors monitor the health of their patients throughout the medical treatment process. Results from various labs and medical tests are listed there, as well as all other medical documentation (e.g VitalHub Chart).

Doctor appointment & clinical assistance apps

To reduce the handwritten work of keeping journals, clinics can use apps for appointments. All parties can be notified about changes in the calendar, which makes life much easier (e.g. Zocdoc).

Telehealth mobile apps (doctor-on-demand apps)

Telehealth apps is a great solution for online doctor visits and consultations (e.g. KRY).

In this article you will find out full information on the [benefits of healthcare app development](https://mlsdev.com/blog/why-develop-apps-for-healthcare).
#Slack で未読チャンネルに移動したときの位置を設定で変更する

#Slack で未読チャンネルに移動したときの位置を設定で変更する

ここらへんを変更

![image](https://user-images.githubusercontent.com/13635059/53136637-fad98e00-35c2-11e9-835a-56759352d422.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
とあるエンジニアの問題意識 2019-02-21



# プログラミングでは本質に集中したい。
本質的でないプログラミングとはなにか。今朝はpythonの日本語の扱いとひたすらに戦う。ただただ複雑なルールを覚えて行くだけでまったく本質的な感じがしない。要するに楽しくない。乗り越えたからといって大して上手にもならない。

# ストレス度基準の作業コントロール。
単純作業での。たとえばBloggerの設定をする。最初はわからないことが多くてストレス度が高い。1個のブログを設定するだけで途方もなく疲れる。だからブログ作成と設定は1日1個まで。慣れてくるとストレス度が下がる。1日に3個ぐらいはできそうな気がしてくる。個数基準ではなく自分のストレス度を基準にする。

# 

# 自分は性格的にハッカーではない気がする。
たとえばスタジオでは今、隣の席が空いている。出勤した時にここに自分のリュックサックを置くのはずるいと思ってしまう。たとえ一時的にではあっても。決められた境界線の中で物事を遂行しようとする。もし隣に人が引っ越してきたら再現性がなくなる動作だ。いやそう考えると、これは再現性のない手順を嫌うエンジニアらしい思考様式なのかもしれない。上位チャンクとしては「とりあえず手近に置けるところに置く」という概念にまとめると再現性がある。

# まだまだ社会人力が低い。
社会人力をつけるためにどのようなロードマップを描けば良いか。本を一冊読めば済むような世界ではない。むしろ読書はまるで役立たない感覚がある。会社づとめの場合、社員ひとりひとりは会社の顔になる。看板を背負う。このメンタルモデルの持ち方が一番納得がいくように思う。

# 仕事のやり方で様々なハックを生み出す。
自分個人の状態もチームの状態も千差万別に変わりゆくので絶対回答は存在しない。ただひたすらに問題解決と適応を繰り返す中でおぼろげに円集合としての自分自身の本質が見え始める。たとえばサイレンスの中でキーボードを打ち鳴らすのが好きなことなど。

# 視覚過敏。
聴覚過敏。触覚過敏。これらをあわせて総合戦闘力のようなものが存在するようだ。耳栓とイヤーマフラーを装着してサイレンスの中にいると視覚情報に惑わされなくなる。普段であれば脳がたやすくオーバーフローを起こすSlackのチャンネル切替にもどうにかメモリを保てる感覚がある。

# 人間が自然的に働ける環境をどうにか死守したい。
だが会社組織の上では難しいこともある。Googleのような先進的な企業でもなければ瞑想や仮眠をするわけにはいかぬ。だが適応の最大化はできる。体を横たえての仮眠が無理なら自席でリクライニングを倒して体を休める。それが無理なら体を起こしながらしばらく目を閉じる。それすらも無理ならその場所で働く価値はない。

# 画面いっぱいに開いたSublimeTextの何も書かれていない画面が美しいなと思う。
世の中のソフトウェアにZenモードが搭載されている理由はこれだ。美しい。プログラミングやテキスト入力という行為自体が芸術だ。ソフトウェアにもアートデザインがあってほしい。

# やはりイヤーマフラーの圧迫感がつらい。
聴覚過敏と肩こりのレベルを天秤にかける。首の角度は0.1度でも違うと体に甚大な影響をもたらす気がする。つける位置を慎重に操作したりして対策する。もし人間工学的に優れたイヤーマフラーが存在するなら10万円払っても惜しくない。耳と首を手術するのよりずっと安いだろう。

# 背中越しにSlackでやり取りをしながら仕事をする。
なんだか不思議な感覚だ。どちらかといえば僕は声で話すほうが好きなのだが、これも人の特性による。口頭で話す全体コストが高いのであれば、テキストでのやり取りの方が良い。方法論を固定せずにリズムをつかんで行こう。

# 

# 

# 

# 因果関係はファンタジーだと思う。
。

# gitのconflictが何故起こるのか未だに言語化して説明できない。
なぜそこがconflictするのかということを理論立てて説明できない。感覚としては分かっている。論理的にどちらかgitが決められない場合だ。システムというより理屈的な世界。おそらく。

# vimを覚えておいてよかった。
このことを1週間ほどつぶやこうと思いつぶやけていなかった。ごく基本的な操作しか出来ないが、やはり独特の陶酔感がある。作者の意図したところかは分からないが遊戯的インターフェイスとして優れている。機能性がアミューズメントを作り出すパターン化。

# プログラミングしていない時間が大事だ。
まるで生産性がないかのように錯覚する時間。目を閉じて考える。それはいつだ。設計のときだ。大きな曲がり角があると想像してほしい。いずれかの道を選んではるか遠くまで行ってから引き返すのは大変だ。熟考するのはその時。それぞれの交差点を。

# チームでもスピードの競合がある。
たとえばスピードが1.1の人と1.0の人がいる。すると毎回、前者の人が発言したり、チケットを取る。1.0 の人と 0.9 の人が仕事をしたら、また結果が変わる。ほんのわずかな違い。良し悪しではなく。

# 少人数のメンバーで働くほど影響の因子が分かる。
大人数では誰がどんな考えをしているかが見えにくい。なにがどんな影響を誰に与えたのか。情報量や可能性の糸の数が多すぎてわからなくなる。観察力をつけるにはひとまずバリエーション最小化が必要だ。

# 心理的安全性ゲームというものがある。
これを人狼ゲームと混ぜ合わせたらどうなるんだろう。片方は信頼のためのゲーム。片方は裏切りのゲームだ。だが人狼ゲームも本質は信頼獲得にあると説いているゲーム会もあった。

# やはりシャローワークとディープワークで、それぞれ最適な環境は違うみたいだ。
シャローワークが必要な時は聴覚過敏もさほど気にならない。耳栓も必要ない。高い集中力は必要とされず、常時接続みたいな細切れの注意力が必要とされる。何か武器の種類にでも例えられないものか。

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
gnome-fileでディレクトリごと個別のソート順情報を初期化したい

# 基本
gnome等GUIのセッションで誰もログインしていない状態でsshなり仮想コンソールなりを用いてCUIでログインし「gio set」などのコマンドを用いて下記の作業を行う。

セッションが起動中（※後述）に下記の作業で値を初期化したりメタデータの保存ファイルを削除しても勝手に値が復活してしまう。

# 現在の設定を確認
```
$ gio info $TARGETDIR
metadata::nautilus-list-view-sort-column: date_accessed
metadata::nautilus-list-view-sort-reversed: true
```
nemoの場合はキー名がnemo-list-view-sort-columnなどになる。
gvfs-infoでも同様のことは出来るがdeprecated。

# 設定を初期化する
```
$ gio set $TARGETDIR metadata::nautilus-list-view-sort-column -t unset
$ gio set $TARGETDIR metadata::nautilus-list-view-sort-reversed -t unset
```
設定の初期化は「-t unset」になるのがポイント。自分で「date_modified」やら「-t boolean true」やらを設定することも可能。
gvfs-set-attributeでも同様のことは出来るがdeprecated。

その他gioの使い方は
https://developer.gnome.org/gio/stable/gio.html
を参照。


# 全てのディレクトリの設定を初期化
~/.local/share/gvfs-metadata
を削除で可能。ただしnautilus関連だけでなくnemo等その他のgvfs-metadataを用いている情報が全て初期化される。

## ※ログイン状態に関する補足
GUIでログインせずCUIで、と記述したが実際は恐らくユーザー権限で動いているgvfs関連のサービスが起動していない状態であれば問題ない。が、実際にどのサービスを落とせばいいのかまでは調べていない。多分サービスの名前からして「gvfs-metadata.service」なのかなぁとは思うのだけれど。

### 余談
自分の場合メインのPCにnomachine( https://www.nomachine.com/ )をインストールしていて、このサービスが裏でセッションをひとつ立ち上げてしまう仕様だったことから、CUIでのコマンド入力やファイル削除もかなり早い段階で試していたにもかかわらず何故か設定が巻き戻ってしまい大いに悩んだ。
Backlogの課題をGoogle App ScriptでGoogleスプレッドシートへ読み込む

Backlog でプロジェクトの単位を細かく分けると、
複数プロジェクトにまたがって状況を管理したい場合、
Backlog 単体だと、俯瞰的な表示を行いにくく、プロジェクトを個別に開くのも面倒なので、
スプレッドシートに課題のスナップショットを取得したいと考えた。

# スプレッドシート
https://docs.google.com/spreadsheets/d/1qa8MxYjjgXQ-aV1UEHGKFI77a6rF581RlBSknV7xFQ4/edit#gid=1194134501
シートをコピーして利用できます。

# 使い方、およびソースコード
https://github.com/nilesflow/BacklogIssues/blob/master/README.md

# 構成
特筆すべき点としては、
Google App Script のコードをライブラリ（実行可能API）として公開した。
これによって、スプレッドシートに付属するコードを最小化して、スクリプト更新時の反映の手間を減らすことができる。

## スプレッドシート側のコード
スプレッドシート側に付属するコードとしては下記のみとしている。

```trigger.gs
function onOpen() {
  BacklogIssuesLibrary.loadMenu();
}
```

## ライブラリ側コード
開発用の異なるスプレッドシート側のスクリプトとして github のコードが実装されている。
スクリプトエディタの実行可能APIの公開で次のようにバージョン管理が可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97877/63b1c59b-54f5-f134-5713-46074170fabe.png)

利用中のユーザに影響させない形で、バージョンアップが可能。

### ※疑問
公開済みのバージョンで「更新」を押しても、ライブラリのコードが更新されなかった。

## スプレッドシート側のライブラリ指定
スプレッドシートのスクリプトエディタで、次のようにライブラリ、およびバージョンを指定可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97877/0321d08f-4c77-81c9-04ea-39c2dfde6d45.png)

利用ユーザ側のタイミングで、バージョンアップすることができる。

## 開発／プロダクションの使い分け
開発向けには、開発用のスプレッドシートからの呼び出しで、
同スクリプト中のエントリポイント関数をコールするようにしている。

実際に利用するスプレッドシート側のスクリプトでは、
ライブラリ側のエントリポイント関数をコールするようにしている。

```main.gs
function loadMenu(isOwn) {
・・・
  var prefix = (isOwn === true) ? "" : "BacklogIssuesLibrary.";
・・・
  ui.createMenu('Backlog')
  .addItem('Backlogから課題情報を読み込み', prefix + 'load')
```

# ライセンス
GPLv3 で公開。
github で今までライセンスを明示していなかったのだけど、
これを機に、きちんとライセンスを設定してみた。
まだ、完全に理解できていないと思うが、次のような方針で使い分けてみようと思った。  

| 対象|ライセンス|
|-----------------|------------------|
|コード、ライブラリ|MIT, Apache等|
|単一のソリューション|GPL等|

コード単体をOSS化するなら、非コピーレフト系、
そのコードによってソリューションが成り立っているなら、コピーレフトでいいのかな、と。

実際、ソリューション単体として利用するなら全く問題なく、
多少コードを改変して利用する分には、個人・自社の範囲だろうし、
もし、大幅に改変・機能追加して別ソリューションとして独立させるにしても、
github に公開している時点で、fork されればソースは公開されるのだから問題ないのかなと。

# 構成管理
Google App Script と構成管理ツールの連携は、標準的な仕組みが無いようで、
下記の Chrome Extension がとても良さそうで入れてみたのだけど、
https://techblog.recruitjobs.net/development/maneged_google-apps-script_by_github

対象ファイルが全てステージング対象として認識されない等、自分の環境では、うまく動作しなかった。
※詳しく追っていないが、HTMLファイルが要因になっていたような気もする

なので、自前のクラウドサーバで、Node.js で、
Google Drive API で Google App Script のファイル一式をダウンロードするプログラムを作成、
素直に git で、github へ commit & push する方式を取った。
Google のアクセストークンの Expire の度にアクセストークンを取得・指定しなければいけないのが、少し面倒。
こちらはこちらで、コード整理できたら、別途 github に上げておきたい。
※なんとなく Node.js で作ったけど、こういう場合はやっぱり Python の方が利用しやすいのだろうか。
【Go】ginでgothを使ってチョー簡単にOAuth認証

## gothとは

gothはチョー簡単にGoでOAuth認証できる便利パッケージ。
https://github.com/markbates/goth

## goth x gin の問題点

gothのチョー便利関数`CompleteUserAuth` `BeginAuthHandler`を使うと爆速でOAuthを実装できる。
がしかし、そのままではginと良い感じに組み合わせて使うことができない。
具体的には、gothではOAuthのプロバイダー名（要はサービス名。Twitterとかfacebookとか）を取得するために`GetProviderName`関数を使っているが、デフォルトでは

```go:gothic.go#L262
	// try to get it from the url param "provider"
	if p := req.URL.Query().Get("provider"); p != "" {
		return p, nil
	}

	// try to get it from the url param ":provider"
	if p := req.URL.Query().Get(":provider"); p != "" {
		return p, nil
	}

	// try to get it from the context's value of "provider" key
	if p, ok := mux.Vars(req)["provider"]; ok {
		return p, nil
	}

	//  try to get it from the go-context's value of "provider" key
	if p, ok := req.Context().Value("provider").(string); ok {
		return p, nil
	}

```
https://github.com/markbates/goth/blob/master/gothic/gothic.go#L246

こんな感じの実装をしてる。URLパラメータでプロバイダー名を渡したい時、このままだと`http.Request`もラップした独自のコンテキストを使って頑張るginでは対応できない。 （`gin.Context.Param(string)`）

## 解決方法

ここ

```go:gothic.go#L277
	//  try to get it from the go-context's value of "provider" key
	if p, ok := req.Context().Value("provider").(string); ok {
		return p, nil
	}
```

コンテキストバリューから取ってこようとしてるので、これに乗っかります

## 実装

ヘルパー関数として

```go
func contextWithProviderName(c *gin.Context, provider string) (*http.Request){
	return	c.Request.WithContext(context.WithValue(c.Request.Context(), "provider", provider))
}
```

こんなのを用意して、`http.Request`にバリューコンテキストをくっつます。
そしてら、ハンドラを

```go
	r.GET("/auth/:provider", func(c *gin.Context) {
		provider := c.Param("provider")
		c.Request = contextWithProviderName(c, provider)

		gothic.BeginAuthHandler(c.Writer, c.Request)
	})
```

```go
r.GET("/auth/:provider/callback", func(c *gin.Context) {
		provider := c.Param("provider")
		c.Request = contextWithProviderName(c, provider)

		user, err := gothic.CompleteUserAuth(c.Writer, c.Request)
		if err != nil {
			fmt.Fprintln(c.Writer, err)
			return
		}
		log.Printf("%#v", user)
	})
```

こんな感じで作りましょう。これで完璧です。

## 補足

プロバイダ、Twitterしか使わねぇぜ！ってなったら

```go:gothic.go#L239
// GetProviderName is a function used to get the name of a provider
// for a given request. By default, this provider is fetched from
// the URL query string. If you provide it in a different way,
// assign your own function to this variable that returns the provider
// name for your request.
var GetProviderName = getProviderName
```
https://github.com/markbates/goth/blob/master/gothic/gothic.go#L244

これを使いましょう。
このように`GetProviderName`をカスタムできるようにパブリックにしてくれている！

と言うわけで`init`とかで

```go
func init() {
	gothic.GetProviderName = func(req *http.Request) (string, error) {
		return "twitter", nil
	}
}
```

こうして`GetProviderName`をオーバーライドすればおk

## まとめ

もともとあるgothのexampleにならってginバージョンで実装したものが

https://github.com/tockn/goth/blob/add-gin-example/examples/gin/main.go

これです。よかったら眺めてみてください。
ConsoleAppFrameworkを試してみる

[MagicOnion](https://github.com/Cysharp/MagicOnion) で個人的に気になってる Cysharp さんからバッチ用のフレームワークがリリースさたみたいです。

https://github.com/Cysharp/ConsoleAppFramework

とりあえず、ドキュメント読みながら hello world 的なものを動かしたいと思います。

## 環境

- os: macOSX Mojave
- macのdotnet: version 2.2.101

[前](https://qiita.com/orange634nty/items/ad81ded6545fc1c90a81)と同じようにmacで開発していきます。

## 実装

とりあえずReadMeにある一番シンプルなコードを動かしてみます。

https://github.com/Cysharp/ConsoleAppFramework/blob/master/ReadMe.md

まず、`dotnet`コマンドを使って新規プロジェクトを作成します。

```
$ dotnet new console
```

試しにちゃんと動くか`dotnet run`で確認してみます。
問題がなければ「Hello World!」と表示されます。

```
$ dotnet run
Hello World!
```

次にパッケージを導入します。

https://www.nuget.org/packages/ConsoleAppFramework

の.NET CLIにあるものをコピペします。

```console
$ dotnet add package ConsoleAppFramework --version 2.0.0
```

これ以外にも複数のパッケージを使うので導入します。

```console
$ dotnet add package Microsoft.Extensions.Logging
$ dotnet add package Microsoft.Extensions.Hosting
```

また、今回のコードでは`async`を使うので、C#のバージョンを7.1以上にする必要があります。
[.Net CoreプロジェクトでC#のバージョンを変更する方法](https://qiita.com/shuhey/items/b55c51b555b5120179c4)
こちらの記事を参考に`.csproj`ファイルに`<LangVersion>7.3</LangVersion>`を追加します。
7.3にしたのは[sandboxにあるサンプルの.csproj](https://github.com/Cysharp/MicroBatchFramework/blob/master/sandbox/SingleContainedApp/SingleContainedApp.csproj)で7.3が指定されていたからです。

最後に`Program.cs`を編集します。
これはReadMeに書いてあるまんまをコピペします。

```csharp:Program.cs
using ConsoleAppFramework;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading.Tasks;

// Entrypoint, create from the .NET Core Console App.
class Program : ConsoleAppBase // inherit ConsoleAppBase
{
    static async Task Main(string[] args)
    {
        // target T as ConsoleAppBase.
        await Host.CreateDefaultBuilder().RunConsoleAppFrameworkAsync<Program>(args);
    }

    // allows void/Task return type, parameter is automatically binded from string[] args.
    public void Run(string name, int repeat = 3)
    {
        for (int i = 0; i < repeat; i++)
        {
            Console.WriteLine($"Hello My ConsoleApp from {name}");
        }
    }
}
```

あとは`dotnet run`で実行します。

```console
$ dotnet run -name "orange634nty" -repeat 5
Hello My Batch from orange634nty
Hello My Batch from orange634nty
Hello My Batch from orange634nty
Hello My Batch from orange634nty
Hello My Batch from orange634nty
```

ついでにpublishも試してみました。

```console
$ dotnet publish --runtime osx.10.13-x64
# bin/Debug/netcoreapp2.2/osx.10.13-x64/publish/ にビルドされたものが出力される
$ ./bin/Debug/netcoreapp2.2/osx.10.13-x64/publish/console-app-framework-test -name "orange634nty" -repeat 5
Hello My Batch from orange634nty
Hello My Batch from orange634nty
Hello My Batch from orange634nty
Hello My Batch from orange634nty
Hello My Batch from orange634nty
```

こちらも問題なく動きます。

完成品はこちらのリポジトリに上げておきます。

https://github.com/orange634nty/console-app-framework-test

## おまけ

### versionを上げる方法

`csproj` ファイルの `ConsoleAppFramework` の `Version` を変更します。

```xml:例
<PackageReference Include="ConsoleAppFramework" Version="2.0.0" />
```

`dotnet restore` でパッケージの依存関係を復元します。
問題なく復元されたら、OKです。

## 感想

まだ動かしただけなので、わかっていませんがかなり簡単に導入できました。
引数をパースしたり、helpを作ったり意外とやろうとなると面倒なので、非常にありがたいですね！
Hexo で markdown-it の renderer をカスタムする

## 前提と環境

* [markdown-it](https://www.npmjs.com/package/markdown-it) は、2019年現在最もよく利用されている Markdown パーサーである
  * renderer の設定を変えることでヘッダーやテーブルのレンダリング(どのような DOM を描くか)を変更できる
* Hexo は、静的サイトジェネレーターである
  * [hexo-renderer-markdown-it](https://www.npmjs.com/package/hexo-renderer-markdown-it) を使うことで、Markdown のレンダリングに markdown-it を利用することができる

## 問題

Hexo + markdown-it 環境で、ヘッダーやテーブルのレンダリングを変更する方法がわからない

## 解

### 設定ファイルの変更
* 以下のように設定ファイルを変更することで、カスタムプラグインを markdown-it にセットできる
* 仕組みとしては、`plugins` にリストした文字列が hexo-renderer-markdown-it によって `require` される

```_config.yml
# markdown-it
markdown:
  plugins:
    - '../../../scripts/markdown-it/plugins/custom-header-renderer'   # relative path from 'node_modules/hexo-renderer-markdown-it/lib'
    - '../../../scripts/markdown-it/plugins/custom-table-renderer'    # relative path from 'node_modules/hexo-renderer-markdown-it/lib'
```

### カスタムプラグインの Example

#### テーブルのレンダリングを変更するカスタムプラグイン

```/scripts/markdown-it/plugins/custom-table-renderer.js
/**
 * Reference: https://github.com/medfreeman/markdown-it-toc-and-anchor/blob/708434d7965924e4bf79090b5fd758a2a1cec011/src/index.js#L285-L304
 */
module.exports = function plugin(md) {

  md.renderer.rules.table_open = function(tokens, idx) {
    return '<table class="table table-sm table-bordered">';
  };

}
```

#### ヘッダーのレンダリングを変更するカスタムプラグイン

Markdown 内の `# ヘッダー` を、`<h1>ヘッダー</h1>` から `<h1><span>ヘッダー</span></h1>` に変更する

```/scripts/markdown-it/plugins/custom-header-renderer.js
/**
 * Reference: https://github.com/medfreeman/markdown-it-toc-and-anchor/blob/708434d7965924e4bf79090b5fd758a2a1cec011/src/index.js#L285-L304
 */
module.exports = function plugin(md) {

  // fetch original rules
  const originalHeadingOpen = md.renderer.rules.heading_open ||
    function(...args) {
      const [ tokens, idx, options, , self ] = args;
      return self.renderToken(tokens, idx, options);
    };
  const originalHeadingClose = md.renderer.rules.heading_close ||
    function(...args) {
      const [ tokens, idx, options, , self ] = args;
      return self.renderToken(tokens, idx, options);
    }

  // override rules
  md.renderer.rules.heading_open = function (...args) {
    const tag = originalHeadingOpen.apply(this, args);
    return `${tag}<span>`;
  }
  md.renderer.rules.heading_close = function (...args) {
    const tag = originalHeadingClose.apply(this, args);
    return `</span>${tag}`;
  }
}
```
Gitのバージョン管理システムを使用した開発環境について

##背景
エンジニアの人数がこれから増えることもあり、昔の開発環境では対応できない可能性があるため、新体制を制作する必要がある
しかし、なにが変化したのかきちんと理解していないと間違った作業をしてしまうため。
Qiitaに備忘録としてメモを残します。
##開発フローについて
###過去の開発フロー
1. 自分のBranchにローカルからpushを行う。
* 自分のBranchから各エンジニアのBranchにMerge Requestを送信する×エンジニア人数+staging
* 各エンジニアは自分のBranchからローカル環境にpullを行う
![開発環境-過去の開発環境.png](https://qiita-image-store.s3.amazonaws.com/0/263673/bc45606c-510c-3185-a0d0-af7d9c7aaf82.png)

###現在の開発フロー
1. 自分のBranchにローカルからpushを行う。
* 自分のブランチからstagingにMerge Requestを送信する。
* 各エンジニアはstagingから自分のBranchにMerge Requestを送信する。
* 自分のBranchからローカル環境にpullを行う
![開発環境-現在の開発環境.png](https://qiita-image-store.s3.amazonaws.com/0/263673/4d07f86a-d6e2-1494-f498-98815d3e3623.png)

##メリット
・各エンジニアのBranchにMerge RequestをすることによってMerge Requestの送信し忘れがなくなる。
・Merge Requestを送る人とMerge Requestを受け取る人の手間が平等になる。
・....etc
##デメリット
・stagingからMerge Requestを自分のBranchにしわすれてローカルにpullしたつもりになる。



#実装した感想
実装して日が浅い為、わからない。
これから追記をしていこうとおもう。


#お願い
誤字脱字や間違い等を見つけたら教えてください。
できるだけ早く修正を行いたいと思います。
ローディングスピナー

![spinner.gif](https://qiita-image-store.s3.amazonaws.com/0/265793/b50c2135-ac01-2885-b68d-cea9ddd4983b.gif)

```bash
#!/bin/bash
spinner='⣾⣿⣽⣿⣻⣿⢿⣿⡿⣿⣿⢿⣿⡿⣿⣟⣿⣯⣿⣷⣿⣾⣷⣿'
l=${#spinner}
i=0
while :
do
  printf "\010\010"
  printf "${spinner:$i:2}"
  i=$(((i+2)%l))
  sleep 0.1
done
```

これをcssアニメーションを使ってscssで書くとこんな感じ

```html
<div class="spinner"></div>
```

```scss
$str: (⣾⣿ ⣽⣿ ⣻⣿ ⢿⣿ ⡿⣿ ⣿⢿ ⣿⡿ ⣿⣟ ⣿⣯ ⣿⣷ ⣿⣾ ⣷⣿ ⣾⣿);
@keyframes spin {
  @for $i from 1 through length($str) {
    #{100*($i - 1)/(length($str)- 1)}% {
      content: "#{nth($str, $i)}";
    }
  }
}

.spinner {
  width: 100px;
  height: 100px;

  &::before {
    font-size: 100px;
    display: block;
    content: "#{nth($str, 1)}";
    animation: spin 2s linear infinite;
  }
}

```

<p class="codepen" data-height="558" data-theme-id="0" data-default-tab="css,result" data-user="rnitta" data-slug-hash="JxqvLe" style="height: 558px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="spinner">
  <span>See the Pen <a href="https://codepen.io/rnitta/pen/JxqvLe/">
  spinner</a> by rnitta (<a href="https://codepen.io/rnitta">@rnitta</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
GitHubとssh接続していくぅ


## はじめに
GitHubとssh接続を行うためには、以下の手順が必要。
（１）GitBashを起動
（２）管理フォルダの作成
（３）公開鍵と非公開鍵を作成
（４）ssh-agentを起動し、非公開鍵をこれに追加
（５）公開鍵のキーの中身をクリップボードにコピー
（６）公開鍵をGitHubのsshキーページに登録
（７）GitHubとのssh接続がうまくいったか否かの確認

## （１）GitBashを起動

## （２）管理フォルダの作成

```
$ mkdir .ssh #公開鍵と非公開鍵を入れるフォルダを作成

$ cd .ssh #フォルダにディレクトリ変更
```

## （３）公開鍵と非公開鍵を作成

```
$ ssh-keygen -t rsa
```

以下が出力され、鍵の名前を```GitHub_id_rsa```と入力したところ、無事に作成された。

```
Enter file in which to save the key (.ssh\id_rsa): GitHub_id_rsa 
//公開鍵と非公開鍵の名前を決める。
//id_rsaの前に名前をつけないと、なぜかエラーや文字化けが起きた

Enter passphrase (empty for no passphrase): 
//パスフレーズは入力せずにEnterとした。

Enter same passphrase again: 
//パスフレーズは入力せずにEnterとした。
```

拡張子pubが公開鍵を表しているっぽい。

![Git hub環境構築.png](https://qiita-image-store.s3.amazonaws.com/0/292201/e6ac13f2-2e14-3bb2-3e2a-67203516bc75.png)

## （４）ssh-agentを起動し、非公開鍵をこれに追加
ssh-agent を起動して秘密鍵を登録しておけば、sshサーバへの接続時に自動的に秘密鍵を適用して認証処理を行ってくれるため、接続の度にパスフレーズを入力する必要がなくなる
![SSH Agents In Depth.gif](https://qiita-image-store.s3.amazonaws.com/0/292201/4547d778-4f2a-5d98-540a-3173c55a5452.gif)
画像引用元：SSH Agents In Depth，https://dev.to/samuyi/ssh-agents-in-depth-4116

```
$ eval "$(ssh-agent -s)"
//ssh-agentを起動

Agent pid 6508
//番号が返された

$ ssh-add GitHub_id_rsa
//ssh-agentに非公開鍵を追加

Identity added: GitHub_id_rsa (GitHub_id_rsa)
//認証されたと返された
```

## （５）公開鍵のキーの中身をクリップボードにコピー

```
$ clip < GitHub_id_rsa.pub
//パソコンのアカウント名が日本語だと、sshキー内のアカウント名部分が文字化けするっぽい
```


## （６）公開鍵をGitHubのsshキーページに登録
タイトルに適当な名前を付けて、キー欄に公開鍵の中身をペーストする。
ペースト後、Add SSH Keyをクリック。

![Git hub環境構築2.png](https://qiita-image-store.s3.amazonaws.com/0/292201/4304bee4-300e-4bea-1183-74923b949a6d.png)

## （７）GitHubとのssh接続がうまくいったか否かの確認
途中、```Are you sure you want to continue connecting (yes/no)? ```と聞かれるので、```yes```とする

```
$ ssh -T git@github.com
//GitHubとのssh接続がうまくいったか否かを確かめる。

The authenticity of host 'github.com (192.30.255.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.113' (RSA) to the list of known hosts.
Hi Hiroki-IT! You've successfully authenticated, but GitHub does not provide shell access.

//成功
```

##引用リンク
- https://qiita.com/shizuma/items/2b2f873a0034839e47ce
Azure Storage の機能がPowerAppsではどう使えるのか調べてみた

# Azure ストレージとは？
Azureで使用できる汎用データ格納サービスです。
以下の機能を持っています。

![](https://i.imgur.com/TaTvNv8.png)

## BLOB
REST APIでデータを表示したり更新したり削除したりできます。
PowerAppsだとAzure Blob Storageというコネクタが該当します。
![](https://i.imgur.com/jiw1Sf3.png)

基本的にここに格納した画像や音声データを参照したり
逆にPowerAppsで取得した画像や音声データを保存したりできます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">録音したデータをBlobに上げて<br>そのデータを取得して再生することもできたぞ！<a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> <a href="https://twitter.com/hashtag/Azure?src=hash&amp;ref_src=twsrc%5Etfw">#Azure</a> <a href="https://twitter.com/hashtag/Blob?src=hash&amp;ref_src=twsrc%5Etfw">#Blob</a><a href="https://twitter.com/hashtag/Recording?src=hash&amp;ref_src=twsrc%5Etfw">#Recording</a> <a href="https://t.co/mQNZmFehJ7">pic.twitter.com/mQNZmFehJ7</a></p>&mdash; りなたむ@steed400 (@R_t_A_n_M) <a href="https://twitter.com/R_t_A_n_M/status/1090979663403397122?ref_src=twsrc%5Etfw">2019年1月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> でボイスレコーダーを作ったぞ！<br><br>I made voice recorder using powerapps!! <a href="https://t.co/vEJcZ5S0Xg">pic.twitter.com/vEJcZ5S0Xg</a></p>&mdash; りなたむ@steed400 (@R_t_A_n_M) <a href="https://twitter.com/R_t_A_n_M/status/1091001692152225794?ref_src=twsrc%5Etfw">2019年1月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## ファイル
標準のファイル共有サービス（SMB）で接続するためのサービスです。
Windowsのエクスプローラーにてネットワークドライブとしてマウントすることも可能です。
PowerAppsだとAzure File Storageというコネクタが該当します。
![](https://i.imgur.com/HnjuikB.png)

ここにおいているExcelファイルを参照してデータソースとして利用できるようです。
![](https://i.imgur.com/uU7gqOa.png)

## テーブル
簡易的なテーブルとしてデータを管理できるサービスです。
PowerAppsでは標準のコネクタでは使用できないようです。
別途FlowなどでAPIを投げることで使用できると思います。
※試していない。

## キュー
アプリケーション間でデータをやりとりできるメッセージングサービスを提供します。
詳しくはこちらをご参照ください。
[くらう道-Azure キュー ストレージ とは？](https://www.cloudou.net/storage/blob005/)

PowerApps ではAzure キューというコネクタのようです。
![](https://i.imgur.com/oNvo395.png)

メッセージキューをやり取りすることで、こんな風にアプリ間連携も可能です。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> 間のデータやり取り<a href="https://twitter.com/hashtag/Azure?src=hash&amp;ref_src=twsrc%5Etfw">#Azure</a> Queueストレージという選択肢もありますねぇ <a href="https://t.co/m019keVzwh">pic.twitter.com/m019keVzwh</a></p>&mdash; りなたむ@steed400 (@R_t_A_n_M) <a href="https://twitter.com/R_t_A_n_M/status/1098626389870137344?ref_src=twsrc%5Etfw">2019年2月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ
というわけで、PowerAppsで使えるAzure ストレージの種類をまとめてみました。

今回の調査結果を踏まえて

* BLOBはメディアのデータソースに
* ファイルはExcelベースのTableデータソースに
* キューは即応性の高いアプリ間データ連携として

それぞれお使いいただけるのかなと思いました。

みなさんの作るアプリでデータの取り扱いも変わってくるかと思います。
この記事で、データソースの選択の助けになれば幸いです。
fish shell のインストールと初期設定

# fish shellのインストール

## はじめに
fish shellのインストール方法と最低限の設定についてまとめました。
まだ使い始めたばかりですが、デフォルトでもかゆいところに手が届いていていい感じ。
以下のような人におすすめです。

- bashの設定に凝っていない
- 手軽に便利にしたい

ただbashと記述方法が変わる部分もあるので注意してください。
[Shell Translation Dictionary](https://github.com/fish-shell/fish-shell/wiki/Shell-Translation-Dictionary)

### この記事でわかること
- fish shellのインストール
- fisherのインストール
- pecoのインストールとfish shellの連携方法

### 環境
OS：macOS Mojave（10.14）
brew が使える状態であること

## fish shell

> fish is a smart and user-friendly command line
> shell for Linux, macOS, and the rest of the family.

[fish-shell/fish-shell](https://github.com/fish-shell/fish-shell)

## インストール

```shell
$ brew install fish
$ fish -v
```

```shell
# デフォルト shellをfish shellに変更
$ sudo vi /etc/shells # 末尾に/usr/local/bin/fishを追加
$ chsh -s /usr/local/bin/fish # デフォルトシェルをfishに変更
```

## fisher

### fisherとは

> Fisher is a package manager for the [fish shell](https://fishshell.com/). It defines a common interface for package authors to build and distribute shell scripts in a portable way. You can use it to extend your shell capabilities, change the look of your prompt and create repeatable configurations across different systems effortlessly.

[jorgebucaran/fisher](https://github.com/jorgebucaran/fisher)

### インストール

```shell
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
$ fisher -v
```

## peco

### pecoとは

> Simplistic interactive filtering tool

[peco/peco](https://github.com/peco/peco)
[oh-my-fish/plugin-peco](https://github.com/oh-my-fish/plugin-peco)

peco自体はfish shellと関係ない独立したツールですが、history検索が便利になるのでついでにインストールします。

### インストール

```shell
$ brew install peco 
$ fisher add oh-my-fish/plugin-peco 
```

```shell
# ~/.config/fish/config.fish
function fish_user_key_bindings
  bind \cr 'peco_select_history (commandline -b)'
end
```
markdown 備忘録

#はじめに
Qiitaをちょこちょこ使おうと思うので忘れないために作ってみた。


# 見出し
頭に「#」をつけると見出しに変換される。
「#」の数に応じて大きさが変化する。

### 例
```
# 大きい
## ちょっと大きい
### 普通
#### ちょっと小さい
##### 小さい
###### かなり小さい
```

### 結果
# 大きい
## ちょっと大きい
### 普通
#### ちょっと小さい
##### 小さい
###### かなり小さい

#イタリック、太字
「*」もしくは、「_」で文字を囲めばイタリックに
「**」もしくは「_」で文字を囲めば太字になる。

### 例
```
*イタリック*
_イタリック_
**太字**
__太字__
```

### 結果
*イタリック*
_イタリック_
**太字**
__太字__

# リスト
リストは**箇条書きリスト**と**数字付きリスト**の２種類がある。
**箇条書きリスト**は文頭に「-」、「+」もしくは、「*」を置く。
**数字付きリスト**は「数字. リスト名」という風に書く。

__注意:記号の後に必ず半角スペースを１つ入れる。__
### 例
```
(箇条書きリストの時)
- リスト１
  - リスト１−１
     - リスト１−１−１
- リスト２
- リスト３


(数字付きリストの時)
1. リスト１
2. リスト２
3. リスト３
　　1. リスト３−１
　　2. リスト３−２
　　   1.リスト３−２−１
```

### 結果
- リスト１
  - リスト１−１
     - リスト１−１−１
- リスト２
- リスト３

1. リスト１
2. リスト２
3. リスト３
    1. リスト３−１
    2. リスト３−２
        1. リスト３−２−１

#段落と改行

## 段落
段落を変えるには空行を一行以上入れる。
### 例
```
お腹が空いた
ご飯が食べたい
朝ごはんは食べたっけ？

お腹が空いた

ご飯が食べたい


朝ごはんは食べたっけ？

```

### 結果
お腹が空いた
ご飯が食べたい
朝ごはんは食べたっけ？

---

お腹が空いた

ご飯が食べたい


朝ごはんは食べたっけ？

## 改行
改行をするには、改行する前の行の最後に半角スペースを２つ入れる。

### 例
```
お腹が空いた  
ご飯が食べたい
```

### 結果
お腹が空いた  
ご飯が食べたい

# 引用
引用したい文の文頭に「>」を入れる。
二重引用を使いたい時は、「>>」を文頭に置く。

###  例
```
>引用
>>二重引用
```

### 結果
>引用  
>>二重引用

# 水平線
水平線を描きたい時には「*」「-」「_」を３つ並べる。
割と自由がきく

### 例
```
***
---
___
* * *
- - -
_ _ _ 
```

### 結果
***
---
___
* * *
- - -
_ _ _ 


# 表
表を書くときの注意
1段目が**ヘッダ**、2段目が**中央揃えなどの指定**という風に書く。

### 例
```
|ヘッダ1|ヘッダ2|ヘッダ３|
|:--:|:--|--:|
|中央揃え|右揃え|左揃え|
```

### 結果
|ヘッダ1|ヘッダ2|ヘッダ３|
|:--:|:--|--:|
|中央揃え|右揃え|左揃え|

# リンク
基本はURLを貼るだけで大丈夫だが、URLに名前をつけたいときは[**名前**](URL)という風に書くと名前が表示される。

### 例
```
[Google](https://www.google.co.jp/)
```

### 結果
[Google](https://www.google.co.jp/)


#最後に
初めてQiitaを書いたのでいろいろ拙かったのでこれから精進していくという意味も込めてこの備忘録を作りました。
また何かあったらちょくちょく追加するかも…
Haskell 環境構築 メモ

## はじめに
有名なHaskell入門書「すごいHaskellたのしく学ぼう」を読みました。
本を読んだらコードを書こう！ということでHaskellの開発環境を整えます。
この記事は開発環境を整える上での作業メモです。

基本的には[Qiita: vscode と haskell-ide-engine で Haskell 開発環境を構築する](https://qiita.com/waddlaw/items/b83cd10311200095fe87)を参考にさせていただきました。

## 環境
- macOS バージョン 10.14

## Stackのインストール
Stackとは何か？については[Qiita: Haskellのビルドツール"stack"の紹介](https://qiita.com/tanakh/items/6866d0f570d0547df026)が分かりやすいと思います。

```shell
# brewを利用してstackをインストールする
$ brew install haskell-stack

# バージョン確認
$ stack --version 
1.9.3 x86_64

# 更新
$ stack update
```

Stack経由でインストールしたライブラリなどは、~/.local/bin/以下に保存されるので、~/.local/binにパスを通して置く必要があります。
~~見落として手順すっ飛ばしてしばらくハマりました~~
忘れずにパスを通しましょう。
僕はfish shellを使っているので、以下を設定ファイルに追記しました。

```conf
# ~/.config/fish/config.fish
set PATH ~/.local/bin $PATH
```

## GHCのインストール
デフォルトで使用するGHCのバージョンを変更します。
~/.stack/global-project/stack.ymlを開いて、resolverの部分を以下のように書きました。

```conf
resolver: lts-12.24
```
resolverとはStackageのsnapshotのことです。
Stackageとは、依存関係で苦しまないよう調整されたパッケージの集合（snapshot）のようです。

[Stackage Server](https://www.stackage.org/)
スナップショットのバージョンは上記から確認できます。
どれを選べばよいのか正直わからなかったので、とりあえずlts（Long Term Support）がついてるものの中から新しめなものを適当に選びました。

設定ファイルを書き換えた上でインストールを行ないます。

```shell
# stack.ymlにしたがってGHCをインストールする
$ stack setup

# バージョン確認
# stack経由でghcにオプションを渡す場合は -- を挟む
$ stack ghc -- --version
The Glorious Glasgow Haskell Compilation System, version 8.4.4
```

## haskell-ide-engineのインストール
次に[haskell-ide-engine](https://github.com/haskell/haskell-ide-engine)をインストールします。

```shell
# hieのソースコードをダウンロード
$ git clone https://github.com/haskell/haskell-ide-engine --recursive
$ cd haskell-ide-engine

# GHC 8.4.4用でインストール（時間かかりました。）
$ make hie-8.4.4
$ make build-doc-8.4.4

# バージョン確認
$ hie --version
Version 0.4.0.1, Git revision 5b8cfbc59fc4f1913dffd0f8c68e567cb046ca2d (2273 commits) x86_64 ghc-8.4.4
```

## VS Codeのインストール
最後にVS Codeをインストールします。
[Visual Studio Code](https://code.visualstudio.com/)
ここでは1.30.0をインストールしました。

起動後EXTENSIONSからHaksell Laguage Serverをインストール。
VS Codeを再起動して作業完了です。

## 実際に使ってみた感想
コードはまだちょっとしか書けてないですが、補完も早くていい感じです。
最初ちょっとだけ躓いたのが、自動補完などのhieの機能は、ファイルをVS Codeで開いた時点で構文エラーが存在する場合には効かないようです。（そういうものなのか、環境依存の問題なのかわかりませんが…）
インストールできたはずなのにhieが動かない！という場合には、構文エラーが無いシンプルなファイルで試してみるといいかもしれません。

## 参考
- [Qiita: vscode と haskell-ide-engine で Haskell 開発環境を構築する](https://qiita.com/waddlaw/items/b83cd10311200095fe87)
- [The Haskell Tool Stack](https://docs.haskellstack.org/en/stable/README/)  
- [Qiita: 本気で Haskell したい人向けの Stack チュートリアル](https://qiita.com/waddlaw/items/49874f4cf9b680e4b015)  
- [Qiita: Haskellのビルドツール"stack"の紹介](https://qiita.com/tanakh/items/6866d0f570d0547df026)  
- [Stackage Server](https://www.stackage.org/)
- [haskell-ide-engine](https://github.com/haskell/haskell-ide-engine)
- [Visual Studio Code](https://code.visualstudio.com/)
[golang]エラトステネスの篩を実装する

Golangのチュートリアル([A Tour of Go](https://go-tour-jp.appspot.com/list))を一通りやり終えたので、実力試しとしてエラトステネスの篩を実装してみました。
Pythonでもう既に実装しているのですがGoでも実装してみます。([[Python]素数を求めてみる](https://qiita.com/kageyasai2/items/9e4559abb2e54af45aae))
開発環境には前回書いた記事([DockerでGolangの環境を構築する](https://qiita.com/kageyasai2/items/ece44ea8dc44871d7aa7))で作成したものを使っています。

#動作環境
Windows10 Pro
Docker for windows

#エラトステネスの篩の実装
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)に書いてあるアルゴリズムを元に実装しました。

```go:Eratosthenes.go
package main

import(
	"fmt"
	"math"
)

//配列の特定の要素を削除する関数
func remove(s_list []int, index int) (tmp []int) {
	tmp = append(s_list[:index],s_list[(index+1):]...)
	return
}

func get_prime(number int) ([]int,int){
    //初期化
	prime_list := []int{}
	search_list := []int{}
	//2からnumberまでの数字の配列を作る
	for i := 2; i < number+1; i++{
		search_list = append(search_list,i)
	}
	//探索リストの先頭値が√numberを超えたら終了
	limit := int(math.Sqrt(float64(number)))
	for search_list[0] <= limit{
		//探索リストの先頭を素数リストに移動
		p_num := search_list[0]
		prime_list = append(prime_list,p_num)
		//探索リストの先頭を削除
		search_list = remove(search_list,0)
		//p_numの倍数を探索リストから篩落とす
		search_list_length := len(search_list)
		tmp := []int{}
		for i := 0; i < search_list_length; i++{
			if search_list[i] % p_num != 0{
				tmp = append(tmp,search_list[i])
			}
		}
		search_list = tmp
	}
	//探索リストの残りを素数リストに追加
	prime_list = append(prime_list,search_list...)
	return prime_list,len(prime_list)
}

func main(){
	list,count := get_prime(100)
	fmt.Println(list)
	fmt.Printf("count:%d個\n",count)
}
```
golangには特定の要素を削除する関数が無いみたいなのでremove関数を作成しています。
削除したい要素より前の配列と後の配列を合体させてるだけです。

golangでは変数を初めて宣言する時に「a := 1」のように 「=」の前に「:(コロン)」を付けないと、「未定義の変数やないか!!」という風に怒られてしまいます。
何回も怒られました＾＾；
#実行結果
```
root@0c296a35f6f5:/go/src/app# go run Eratosthenes.go
[2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97]
count:25個
```
正しく素数を求められていますね。
Pythonで作成したプログラムの実行結果と比較しても同じだったので正しく求められていると思います。


---
以上です
特に躓くことなく実装できました。C言語に似たような感じだったのですんなり理解できましたね。

いつかGoでapiサーバとか作ってみたいですね