OmniAICreator/Qiita-1.07M huggingface dataset:
django usernameを表示したかった

画像をアップロードすると同時にその投稿者の名前も登録したかった

モデルは

```python:models.py
class Post(models.Model):
	image = models.ImageField(upload_to="image/")
	created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='posts')
```
(わかりやすくするために色々省いてる)

viewにはここも色々省くが、最終的にこんな感じの記述をすればよかった

```python:views.py
		photo = Post()
		photo.image = form.cleaned_data['image']
		photo.created_by = request.user
		photo.save()
```

最初、

```
photo.created_by = request.user.username
```
みたいなことを書いてて、こうすると
"Post.created_by" must be a "User" instance.ってエラーが出て
ああこれはまだまだ基礎がなってないなと反省して涙した。

あとはindex.htmlでuser.usernameを書いてあげれば表示できます。
よく使うsystemctlコマンドまとめ

# 基本的なsystemctlコマンド

よく使うコマンドをまとめました。

systemctlはsystemdを操作するコマンドで、サービスの起動や停止、状態確認などを行うことが出来ます。
#書き方

```console
# systemctl コマンド {ユニット名}.service
```

末尾の.serviceは省略できます。
※一般ユーザで起動、停止などを行う場合はsudoが必要です。

# コマンド
##・サービスのステータス確認

```console
# systemctl status ｛ユニット名｝
```


##・サービスの起動

```console
# systemctl start ｛ユニット名｝
```

##・サービスの再起動

```console
# systemctl restart ｛ユニット名｝
```

##・サービスの停止

```console
# systemctl stop ｛ユニット名｝
```

##・サービス自動起動を有効にする

```console
# systemctl enable ｛ユニット名｝
```

##・サービス自動起動を無効にする

```console
# systemctl disable ｛ユニット名｝
```
asyncでお手軽非同期プログラミング with Haskell

こんにちは、pxfncです。今日は[Hackage](https://hackage.haskell.org/)が502を返してくる不機嫌な日でした(早く機嫌なおして)

asyncパッケージを使って非同期で遊んでみたので紹介しようと思います。

## 逐次処理の普通のプログラム


```hs
import           Control.Concurrent             ( threadDelay )

sleep :: Int -> IO ()
sleep n = threadDelay (1000000 * n)

main :: IO ()
main = do
    putStrLn "start"
    sleep 1
    putStrLn "1 second later" -- startから1秒後に表示
    sleep 2
    putStrLn "2 second later" -- startから3秒後に表示
    sleep 3
    putStrLn "3 second later" -- startから6秒後に表示
    putStrLn "done"           -- startから6秒後に表示
```

このプログラムは合計6秒かけて実行されます。これをasyncパッケージを使って非同期にしていきます。

## async関数で非同期にする

n秒待ってから`"n second later"`と表示する部分を`sleepAndPut`関数にくくり出してみます。そして、`sleepAndPut 1`だけ非同期に実行してみましょう。やり方は簡単で、`async` 関数を、非同期にしたい`IO a`の値に適用するだけです。つまり、`async (sleepAndPut 1)`とするだけです

```haskell
import           Control.Concurrent             ( threadDelay )
import           Control.Concurrent.Async       ( async )

sleep :: Int -> IO ()
sleep n = threadDelay (1000000 * n)

sleepAndPut :: Int -> IO ()
sleepAndPut n = do
    sleep n
    putStrLn $ show n <> " second later"

main :: IO ()
main = do
    putStrLn "start"
    async $ sleepAndPut 1 -- startから1秒後に表示
    sleepAndPut 2         -- startから2秒後に表示
    sleepAndPut 3         -- startから5秒後に表示
    putStrLn "done"       -- startから5秒後に表示

```

実行結果からわかることは`async $ sleepAndPut 1`の呼び出しが瞬時に終了して次のアクションが実行されていることです。今度は1秒から3秒全て非同期にしてみましょう。先ほどのmain関数を以下のように書き換えて実行すると

```haskell
main :: IO ()
main = do
    putStrLn "start"
    async $ sleepAndPut 1 -- startから1秒後に表示
    async $ sleepAndPut 2 -- startから2秒後に表示
    async $ sleepAndPut 3 -- startから3秒後に表示
    putStrLn "done"       -- start直後に表示!!
```

最初にstartが表示された後に即座にdoneが表示され、その後sleepのログが出てしまっています。このような表示になるのは、sleepAndPutの全ての呼び出しが即座に終了するからです。

## waitを使って待機をする

実は`async :: IO a -> IO (Async a)`の戻り値である`Async a`を使うことで非同期の終了を待機することが可能です。非同期の実行を待つ関数が、この`wait :: Async a -> IO a`です。

先ほどのプログラムを非同期処理が完了してから終了するように書き換えてみます

```haskell
import           Control.Concurrent             ( threadDelay )
import           Control.Concurrent.Async       ( async, wait )

sleep :: Int -> IO ()
sleep n = threadDelay (1000000 * n)

sleepAndPut :: Int -> IO ()
sleepAndPut n = do
    sleep n
    putStrLn $ show n <> " second later"

main :: IO ()
main = do
    putStrLn "start"
    a1 <- async $ sleepAndPut 1 -- startから1秒後に表示
    a2 <- async $ sleepAndPut 2 -- startから2秒後に表示
    a3 <- async $ sleepAndPut 3 -- startから3秒後に表示
    wait a1
    wait a2
    wait a3
    putStrLn "done"             -- startから3秒後に表示
```

## 手っ取り早く非同期がしたいんだが？

`mapM`の代わりに`mapConcurrently`、`forM`の代わりに`forConcurrently`、`replicateM`の代わりに`replicateConcurrently`があり、それぞれアクションを捨てる`~~~Concurrently_`関数がそれぞれ用意されています。先ほど処理はこのように書くことができます。

```haskell
main :: IO ()
main = do
    putStrLn "start"
    forConcurrently_ [1 .. 3] sleepAndPut
    putStrLn "done"
```

## とりあえずここまで

想像より簡単に非同期処理ができることがわかったかと思います。非同期処理のキャンセルや変数については別記事にて紹介する予定です。
ROSのtfで手動で座標変換を行う

tfの使い方に関する記事は多く見られる。しかし、いずれもtf::TransformBroadcasterとtf::TransformListenerを使ったものであり、テスト目的などちょっとした座標変換の用途に使用するには規模が大きすぎる。
本記事では、センサ座標→ロボット座標への変換を例に、tfを使った手動による静的な座標変換の方法を記す。

## 例: センサ座標系で観測されたターゲット位置、速度をロボット座標系に変換する

センサによってターゲットが観測され、その状態(位置、向き、速度)はセンサ座標系でそれぞれ以下のように表されるとする:

- 位置(x,y,z): x_os, y_os, z_os
- 姿勢(roll,pitch,yaw): roll_os, pitch_os, yaw_os
- 速度(x,y,z): Vx_os, Vy_os, Vz_os

センサ位置・向きは、ロボット座標系で以下のように表されるとする:

- 位置(x,y,z): X_s, Y_s, Z_s
- 姿勢(roll,pitch,yaw): ROLL_s, PITCH_s, YAW_s

このとき、ロボット座標系におけるターゲットの状態を

- 位置(x,y,z): x_or, y_or, z_or
- 姿勢(roll,pitch,yaw): roll_or, pitch_or, yaw_or
- 速度(x,y,z): Vx_or, Vy_or, Vz_or

とすると、センサ座標からロボット座標へのターゲットの座標変換は以下のコードで実現できる。
(なお回転はroll,pitch,yaw角なので、ZYXオイラー角となる)

```c++:sample.cpp

double X_s, Y_s, Z_s; // センサ取り付け位置
double ROLL_s, PITCH_s, YAW_s; // センサ取り付け角度

// 変換行列を構築する
tf::Transform transformer;
transformer.setOrigin(tf::Vector3(X_s, Y_s, Z_s));
transformer.setRotation(tf::createQuaternionFromRPY(ROLL_s, PITCH_s, YAW_s));
tf::Transform velocity_transformer;
velocity_transformer.setRotation(tf::createQuaternionFromRPY(ROLL_s, PITCH_s, YAW_s));
// 速度は、向きの変換だけ行えばよい

double x_os, y_os, z_os; // 観測されたターゲット位置@センサ座標系
double roll_os, pitch_os, yaw_os; // 観測されたターゲット姿勢@センサ座標系
double Vx_os, Vy_os, Vz_os; // 観測されたターゲット速度@センサ座標系

// 座標変換を行う
tf::Vector3 position_or = transformer * tf::Vector3(x_os, y_os, z_os);
tf::Quaternion attitude_or = transformer * tf::createQuaternionFromRPY(roll_os, pitch_os, yaw_os);
tf::Vector3 velocity_or = velocity_transformer * tf::Vector3(x_os, y_os, z_os);

double x_or, y_or, z_or; // 変換後のターゲット位置@ロボット座標系
double roll_or, pitch_or, yaw_or; // 変換後のターゲット姿勢@ロボット座標系
double Vx_or, Vy_or, Vz_or; // 変換後のターゲット速度@ロボット座標系
x_or = position_or.x();
y_or = position_or.y();
z_or = position_or.z();
tf::Matrix3x3(attitude_or).getRPY(roll_or, pitch_or, yaw_or);
Vx_or = velocity_or.x();
Vy_or = velocity_or.y();
Vz_or = velocity_or.z();
```

## 参考資料

- tf API: http://docs.ros.org/jade/api/tf/html/c++/classtf_1_1Transform.html
- 座標変換: http://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/robotics/coordtrans.html
- 世界で一番簡単なtfの使い方: https://myenigma.hatenablog.com/entry/20130210/1360491625
【電子工作】ESP32(ESP-WROOM-32)を使ってLチカやってみる

## TL;DR
- ESP32について
- ESPマイコン用の開発環境の構築
- とりあえずLチカやってみる

2番煎じではあるが、自身の取り組みとして記録に残す。

## ESP32について
基本的な情報は、 [ESP32 Wiki](https://ja.wikipedia.org/wiki/ESP32) 等を参照してほしい。
> ESP32シリーズは、WifiとBluetoothを内蔵する低コスト・低消費電力なマイコンである。

[秋月電子](http://akizukidenshi.com/catalog/g/gM-13628/)などで購入可能。
回路図は[こんな感じ](http://akizukidenshi.com/download/ds/espressifsystems/ESP32-Core-Board-V2_sch.pdf)。

筆者がこのマイコンを利用している理由は、以下の通りである。
- 小さい！（10円玉と比較した添付画像参照）
- 安い！（1480円 ※arduino nano でも3000円弱）
- 電池の減りが少ない！（ウェアラブル用途のIoTにはもってこい）
- MicroPythonが使える！（組み込み用ソフトにPythonが使えるので実装が簡単）

![image-20190325160647618.png](https://qiita-image-store.s3.amazonaws.com/0/316011/cfafd1d5-205c-6e00-e50a-487844ae0d10.png)

また、昨年からInterface（CQ出版）にて、ここ1年はこのマイコンの特集が上がっている（ちなみに2019年5月号も特集が組まれている）。そのため、ArduinoやRaspberry piには劣るものの、情報量も多くトラブルの際はググれば大抵のことは出てくる。

1点想定外だったのは、一般的なブレッドボードが使いにくかったこと（※あくまで個人の感想）。基本的にブレッドボードは左右５ピン分の穴が開いているが、ESP開発ボードの”ESP32-dev-kitC”は横幅が９ピン分あるため、片側は実質使えない・・・（”ブレッドボード esp32”で検索すると、同じことで悩んでいる人もいた）。

## 開発環境の構築
OS: windows 10

筆者は以下サイトを参考に環境の構築を行った。
[ESP32(ESP-WROOM-32)でLチカ](https://qiita.com/rukihena/items/6a904368700eb1c7d2a3)

1. ArduinoIDEのインストール
開発ボード（ESP32-dev-kitC）を購入された場合、ArduinoIDEのインストールだけ行えばOK。
※今ならDockerを使えば、さらに容易になると思われるので、どれほど容易になったかいずれ試したい

2. ESP32ライブラリの導入
[こちらのブログ](https://qiita.com/yuta4807/items/0c47b2beca9cfd69cc23)の”Arduino core for the ESP32”の項を参照しながら、ライブラリのインストールを行う。

3. ESP32ライブラリの確認
ArduinoIDEの「ファイル」タブ→「スケッチ例」と進め、"ESP32 dev module用のスケッチ例”という項目があればOK

## とりあえずLチカやってみる
最後に、電子工作の”Hello world”ことLチカを行う。

このサイト（[ESP32(ESP-WROOM-32)でLチカ](https://qiita.com/rukihena/items/6a904368700eb1c7d2a3)）の写真のまま接続するだけでよいが、もし点滅しなかった場合は、LEDのアノードとカソード（プラス・マイナス端子）を逆にさしている可能性がある（壊れたりはしないので、刺してみて点灯するか確かめてもよい）

なお、コード内で定義している”LEDPIN"はLEDを繋板とマイコンの端子の番号を書けば良い。

```C
#define LEDPIN 4

void setup() {
  pinMode(LEDPIN, OUTPUT);
}

void loop() {
  digitalWrite(LEDPIN, HIGH);
  delay(125);
  digitalWrite(LEDPIN, LOW);
  delay(375);
}
```
TouchDesignerでJSONをDAT Tableにパースする

## はじめに
世の中には様々なAPIがありますが、ほとんどのAPIがJSON形式でデータで返してきます。
TouchDesignerでは連想配列に似たようなデータ保持の仕組みでTableDATというものがあります。
本稿では、TouchDesignerで何かしらのJSON形式のデータをTouchDesignerで扱いやすくするためにDAT TableにしてDAT to CHOPでCHOPで扱いやすくする方法を忘備録としてまとめたものです。

今回はネストが無いJSONデータをDAT Tableにパースしています。

## さっそくスクリプト
```python
# jsonを扱うために標準パッケージをインポート
import json

s = '{"a": "1", "b": "2", "c": "3"}'

jsonData = json.loads(s)

# DAT Tableの値を初期化
op('table_data').clear()

# JsonDataをforで回しながら取り出す
for key, val in jsonData.items():
    # とりだしたデータをDAT Tableの最終行に追加
    op('table_data').appendRow([key, val])
```

## ノードはこんな感じ
ノードはこんな感じになりました。
今回は記事を書くために適当なJSONデータをスクリプト上で用意しましたが、別ファイルのJSONデータを読み込んで利用することも可能です。
Select CHOPを使えばチャンネルごとに数値を取り出すことができるので、ここから先は普段TouchDesignerを使うように数値を煮るなり焼くなりできます。
![ノードの全貌](https://qiita-image-store.s3.amazonaws.com/0/109953/8696da5c-a274-2a22-2fc0-d5796c814685.png)

## まとめ
TouchDesignerでJSON形式のデータを扱いやすくすることができました。
自分はこの方法をTouchDesignerとNode.jsで開発したサーバーでWebSocket通信をする際に使用しました。
TouchDesignerでのWebSocket通信に関しては、また別の機会に記事をまとめたいと思います。
パラメータの受け渡し、およびパスについて

Railsではパラメータの受け渡しが非常に重要です。
詰まると大変です。

色々とルールがあります。
ストロングパラメータや他モデルのカラムデータを使う場合など。

今回は、その中でも、最近少し気になったパスの書き方について、見て行きたいと思います。



#パス
まずは、以下のルーティングをご覧ください。


```Ruby:
                   Prefix Verb   URI Pattern                                                                            
                                          Controller#Action
              admin_users GET    /admin/users(.:format)                                                                   
                                          admin/users#index
                          POST   /admin/users(.:format)                                                                   
                                          admin/users#create
           new_admin_user GET    /admin/users/new(.:format)                                                               
                                          admin/users#new
          edit_admin_user GET    /admin/users/:id/edit(.:format)                                                          
                                          admin/users#edit
               admin_user GET    /admin/users/:id(.:format)                                                               
                                          admin/users#show
                          PATCH  /admin/users/:id(.:format)                                                               
                                          admin/users#update
                          PUT    /admin/users/:id(.:format)                                                               
                                          admin/users#update
                          DELETE /admin/users/:id(.:format)                                                               
                                          admin/users#destroy
```

これは、routes.rbファイルにて、resourcesを使用したルーティングです。
前回の記事から転用しているので、admin名前空間付きですが。

そして、これらのパスを使うのは、パラメータの受け渡しです。
大抵、

- [x] link_to
- [x] redirect_to
- [x] render
- [x] form_with

の４つを駆使しますね。

もちろん、第二引数やネスト、method型などもありますが、パスの形としては、絶対パスなのか、相対パスなのかというところが基本ですね。

今回は気になったパスの書き方をお伝えして行きます。



#パスの書き方
- [:admin, @user]→多分、これはAdminのusers_controllerに飛んでる。Railsがよしなにしてくれる感じ。データなければcreate、あればshowとかupdate、場合によってはdestroyに飛ぶ感じですね。前に「model:　」と記載されることも。
- admin_users_url→これはヘルパーなのですが、urlの前の部分がルーティングで表示されてました。基本、「：id」（params[:id]）受け渡しの有無に関係なく使えます。対応のcontrollerメソッドに飛びます。
- admin_user_path(@user)→これもヘルパーです。ただし、こちらは、「：id」（params[:id]）受け渡しの際に積極的に使われる模様。＠userは＠user.idの省略形です。対応のcontrollerメソッドに飛びます。


パスは奥が深いですが、ここを間違えると、エラーの嵐ですので、頑張りましょう。



#renderのデータ受け取り
viewを作る際に、フォームは共通の型にしてそれぞれのファイルで読み込むことが多いです。
共通の型を大抵、「_form.html.rb」と名付けます。

そして各ファイルにて以下のように、読み込みます。

```Ruby:
<%=render partial: 'form', locals: (user: @user) %>
```

これはなんというか、定型文だと思っているので、そういうものだということにしています。
Go言語でクレデンシャルな情報をコード内に書き込まずに使用する3つのアプローチ

# はじめに
みなさんGo言語してますか？
Go言語でAPIサーバやCLIツールを作っているときに、クレデンシャル情報をアプリケーションの中で使用するケースが出てくるかと思います。
クレデンシャルな情報をコード内に書いてしまうとGithubでコミットするときに都度コードいじったり、うっかりコミットして焦ったり・・・

今回はGo言語でクレデンシャルな情報を使う場合のアプローチを書きたいと思います。

# 環境変数で参照する
これはオーソドックスな環境変数を使ったスタイルです。
APIサーバ起動前やCLI実行前に環境変数を設定し、実行します。

```go:application.go
package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println(os.Getenv("SOMENAME"))
}

```

```sh
$ export SOMENAME=VALUE
$ go run application.go
VALUE
```

Go言語とは直接関係ありませんが、Dockerを使っている場合は、`docker run`時に環境変数を突っ込むといいでしょう。
[Docker runのオプションについて](http://docs.docker.jp/engine/reference/commandline/run.html)

# 外部ファイルで参照する
設定ファイルを読み取る便利なライブラリ[Viper](https://github.com/spf13/viper) を使えば外部ファイルから変数の呼び出しが可能です。
環境変数に比べセキュアではありませんが、限られた環境内で使うには十分でしょう。

```yaml:config.yaml
# viper configuration file
key:
    token: tokenvalue
```
```go:application.go
package main

import (
	"fmt"
	"os"

	"github.com/spf13/viper"
)

func main() {
	// set up init config.
	viper.SetConfigName("config") // name of config file (without extension)
	viper.AddConfigPath(".")      // optionally look for config in the working directory
	if err := viper.ReadInConfig(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	fmt.Println(viper.GetString("key.token"))
}
```

```sh
$ go run application.go
tokenvalue
```

# go build時に注入する
`go build`の`ldflags`オプションを使って実行ファイルの中に変数を注入することが可能です。
ビルド時に注入可能なため、デプロイ先や配布先に合わせて注入するなどの応用が可能です。

```go:application.go
package main

import "fmt"

var key string

func main() {
	fmt.Println(key)
}
```

```sh
$ go build --ldflags "-X main.key=VALUE" application.go
$ ./application
VALUE
```

# さいごに
クレデンシャルな情報はうっかりやってしまうと大きな事故に繋がるので作るアプリケーションの初期設計からどう管理するか考えておきたいですね。
上に書いた3つの方法でしっかり管理していきましょう。
rpmにパッケージ依存を設定する

パッケージの依存をspecファイルに書きます。
## 構成
kusakariパッケージをインストールするためにはdepパッケージの
2.0以降のインストールが必要という定義を入れる

**kusakari.spec**

```bash:kusakari.spec
Name:	kusakari
Version:	1.0
Release:	1%{?dist}
Summary:	test
Group:	group	
License:	GPLv3+
URL:		https://www.yahoo.co.jp/
Source0:	kusakari.tar.gz

%define __jar_repack %{nil}

Requires: dep >= 2.0
 
%description
%prep
%setup -n %{name}
%install
rm -rf %{buildroot} 
mkdir -p %{buildroot}/home/kusakari/target/
install -m 0755 test.sh %{buildroot}/home/kusakari/target/
install -m 0755 date.sh %{buildroot}/home/kusakari/target/
install -m 0755 deploy.jar %{buildroot}/home/kusakari/target/

%clean
rm -rf %{buildroot}

%files
/home/kusakari/target/test.sh
/home/kusakari/target/date.sh
/home/kusakari/target/deploy.jar

%doc
%changelog
```

**dep.spec**

```
Name:	dep
Version:	2.0
Release:	1%{?dist}
Summary:	test
Group:	group	
License:	GPLv3+
URL:		https://www.yahoo.co.jp/
Source0:	dep.tar.gz

%description
%prep
%setup -n %{name}
%install
rm -rf %{buildroot} 
mkdir -p %{buildroot}/home/kusakari/target/
install -m 0755 testest %{buildroot}/home/kusakari/target/

%clean
rm -rf %{buildroot}

%files
/home/kusakari/target/testest

%doc
%changelog
```

## 検証
以下、順番に検証します。
**kusakariパッケージをインストールする**

```bash
$ ls -l kusakari-1.0-1.el7.centos.x86_64.rpm 
-rw-rw-r-- 1 kusakari kusakari 1100956  4月  4 23:44 kusakari-1.0-1.el7.centos.x86_64.rpm
# rpm -ivh kusakari-1.0-1.el7.centos.x86_64.rpm 
エラー: 依存性の欠如:dep >= 2.0 は kusakari-1.0-1.el7.centos.x86_64 に必要とされています
```
**dep-1.0をインストール済み、kusakariパッケージをインストールする**

```bash
# rpm -qa | grep dep
dep-1.0-1.el7.centos.x86_64
# rpm -ivh kusakari-1.0-1.el7.centos.x86_64.rpm 
エラー: 依存性の欠如:dep >= 2.0 は kusakari-1.0-1.el7.centos.x86_64 に必要とされています
```
**dep-2.0をインストール済み、kusakariパッケージをインストールする**

```
# rpm -qa | grep dep
dep-2.0-1.el7.centos.x86_64
# rpm -ivh kusakari-1.0-1.el7.centos.x86_64.rpm 
# rpm -qa | grep kusakari
kusakari-1.0-1.el7.centos.x86_64
```

想定通り制御できます。以上です。
アリババクラウドのBaaS-Hyperledger Fabric(三)

[第一回目](https://qiita.com/lcj/items/c87352b9f993d7be7cef)には、BaaSサービスの全体イメージが了解できると思います。今回は、モニタリング画面を紹介いたします。

------

#### 1.モニタリング画面の入口
組織の管理画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/384991/0064c33f-f6cb-8277-992a-542c39922c25.png)

#### 2.概要画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/384991/7e765df9-ae4b-c189-84ca-120fbb217bb6.png)

#### 3.ブロック管理画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/384991/5cd5dff8-e85c-9be4-bf92-636a1565d616.png)

###### 3.1.ブロック管理画面のリンク(Block Hash)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/384991/c31d348e-b94d-fbcb-ad81-f81a68df620c.png)
###### 3.2.ブロック管理画面のリンク(Transaction Hash)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/384991/ab8d5a1b-9ca2-33bf-c696-bb1c6fb8ac33.png)

#### 4.トレード管理画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/384991/69e4edf7-b581-8641-bb35-ae94c27b3621.png)

#### 5.Chaincodes画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/384991/0157fa5b-186f-fb86-f509-9c6e87a7b1e1.png)

##その他
以下のイベントで詳しく説明を行います
https://internetchamp.connpass.com/event/123995/

以上
AOJ ITP1_11_Aのサイコロ問題をかっこよく（当社比）解いた

#はじめに
最近AOJをやっているのですが、[AOJ ITP1_11_A](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_11_A&lang=jp)で少しつまずき、カンニングした方法が自分には合わなかったので結局おそらく既出でない方法で解いてみました
#コード
言語はc++ですincludeとか省略してます

```main.cpp
using namespace std;
#define rep(i, n) for(lint i = 0; i < (lint)(n); i++)
int main() {
	vector<int> a(6);
	vector<vector<int>>b = { {0,0,1},{1,0,0} ,{0,1,0} ,{0,-1,0} ,{-1,0,0} ,{0,0,-1} };
	rep(i, 6)cin >> a[i];
	string junk; getline(cin, junk);
	string text;
	getline(cin,text);
	int buf;
	rep(i,6){
		for (char c : text) {
			if (c == 'E') {
				buf = b[i][2];
				b[i][2] = -b[i][1];
				b[i][1] = buf;
			}
			if (c == 'W') {
				buf = b[i][2];
				b[i][2] = b[i][1];
				b[i][1] = -buf;
			}
			if (c == 'S') {
				buf = b[i][2];
				b[i][2] = -b[i][0];
				b[i][0] = buf;
			}
			if (c == 'N') {
				buf = b[i][2];
				b[i][2] = b[i][0];
				b[i][0] = -buf;
			}
		}
	}
	rep(i, 6)if (b[i][2] == 1)cout << a[i]<<"\n";
}
```
#解説
前後方向をX座標
左右方向をY座標
上下方向をZ座標として6面の3次元vectorを作成し実際に回転させる方法でときました
#感想
楽しかった
複数のバージョンのUnityを使い分けるおすすめの方法

## 複数のバージョンのUnityを使い分けるおすすめの方法
最近Unityを勉強しているのですが、教材のUnityのバージョンが古いために複数バージョンのUnityを使い分ける必要がありました。
### 公式のUnity Hubが使いやすかった。
そこで選んだのが公式のUnity Hubです。
こちらからダウンロードできます。
https://unity3d.com/get-unity/download
皆さんもぜひUnity Hubを使ってみて下さい。指示通りに操作すれば、複数バージョンのUnityが使い分けられます。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
ターミナルにGitのブランチ名を載せる

gitのブランチ名をいちいちコマンド打って確認するのはめんどくさい．そこでターミナルにGitのブランチ名を以下のように常時表示させる方法を紹介します．

<img width="1305" alt="スクリーンショット 2019-04-04 23.28.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/376174/7b529cbb-f1b4-da6c-4eb3-6ad16a7fed4d.png">


# 使用環境

- MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)

# brewでbash-completionをインストールする

以下のコマンドを打ってbash-completionをインストールします．

```
$ brew install git bash-completion
```

# ~/.bashrcの編集

以下のように~/.bashrcを変更します．

``` ~/.bashrc
source /usr/local/etc/profile.d/bash_completion.sh
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
```

ここまでできたら，あとは変更を反映させるのみです．
```
$ source ~/.bashrc
```

# ~/.bash_profile

以上でブランチ名が表示されると思うのですが，このままだとターミナルを開けるごとにsourceコマンドを打たなければいけません．それはめんどくさいので，~/.bash_profileも変更してしまいましょう．

```~/.bash_profile
.
.
.
# 末尾に追加
test -r ~/.bashrc && . ~/.bashrc
```

こうすることでターミナルを新しく開けたとしてもブランチ名が付いていると思います．
TypeScript での文字列 Union 型を enum 代わりに利用するテクニック

## 概要

コンパイラによる誤り検出もできて、テキストエディタ/IDEよる入力補完の支援も得られて、外部からの入力値チェックも行える、文字列 Union 型を enum 代わりに利用するテクニックの紹介

## 定義例

```ts
const dogSource = Object.freeze
(
    {
        "Borzoi": null,
        "Poodle": null,
        "Retriever": null,
        "Mastiff": null,
        "Hot": null,
    }
);
type DogEnum = keyof typeof dogSource; // "Borzoi" | "Poodle" | "Retriever" | "Mastiff" | "Hot"
const dogList = Object.keys(dogSource); // [ "Borzoi", "Poodle", "Retriever", "Mastiff", "Hot" ]
```

## 利用例1(代入)

```ts
const borzoi: DogEnum = "Borzoi"; // OK
const poodle: DogEnum = "Poodle"; // OK
const mainecoon: DogEnum = "Mainecoon"; // NG(コンパイルエラー)
```

## 利用例2(入力値チェック)

```ts
const isValidDog = (value :string): boolean => 0 <= dogList.indexOf(value);

const isValidRetriever = isValidDog("Retriever"); // true;
const isValidMainecoon = isValidDog("Mainecoon"); // false;
```

## 利用例3(値比較)

```ts
const dogValue: DogEnum = getDog();
const isBorzoi = "Borzoi" === dogValue; // OK
const isMainecoon = "Mainecoon" === dogValue; // NG(コンパイルエラー)
```

## 利用例4(switch文)

```ts
const dogValue: DogEnum = getDog();
switch(dogValue)
{
case "Borzoi": // OK
    console.log("Bow-wow!");
    break;
case "Mainecoon": // NG(コンパイルエラー)
    console.log("Meow!");
    break;
}
```

## 入力補完について

VS Code のようなエディタを利用していれば、上記利用例の OK/NG の箇所は入力補完してくれてますので、そもそも間違わずに済みます。
【Git】 git stashについて簡単まとめ

`git stash`は今やっている作業を一旦止めて、他の作業に移りたいというときに用いられます。
仕事をしていて、そのような場面に出くわすことが多くなりました。
その度に『これどう書くんだったけ…？』と汚い手書きメモを見返すのが面倒になったので、まとめておきます。 

# git stashとは

`git stash`とはGitで作業を一時的に避難させておくことができる機能です。  

例えば、Aというブランチでバグの修正をしていたところ、「こっちの修正を先にお願い！」と言われました。
そのため、割り込んできた修正作業をBブランチですることにしました。
しかしAブランチでの作業がやりかけなので、残しておきたいです。  

この時に用いるのが、作業を一旦退避することができる、`git stash`です。

# git stashの使い方
## 現在の作業を一時的によけておく

```git
$ git stash save
```

最終コミットから、現在までの作業を一旦まとめて保存してよけておくことができます。

## 作業の内容を記載して保存する

```git
$ git stash save "message"
```

`save`のあと"message"をつけると、作業の内容をメモしておくことができます。
『このよけたものはどんな作業していたときのものだっけ…？』とあとでなるのを防いでくれます。

## よけておいた作業のリストを見る

```git
$ git stash list
```

一旦おいておいた作業はひとつだけではないかもしれません。
過去によけた作業の一覧は`git stash list`で取得できます。  

```
stash@{0}: On branchB: B作業途中
stash@{1}: On branchA: A作業途中
```

コマンドを実行すると上記のように一覧が表示されます。
一番左では作業ごとに0, 1…と引数が割り振られます。

## よけておいた作業を戻す

```git
git stash pop stash@{引数}
```

横においておいた作業は`git stash pop`を用いて簡単に戻すことができます。
作業を止めておいたブランチに戻り、`pop`の後に一覧で見られる戻したい作業の引数を用いて`stash@{引数}`と記述し、実行します。

```
stash@{0}: On branchB: B作業途中
stash@{1}: On branchA: A作業途中
```
例えば、A作業途中という内容の作業に戻りたい場合は、`git stash pop stash@{1}`とします。

## よけておいた作業を消す

```git
$ git stash drop stash@{引数}
```

横においておいた作業を消したいときは`git stash drop`を用います。
消したい作業の指定方法は`git stash pop`と同じです。

## 作業を全て消す

```git
git stash clear
```

一覧にある全ての作業を消したいときは、`git stash clear`を使用します。  

以上がgit stashについての簡単なまとめです。
CodiMDを社内オンプレ環境に構築する

# 前書き
リアルタイムプレビューがあり、共同編集ができ、高機能なエディタであるCodiMD。
チームのオンプレ環境に設置するのに苦労したのでまとめます。

# やりたいこと

社内ドキュメントをオンプレ環境に置きたいので、
オンプレ環境にHackmdをインストールする。
ゲストは許さん！画像の外部流出も許さん！ローカルにちゃんと置くんだぞ！！
内部ネットワークだからSSL対応なんてやらないよ！！
スタンスでいきます。

今回はVirtualBox上にCentOS7を立ててそこにインストールしました。

# インストール

淡々とDockerをインストールしてhackmdを配置する。

```
sudo yum update -y && sudo yum install -y git docker
sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
git clone https://github.com/hackmdio/docker-hackmd.git
cd docker-hackmd
sudo service docker start
```

## 社内公開用に設定を書き換える

画像がimgurにアップされたり、ゲストで編集されると困るので設定ファイルを書き換えます。
`docker-hackmd/docker-compose.yml`を開き
`- HMD_DB_URL=postgres://hackmd:hackmdpass@database:5432/hackmd`の下に以下追加。

```
      - CMD_ALLOW_ANONYMOUS=false
      - CMD_ALLOW_ANONYMOUS_EDITS=false
      - CMD_DEFAULT_PERMISSION=editable
      - CMD_IMAGE_UPLOAD_TYPE=filesystem
      - CMD_DOMAIN=(IPアドレス)
```

### オプションの説明
`～～ANONYMOUS`： ゲストで編集やらを制限します。`true, false`
`DEFAULT_PERMISSION`はノート作成の際にデフォルトの権限。
`UPLOAD_TYPE`をfilesystemにすることでローカルに保存します。
ただfilesystemに変更すると画像をアップロードした際にエラーが出たので、
`DOMAIN`にIPアドレスを入れると回避できました。

後日追記しますが、Configはここに一覧あります。
https://hackmd.io/c/codimd-documentation/%2Fs%2Fcodimd-configuration

`docker-compose up`してしばらくすると
http://IPアドレス:3000/
でアクセスできるようになっているはずです。
答えにたどり着ける検索の仕方.

#はじめに
みなさんggってますか?
Googleって便利ですよね。だいたいワードを入れれば答えが出てくる。

でも全く知らない分野で知りたいことが出てきたらどうしましょ。

そんな時に答えにたどり着く私なりの方法をまとめてみます。

#対象
相対論のフレンズ、うまくggれない人。

#必要なもの
1.パソコンとネット環境
2.閃き
3.執念

#さあggろう!

#プログラムの問題をggる.
####手順1-冷静に分類する。
まず何をggりたいか一度落ち着いて考える。
ほとんどの場合以下の二つ。

α.問題解決のためのいい道具があるか知りたい。
β.道具を使ってたら問題が起きた。どうしよう。

同時進行で説明します。
####手順2-ワードを考える。
考えれたら準備OK。ggりワードを考えよう。
α.OOしてみた。
(例)画像から円検出してみた。

β.エラー名
(例)Off by one error

プログラム固有の問題ではなくて、自分が知らないだけかもしれないから、
最初はこれくらい簡単なワードの方がいい。
####手順3-さらにワードを絞る。
α.あるそのツールの名前などのワードが揃ってきたはず。
あとは自分の環境に合わせてggるだけ。
(例)Python Opencv


β.手順2でわからなかったらプログラム固有の問題だ。以下を繰り返そう。
1.プログラムの名称、起こっているエラーをセットでggる。
(例)Numpy off by one error
2.さらに情報を付け加える
(例)anaconda Python3 Numpy off by one error

**コツ**
定義域が大きくなるほど中身は増えるので、
バージョンとかの情報は最後の方で付け加えた方がいい。

#画像についてggる.
####手順1-画像を言語化する。
とりあえず画像を言語化します。特徴列挙の方が近いかも。
この時にできるだけたくさん挙げれると幸せになれる。

(例)トヨタ車　4ドア 80年代　アルファベットトヨタロゴ

これなんていう部品？ってのがあったら。

**OO　呼び方一覧**

で先にggっておいてから、部品ごとの特徴をセットで列挙します。

(例)ツイン丸ライト
####手順2-ggって言語化する。
Google画像検索にもかけます。

こうするとさらに特徴や名称が細かく指定できる可能性が上がります。
####手順3-さらに特徴で絞る。

2と3を踏むとかなり細かい名称がわかります。
(例)カローラセダン

ここからは執念のみでいけます。

1.出てきたワードをggって、結果を画像で見る。
2.少しでも似ているものを見つけて、そのページに行く。
3.少し細かい情報が得られるはず、得られなかったら別の結果を見る。
4.得られた情報も付け加えて再びggる

これを繰り返せばほとんどの場合で答えにたどり着けるはず。

#まとめ
1.大きな括りから狭めていく方法が結局早いような気がする。
2.日本語でggってから英語でggる方がわかりやすい結果が出やすい。
3.複数のページで同じようなことが書いてあればその解決法はほぼ確実。

みなさんのggリングが幸せなものでありますように...
HoloLens MRTKv2 はじめにやるチュートリアル | 2019年4月


環境構築は[こちら](https://qiita.com/peace098beat/items/8233c8e042d31603735b)に書きました。

早速、はじめにやるチュートリアルを進めます！

## チュートリアル その１

Microsoft Mixed Reality Toolkit のGithubを参考に進めます。

![MRTK_Logo_Rev.png](https://qiita-image-store.s3.amazonaws.com/0/62413/a8140314-37e0-df49-008d-094539fd14e9.png)

Github - /Microsoft/MixedRealityToolkit-Unity
https://github.com/Microsoft/MixedRealityToolkit-Unity/blob/mrtk_release/Documentation/GettingStartedWithTheMRTK.md


## 1. プロジェクトを作る
![SnapCrab_Unity 2018311f1_2019-4-4_22-50-0_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/f78b7db9-251c-1019-9b95-823e7ae01bc8.png)


## 2. MRTK(Mixed Reality Toolkit)をインポート

### MRTK Assetのダウンロード

[ここからMRTKのAssetをダウンロード](https://github.com/Microsoft/MixedRealityToolkit-Unity/releases)しておく。

![SnapCrab_NoName_2019-4-4_22-52-32_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/aa1ed7f8-8b2c-ce48-2f0e-d57e17e87888.png)


![SnapCrab_NoName_2019-4-4_22-52-14_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/f5ff359a-1bac-b7b4-1297-e0f58eb88101.png)

下のほうにunitypackageファイルがあります。どちらもダウンロードしてください。
> 1. Microsoft.MixedReality.Toolkit.Unity.Examples-v2.0.0-Beta2.unitypackage 7.49 MB
> 2. Microsoft.MixedReality.Toolkit.Unity.Foundation-v2.0.0-Beta2.unitypackage 4.17 MB

### MRTK Assetのインポート
Assets > Import Package > Custom Package ...
から、先ほどダウンロードしたMRTKのFoundationとExamplesをインポートシマス。

![Unity_ImportAssetOption.png](https://qiita-image-store.s3.amazonaws.com/0/62413/7d4bfe4c-a3cf-ddce-1d01-6e15c0eee9c7.png)

![SnapCrab_NoName_2019-4-4_22-55-36_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/0746279b-3151-1561-efb7-b39446d4c1d2.png)
インポートしました。

## 3. XRの環境設定? (Option)
![SnapCrab_NoName_2019-4-4_22-56-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/5d66c729-6edf-0d85-3721-aa6700adb301.png)
するとなにかプロンプトが出てくる。私の英語力では判断がつかない。ドウモXRの設定がどうのこうの？？ひとまずApplyしてみた。

## 4 MRTK SceneのConfigureを開きます

![MRTK_ConfigureScene.png](https://qiita-image-store.s3.amazonaws.com/0/62413/06e3df25-1f18-3a29-e61a-615a0ae8964e.png)

![SnapCrab_Unity 2018311f1 Personal - SampleSceneunity - MRTK-Sample1 - PC Mac & Linux Standalone DX11 on DX10 _2019-4-4_23-8-48_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/77bae003-249a-e6c3-e370-f9b6a4fe2880.png)

????

Githubの説明がここで終わってる。。。

どうしたらよいのだ。情報求む。
pandasの便利関数

kaggleを始めたのですが、データの前処理でどうすればいいか途方にくれることが多いです。
karnelを読んで見つけたDataFrameの前処理・可視化に便利そうな関数のメモです。

dfは読み込まれてる前提です。

## カラムの型、カラムのNanデータ数を一覧表示

```python
df.info()
```

## カラムのデータ例、平均、分散、標準偏差などを一覧表示

```python
df.describe(include='all')
```

## Nanデータの多いカラム順にソート

```python
df.isna().sum().sort_values(ascending=False)
```

### グラフ表示

```python
missing = df.isna().sum().sort_values(ascending=False)
sns.barplot(missing, missing.index)
plt.show()
```

## 入れ子の文字列をリストと辞書に変換

csvのフィールドに以下のようなデータが文字列として格納されている場合がよくあります。

```
[{'id': 53, 'name': 'Thriller'}, {'id': 18, 'name': 'Drama'}]
```

この文字列はPythonのリストの中に複数の辞書が入っています。

```python

import ast

x = "[{'id': 53, 'name': 'Thriller'}, {'id': 18, 'name': 'Drama'}]"

converted_x = ast.literal_eval(x)
```

literal_evalで文字列をリストや辞書に変換できます。
Railsでお手軽にメソッド呼び出し時の実引数と戻り値をログに残したい

#動機

それはそれは筆者がまだ無所属じゃなかった頃の話ぢゃ。
「なんかバグって落ちるんだよね。ログあげるから解析よろ。」という要求が挙がった。
怪しい箇所にログを仕込んでお茶を濁しても良かったのだが、
「そびえ立つ巨大メソッドの魔窟と化したプログラムをどげんかせんといかん！」
「二度と魔窟を作らせないようにしないといかん！」
という謎の声を聴いた筆者は魔法を使った。

#処方箋
メソッド呼び出し時の実引数と戻り値をログに残してくれる魔法のgem

~~~
$ gem install entraceable
~~~

または、Gemfileに下記を追加してbundle install

~~~
gem 'entraceable'
~~~

###変更前

~~~example.rb
class Example
  def add(a, b)
    a + b
  end
end
~~~

###変更後

~~~example.rb
require 'entraceable'

class Example
  def add(a, b)
    a + b
  end

  entraceable :add
end
~~~

#効果

この処方箋はチームのメンバー達にある方向性を示した。
メソッド呼び出しの単位でログが残るので、意味のある小さなメソッドを作成するようになったのだ。
こうして巨大メソッド魔窟は滅んだのだった。
めでたしめでたし。
Windows10 のクイックアクセス機能は活用すべき

Windows10でフォルダを開くと、左上に「よく使うフォルダー」や「最近使用したファイル」が表示されています。

これでも便利ですが、
よく使うフォルダを登録すると、フォルダ階層を探す必要がないため、無駄時間はなくなり、効率です。

登録方法は簡単です。
クイックアクセスに追加したい [フォルダ] に右クリックして 、[クイックアクセスにピン留め] をクリックすると完了です。

解除も右クリックで簡単にできます。
テキストパートを表示するGmail Add-onを作る

# きっかけ
Gmailからテキストパートを選択的に表示する機能が無くなってから久しい今日この頃ですが、マルチパートメールの送信テストでテキストパートの内容を目視確認をしなきゃいけない場面があります（日々、お客様に送っているメールの内容に問題がないか最終確認するアレです）。

Gmailの場合、自動的にHTMLパートが表示されてしまうため、テキストパートを表示しようと思ったら、

1. [メールのソースを表示する](https://support.google.com/mail/answer/29436?hl=ja)
2. テキストパートをクリップボードにコピーする
3. [デコードツール](https://www.encodemaniax.com/)でデコードする
4. 内容確認

という手順を踏む必要があり、そこそこ負担になります。もちろん、古のBecky!某やThunderbird某のようなメーラを使えばテキストパートの内容は確認できるのですが、せっかくGmailをメインに使っているのであれば、テキストパートの確認もGmailで完結させたいところです。

そこで、Gmail上でテキストパートを表示するAdd-onを作ってみることにしました。

# Gmail Add-onの基本
Gmail Add-onについては、[公式情報](https://developers.google.com/gsuite/add-ons/gmail/quickstart/)を見ていただくのが良いかと思います。わずか4ステップでサンプルのAdd-onが作れます。今回作成するものも基本的にはこれをベースにしています。

# 実際のコード
作成するコードはマニフェストファイルと、Google App Scriptの実装2ファイルだけです。

## appscript.json
まずは、マニフェストファイルから見ていきます。中身はいたって普通ですが、ポイントとしては、oauthScopesにメッセージの中身にアクセスするために `https://www.googleapis.com/auth/gmail.addons.current.message.readonly` のアクセス許可を与えている点です。

```JSON:appscript.json 
{
  "oauthScopes": [
    "https://www.googleapis.com/auth/gmail.addons.execute",
    "https://www.googleapis.com/auth/gmail.addons.current.message.metadata",
    "https://www.googleapis.com/auth/gmail.addons.current.message.readonly"
  ],
  "gmail": {
    "name": "text/plain",
    "logoUrl": "https://www.gstatic.com/images/icons/material/system/1x/label_googblue_24dp.png",
    "contextualTriggers": [{
      "unconditional": {
      },
      "onTriggerFunction": "buildAddOn"
    }],
    "primaryColor": "#4285F4",
    "secondaryColor": "#4285F4"
  }
}
```

## Code.js
実はファイル名は何でもいいのですが、マニフェストファイルの `onTriggerFunction` で指定したエントリーポイントとなる関数を実装しています。ポイントとなるのはテキストパートの内容を取得している `message.getPlainBody()` の部分です。メールっていろいろな文字コードで送られてくるので、ISO-2022-JPとかUTF-8とかを自分でデコードしなきゃいけないのかと思いきや、全部Google App Script側でデコード処理までやってくれます。超楽チン。

```javascript:Code.js
function buildAddOn(e) {
  // Activate temporary Gmail add-on scopes.
  var accessToken = e.messageMetadata.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);

  var messageId = e.messageMetadata.messageId;
  var message = GmailApp.getMessageById(messageId);

  // Section for text/plain part
  var section = CardService.newCardSection();
  var textPart = CardService.newTextParagraph()
    .setText(message.getPlainBody());
  section.addWidget(textPart);
  
  // Build the main card after adding the section.
  var card = CardService.newCardBuilder()
    .addSection(section)
    .build();

  return [card];
}
```

こんな感じのプロジェクトを作って先にご紹介した手順でデプロイをすればOKです。

![text plain.png](https://qiita-image-store.s3.amazonaws.com/0/48939/5eee9e8f-6d97-d82f-b080-36f6d84c2a3c.png)


# 実行してみる
Add-onをインストールしたGmail上でメールを選択すると、Add-onの画面上にテキストパートの内容が表示されます。
![VERKLIGHETEN  CD などお知らせ   awwa500 gmail com   Gmail.png](https://qiita-image-store.s3.amazonaws.com/0/48939/6257bcc1-8bd8-c2c9-1972-c717822669d7.png)

難点としては、以下のようなものがありますが、ある程度ざっくりと確認する目的であればとりあえず使い物にはなりそうです。

- Add-onの画面幅は固定らしく、テキストパートを閲覧するには正直ちょっと狭い
- 長いリンクなどが折り返されず、途中で切れてしまいうため、全内容が確認できない


Gmail 15周年おめでとうございます！
Python 自分用チートシート

Python ぜんぜんおぼえられない

```python
#!/usr/bin/env python3

# bool
a = True
a = False

# if
a = 5
if 0 <= a < 10:
    print(True)
if a != 0 and a != 10:
    print(True)

# string
a = ''
a += 'abc'

# list
entries = []
entries += [1, '2']
entries.extend([3, True])
entries[3] = '4'
for entry in entries:
    print(entry)
a = ['d', 'b', 'a', 'c']
a.sort()
for i, string in enumerate(a):
    print('{0}, {1}'.format(i, string))

# tuple
a = ()
a += (1, '2')  # another tuple is created

# range
a = range(5)
a = range(0, 10, 2)

# dict
a = {}
a[1] = 'foo'
a.update({'bar': 2, (0, 1): True})
for key, value in a.items():
    print('{0}, {1}'.format(key, value))

# 複数戻り値
def hoge(a, b):
    return (a + b), (a - b)  # tuple

a = hoge(2, 1)
print(a)
a, b = hoge(2, 1)
print(a)
print(b)

# annotation
def foo(number: int, text: str) -> dict:
    return {text, number}

print(foo(number=5, text='five'))

# naming
def foo_bar(arg):
    int_to_string = str(arg)
    print(int_to_string)

INT_PARAMETER = 10

foo_bar(INT_PARAMETER)

class MyClass:
    public_val = 1
    _private_val = 2

my_class = MyClass()

print(my_class.public_val)
# bad: print(my_class._public_val)
```

基本的に参照渡し、but immutable な型だと代入時に新しいインスタンスが作られる。
immutable: number, str, tuple...
mutable: list, dict...
oauth モジュールを Promise でラップしてみた

# 何の記事？
[oauth モジュール](https://www.npmjs.com/package/oauth)のメソッドを Promise でラップしてみたよ。

# oauth モジュールとは
* OAuth 認証を簡単に実行できる Node.js パッケージ
* 非同期処理の結果はコールバック形式

# なぜラップするのか
* Cookie 取得や連携許可・拒否画面の操作のため、[request-promise モジュール](https://www.npmjs.com/package/request-promise)と並行して使用したかった
* Promise でラップすることで、非同期処理を async/await で統一して記述したかった

# 実装してみた
`oauth.getOAuthRequestToken`と`oauth.getOAuthAccessToken`をラップしてみます。アクセストークンの取得までなら、使うのはこの二つだけです。

```typescript
//型エイリアス
type oauthTokenCallback = {
  err: {
    statusCode: number,
    data?: any
  },
  token: string,
  tokenSecret: string,
  query: any
};

//リクエストトークン取得をラップ
const getOAuthRequestToken = (scope: {[key: string]: string}) => 
  new Promise<oauthTokenCallback>((resolve) =>
    this.oauth.getOAuthRequestToken(scope, (err, token, tokenSecret, query) => {
      resolve({err, token, tokenSecret, query});
    }));

//アクセストークン取得をラップ
const getOAuthAccessToken = (requestToken: string, requestTokenSecret: string, verifier: string) => 
    new Promise<oauthTokenCallback>((resolve) => 
      this.oauth.getOAuthAccessToken(requestToken, requestTokenSecret, verifier, (err, token, tokenSecret, query) => {
      resolve({err, token, tokenSecret, query});
    }));

try {
  //次のようにawaitできる
  const requestTokenResult = await getOAuthRequestToken(...);
  console.log(requestTokenResult.token);

  const accessTokenResult = await getOAuthAccessToken(...);
  console.log(accessTokenResult.tokenSecret);

} catch (reason) {
  console.log(reason)
}
```

最初に、コールバックの型として型エイリアス（`oauthTokenCallback`）を定義しました。
定義自体は oauth モジュールの`OAuth.oauth1tokenCallback`と同じ形です。

実装全体は以下のリポジトリにて。
シングルトンにしちゃってますがそこは見逃してください＞＜

[HatenaBlogCode](https://github.com/Hide-KC/HatenaBlogCode/blob/master/src/util/Authorizer.ts)

### 宣伝
技術書典6で、このネタから生えた本を頒布します。
Visual Studio Code の拡張機能を開発する本です。よしなに。。。

[技術書典6 くり返す日常](https://techbookfest.org/event/tbf06/circle/59900003)
Ruby初心者：変数・式展開について

#変数とは
変数とは，扱うデータ（値）に名前をつけて一時的に利用できるものです．例えると，収納ボックスにラベリングして，何が入っているか分かりやすくするようなイメージです．

```rb
# boxが変数名，"clothes"が変数に格納するデータ（値）
box = "clothes"
```
box という入れ物の変数に clothes という文字列が格納されます．この変数名は好きなように名前をつけることができます．ただし，命名規則といってあまり推奨されない名前の付け方もあるので，一例を下記に．

```rb
# "1"は本人にしか分かりにくいので使わない
price1 = 100　

#CamelCase（キャメルケース）：ラクダのこぶのように"C"が出っ張っている．単語の頭文字を大文字にして繋げる表記．この慣習はあまりないです．
priceCost = 100　

#同じ変数名では何が格納されているか分からない
x = "abc" x = "123" x = "def"

#分かりにくい
i, j = 1, 2
a = b = 10
```

```rb
#SnakeCase（スネークケース）：アンダースコアで繋げる表記
box_upper = tops
box_middle = bottom
```

#式展開
変数の値を文字列の中で表したいときは以下の通りコードを書きます．

```rb
box = "clothes"

puts "ここには#{box}が入っています"
```

実行結果
ここにはclothesが入っています

#サンプル（自己紹介）
変数および式展開を用いた自己紹介をしてみます．

```rb
name = "Hoshino"
age = "37"
hometown = "Saitama"
address = "Tokyo"
postal_code = "111-2222"

puts "自己紹介をします！"
puts "ぼくの名前は#{name}です．"
puts "年齢は#{age}です．"
puts "出身地は#{hometown}で，現在は#{address}に住んでいます．"
puts "郵便番号は#{postal_code}です．"
puts "よろしくお願いします！"
```

ここで何度も"puts"を入力しましたが，正直ちょっと面倒くさい．ということで，ヒアドキュメントを活用すると楽になります．

```rb
name = "Hoshino"
age = "37"
hometown = "Saitama"
address = "Tokyo"
postal_code = "111-2222"

puts <<~TEXT
自己紹介をします！
ぼくの名前は#{name}です．
年齢は#{age}です．
出身地は#{hometown}で，現在は#{address}に住んでいます．
郵便番号は#{postal_code}です．
よろしくお願いします！
TEXT
```
<<~TEXT 〇〇　TEXT　で〇〇に記述された複数行の文字を出力することができます．さらに改行もそのまましてくれます．
ヒアドキュメントを活用できると複数行の記述がかなり楽になりますね．

#まとめ
・変数とは，扱うデータに名前をつけて一時的に利用できるもの（例えるなら箱）
・式展開は，変数の値を文字列の中で表示させること
・ヒアドキュメントを活用すると複数行の記述が楽になる
初投稿

#初めまして
Qiitaの事は随分前から利用していましたが投稿自体はこれが初めてになります。

軽く自己紹介をすると現在デザイナーをやっていてフロントエンドエンジニアになるために勉強中です。
去年の5月から勉強を始めて今まで継続してやっています。

##なんで今になって投稿し始めたのか？
Qiitaを知った時から「なんか書いてみるか」とは思っていましたが結局行動に移さず本当になんとなくで今書いています。
ブログにも挑戦しようとしたが結局断念しこのままだと一生発信する事はないなと思い危機感から今に至る。

##アウトプットの重要性
勉強を始めた去年の5月から「アウトプットしないと意味ないよ」的な事は目にしていた。
実際にそれは本当だと思うし知識は自分の言葉で説明する時に定着するものだと個人的には思っている。
だからアウトプットの時にうまく説明できない部分があればそこが自分の理解できていない部分だからそこの知識を補完することもできる。
また発信したものが他人の助けになることもあると思う。

ここまで重要性を理解していて今まで何も発信してこなかった。

##危機感
約1年継続して勉強しているのに正直「えっ？こんなもん？」くらいしか成長できてないと思う。
結局勉強した気になっているだけな可能性があるので今後はアウトプットを欠かさずこれからも勉強は続けていきたい。
Mac の PHP で PsySH が落ちる場合の対策

Mac Mojave に Homebrew でインストールした PHP が、7.3 になってから [PsySH](https://psysh.org/) をうまく実行することができなくなっています。

![psysh-ng.png](https://qiita-image-store.s3.amazonaws.com/0/11525/260bb982-e998-cc22-a456-998fe8000278.png)

式を評価しようとするといきなり落ちる。

Issue はこちら
https://github.com/bobthecow/psysh/issues/540

これずっと見てるんですが、なかなかうまく直らないのでしょうがなくこれを使っています。

```php:~/.config/psysh/config.php
<?php
return [
    'usePcntl' => false,
];
```

`~/.config/psysh/config.php` に置く PsySH の設定オプションで pcntl を使わないようにします。本当はこんなの美しくないんだけどなぁ。

![psysh-ok.png](https://qiita-image-store.s3.amazonaws.com/0/11525/7df338fe-0343-c101-97ed-07ac91aceaf6.png)

落ちなくなりました。

ちなみにこの対策が載ってる数少ない記事は、こちらのツイートです。
https://twitter.com/paulredmond/status/1075541313532002304
...いやツイートだけて... というわけで日本で困ってる人がいたとき用に記事にしときました。

Mac のビルトインサーバーで済ませる Laravel のお試しやってみようみたいなとき `artisan tinker` が動かないなんてのが起きているなら、解消されるんじゃないかと思います。まあ、自分は Laravel 使ってないんですけどね。
名前空間について

#名前空間とは
名前空間とは、モジュールです。
モジュールというのは、ざっくりいうと「部品」です。
ひとつのモデルのなかに、いくつかのクラスを設定できるのですが、例えば、学校でいうと、教室ですね。

管理系のモジュールとして　「Admin」を設定します。
そして「Admin」クラスに生徒がたくさんいるわけですね。

今回は、Admin専用のcontrollerを作ります。
controllerが生徒です。

具体的なパスとしては、

```Ruby:
アプリ名/app/controllers/admin/users_controller.rb
```

です。

同じ名前のcontorollerが上位の階層にいますが、その子は年長クラスの同一同名の別人です。
このように、Railsではモジュール階層がディレクトリに対応していますから、分かりやすいですね。

名前空間を設定すると、一つのモデルの中で、幾つかのCRUD処理を行うことができますし、機能毎に実装追加ができますので、コードが複雑化しません。



#名前空間を作ってみよう！
普通に、ディレクトリを作って、直下に手動でcontrollerを作っても良いです。
以下のコマンドでも作られますよ。

```Ruby:
bin/rails generate controller Admin::Users 
```

controllerの表記も少し変わります。

```Ruby:app/controllers/admin/users_controller.rb
class Admin::UsersController < ApplicationController

end
```

ルートの設定をするときは、

```Ruby:routes.rb
Rails.application.routes.draw do
  namespace :admin do
    resources :users
  end
end
```

resourcesを使うかどうかは、お好みだと思いますが、楽ですよ。
以下に、ターミナルのルーティングを載せます。
まずはターミナルで以下のコマンドを入力してください。

```Ruby:
bin/rails routes
```
すると、

```Ruby:
                   Prefix Verb   URI Pattern                                                                            
                                          Controller#Action
              admin_users GET    /admin/users(.:format)                                                                   
                                          admin/users#index
                          POST   /admin/users(.:format)                                                                   
                                          admin/users#create
           new_admin_user GET    /admin/users/new(.:format)                                                               
                                          admin/users#new
          edit_admin_user GET    /admin/users/:id/edit(.:format)                                                          
                                          admin/users#edit
               admin_user GET    /admin/users/:id(.:format)                                                               
                                          admin/users#show
                          PATCH  /admin/users/:id(.:format)                                                               
                                          admin/users#update
                          PUT    /admin/users/:id(.:format)                                                               
                                          admin/users#update
                          DELETE /admin/users/:id(.:format)                                                               
                                          admin/users#destroy
```

これだけのルーティングが瞬時に終わるので、resourcesは使った方がいいんじゃないかな、と思います。
ただし、どのようにしてパラメータの受け渡しなどが行われるのかは、絶対にわかっておいた方が良いと思います。
使いやすいEditor

普段仕事の中ではEditorは不可欠です。
おかげさまで選択肢は多くなってます。
自分に合うEditorを選択しましょう。

#Sakura Editor
日本産で誰でも知っている程度です。
シンプルで速いので使いやすいです。
検索、正規表現、置換、grep置換などで便利です。
https://sakura-editor.github.io

#NotePad++
軽いでプラグインなど自分合うeditorになりますね。
![notepad4ever.gif](https://qiita-image-store.s3.amazonaws.com/0/346425/68b4880d-4863-9a39-1f1c-ae82cdf76c80.gif)

https://notepad-plus-plus.org

#Atom
開発者に対して人気です。
テーマ、プラグインは豊富でカスタマイズしやすいです。
![index-teletype-screenshot-1de356892e9bab0f5a1e95b4a003dfecaab0d9e67a91fd60b63006a32f147db0.png](https://qiita-image-store.s3.amazonaws.com/0/346425/13d3a365-1f66-1b08-bf16-6b1e38456f20.png)

https://atom.io

#vscode 
Microsoft社からの開発editorです。
個人的には重いMicrosoft製品の印象は強かったですが、このツールとても速いです。
テーマ、プラグインなどでカスタマイズしやすいです。強力な開発ツールです。

![Screenshot_20190404-225923.jpg](https://qiita-image-store.s3.amazonaws.com/0/346425/365ddf0d-a6a3-9dc2-6263-976b609520f9.jpeg)

https://code.visualstudio.com

#Sublime Text
これも有名な開発者editorです。
https://www.sublimetext.com


使いやすいツールは多いですが、自分に合うツールのほうはやる気が出るし、楽になりますね。
Python マルチスレッド 並列処理　の簡単サンプル

```python

import threading 
  
# global variable x 
x = 0
  
def increment(): 
    """ 
    function to increment global variable x 
    """
    global x 
    x += 1
  
def thread_task(lock): 
    """ 
    task for thread 
    calls increment function 100000 times. 
    """
    for _ in range(100000): 
        lock.acquire() # ロック　※１
        increment() 
        lock.release() # ロック解除　※１
  
def main_task(): 
    global x 
    # setting global variable x as 0 
    x = 0
  
    # creating a lock 
    lock = threading.Lock() 
  
    # creating threads 
    t1 = threading.Thread(target=thread_task, args=(lock,)) 
    t2 = threading.Thread(target=thread_task, args=(lock,)) 
  
    # start threads 
    t1.start() 
    t2.start() 
  
    # t1, t2 を順番処理させる 
    t1.join() 　#※２
    t2.join() 　#※２
  
if __name__ == "__main__": 
    for i in range(10): 
        main_task() 
        print("Iteration {0}: x = {1}".format(i,x)) 

```
正しい結果

```
Iteration 0: x = 200000
Iteration 1: x = 200000
Iteration 2: x = 200000
Iteration 3: x = 200000
Iteration 4: x = 200000
Iteration 5: x = 200000
Iteration 6: x = 200000
Iteration 7: x = 200000
Iteration 8: x = 200000
Iteration 9: x = 200000

```
ちなみに
※１の部分だけをコメントアウトすると

```
Iteration 0: x = 184418
Iteration 1: x = 177826
Iteration 2: x = 200000
Iteration 3: x = 150490
Iteration 4: x = 179985
Iteration 5: x = 200000
Iteration 6: x = 176347
Iteration 7: x = 165817
Iteration 8: x = 176203
Iteration 9: x = 132321
```

※２の部分だけをコメントアウトすると

```
Iteration 0: x = 23071
Iteration 1: x = 18026
Iteration 2: x = 32923
Iteration 3: x = 7482
Iteration 4: x = 102353
Iteration 5: x = 65894
Iteration 6: x = 65155
Iteration 7: x = 52110
Iteration 8: x = 41988
Iteration 9: x = 52410

```
Kali-Linuxでログイン画面の無限ループから抜け出した方法

#はじめに
Kali-Linuxの環境設定中に、ログイン画面でユーザーとパスワードを入れた後、黒い画面がしばらく表示されたのち、ログイン画面に戻るという無限ループが発生しました。根本的な原因はよくわかっていないのですが、以下の対処をしたところ抜け出すことができたので、記録しておきます。

#環境
ホストOS：Windows10
ゲストOS：Kali-Linux2019.1
仮想化：VirtualBox6.0

#発生した直前の状況
Kali-Linuxの環境設定で、パッケージの更新をするために以下を実行しました。
1. apt-get update
2. apt-get upgrade

1.はすぐに終了したのですが、2.は実行に時間がかかっていたのでしばらく放置していました。30分ほどたって画面を見ると、ログイン画面が表示されていました。その後、ユーザ・パスワードを入力するも無限ループしてしまいました。

本件、「ハッキング・ラボのつくりかた」（翔泳社/IPUSIRON著）の作業中に発生したもので、Twitterでつぶやいたところ、著者のIPUSIRON様ご本人から[この][link-1]ページをご紹介いただきました。また、他にも何名かの方からアドバイスのコメントをいただき感謝の限りです。
[link-1]:http://www.kalitut.com/2018/06/kali-linux-login-loop-solved.html


#原因
根本的な原因はよくわかっていません。（私が勉強不足なこともあり、今後わかったら追記するかもしれません。）


#対処方法
１．ログイン画面が表示されている状態で、［Ctl］＋［Alt］＋[F1～F6]を押して、仮想コンソールを表示する。今回は、F1は使えなかったので、F2を使いました。

２．仮想コンソールでログインユーザとパスワードの入力を促されるので、rootユーザーでログイン。

３．[ご紹介いただいた記事][link-1]に従って以下を実行。


```
#パッケージリストの更新
apt-get update
```
```
#パッケージの更新
apt-get upgrade
```
ここでエラーになって「dpkg was interrupted,　you must run 'dpkg --configure -a ' to correct the problem.」と表示されたので、言われるがままに以下を実行。

```
#パッケージの再設定
dpkg --configure -a
```
```
#cinnamon-control-center-dataのインストール
apt-get install cinnamon-control-center-data
```
```
#gdm3のバージョン確認
gdm3 --version
```
```
#gdm3のインストール
apt-get --reinstall install gdm3
```
```
#gnomeのインストール
apt-get --reinstall install gnome
```
```
#gnome-shellのインストール
apt-get --reinstall install gnome-shell
```
```
#gdm3の再設定
dpkg-reconfigure gdm3
```
```
#再起動
reboot
```

ここまでやったところ、無事、ログインの無限ループから抜け出すことができました。Twitterでアドバイスをくださった皆様、ありがとうございました

#参考にしたサイト
Kali Linux Login Loop
http://www.kalitut.com/2018/06/kali-linux-login-loop-solved.html
複数台のRaspberry Piで分散コンパイルし高速ビルド

Raspberry Piでビルドすると非力で時間かかって辛いので、たくさんRaspberry Piを用意し、
distccを使って負荷を分散させ高速化しようという試み。


## 材料
[Raspberry Pi 3](https://amzn.to/2UgdbBP) × ３

とりあえず、Raspberry Pi３台構成で、
１台をmaster（172.16.83.66）にして、残り２台をslave（172.16.83.67、172.16.83.68）という構成です。

あとはmicroSDとかLANケーブルとかルーターとか電源とかいろいろ準備します。
OSはRaspbian。


## masterもslaveも共通の作業

### いつも最初にやるやつ
とりあえず最新に、`build-essentials`と`vim`も使いたいので入れます。

```
$ sudo apt-get -y update
$ sudo apt-get -y upgrad
$ sudo apt-get -y install build-essentials vim
```


### distccをインストール

```
sudo apt-get -y install distcc
```


### config設定
```
$ sudo vim /etc/default/distcc
```

```:/etc/default/distcc
STARTDISTCC="true"
ALLOWEDNETS="0.0.0.0/0"
LISTENER=""
JOBS="4"
ZEROCONF="false"
```

これは全許可設定なので嫌な方は絞ってください。
`JOBS` にはコア数を記述します。


ここまでがslaveでもやる作業


## masterのみの作業

### 環境変数に実行マシンのIPアドレスを登録

```
$ export DISTCC_HOSTS="172.16.83.66 172.16.83.67 172.16.83.68"
```

いつも使用するhostが固定な場合は、`/etc/distcc/hosts` に記述してもOKです。


### 実行

```
$ CC="distcc gcc" CXX="distcc g++" make -j 12
```

`-j` には全台の使用するコア数（４コア×３台 = １２）を設定


## 計測してみる
OpenframeWorksのサンプルを試しにビルドしてみました。

```:普通にビルドした場合
$ time make 
real    18m15.392s
user    17m38.395s
sys     0m41.810s
```

```:distccを使用した場合
$ time CC="distcc gcc" CXX="distcc g++" make -j 12
real    6m23.335s
user    5m20.043s
sys     0m38.650s
```

ちゃんと３倍くらいの速度になっていて良い感じです。


## 今どのhostで処理しているかを確認
ちゃんと働いているか気になるときは `distccmon-text` で確認できます。

```
$ watch distccmon-text
 15159  Compile     ofSystemUtils.cpp                          172.16.83.66[0]
 15198  Compile     ofFileUtils.cpp                            172.16.83.66[1]
 15372  Compile     ofRendererCollection.cpp                   172.16.83.66[3]
 15172  Compile     ofURLFileLoader.cpp                        172.16.83.67[0]
 15211  Compile     ofXml.cpp                                  172.16.83.67[1]
 15359  Compile     ofGraphics.cpp                             172.16.83.67[2]
 15289  Compile     ofEvents.cpp                               172.16.83.67[3]
 15185  Compile     ofUtils.cpp                                172.16.83.68[0]
 15224  Compile     ofMatrixStack.cpp                          172.16.83.68[1]
 15346  Compile     ofBitmapFont.cpp                           172.16.83.68[2]
 15300  Compile     ofPath.cpp                                 172.16.83.68[3]
 15397  Preprocess                                                localhost[0]
```
Store error: the application attempted to write an object with no provided id 

### Store error: the application attempted to write an object

すべてのクエリでidを要求すれば解決する

```graphql
query ($id: ID!){
  user(id: $id){
    id //これ
    username
    tags {
      edges{
        node{
          id //これ
          name
        }
      }
    }
}

```

https://stackoverflow.com/questions/49068077/error-on-graphql-no-provided-id-but-the-store-already-contains-an-id-of