OmniAICreator/Qiita-1.07M huggingface dataset:
jupyter/pyspark-notebookからS3に接続する

# S3のデータをPySpark + Jupter Notebookで読み込みたいんだ

PySpark、楽しいですね。
AWS GlueなどでETL処理を動かす際にもPySparkが使えるので、使っている方もいるかもしれません。ただ、デバッグはしんどいです。そんなときに使うのがローカルでのPySpark + Jupyter Notebook。インタラクティブにコードの記述・実行を行うことができてデバッグも簡単。

PySpark + Jupyter NotebookはDockerで動かすのが手間がなく便利です。

```shell_session
$ docker run -p 8888:8888 -v $HOME/pyspark-notebook:/home/jovyan/work jupyter/pyspark-notebook start-notebook.sh
```
https://github.com/jupyter/docker-stacks#quick-start

<img width="929" alt="SS_ 2018-12-20 12.10.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/36587/090177b3-f287-5ec7-2c64-47d5f65f2edc.png">

こんな感じで動きます。

ただこのままではAWS S3にあるデータを読み書きできません。

# 対応方法

Jupyter Notebookのセルにおもむろに貼り付けましょう。

```python
import os
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0 pyspark-shell'

import pyspark
sc = pyspark.SparkContext("local[*]")

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

hadoopConf = sc._jsc.hadoopConfiguration()
myAccessKey = input() 
mySecretKey = input()
hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
hadoopConf.set("fs.s3.awsAccessKeyId", myAccessKey)
hadoopConf.set("fs.s3.awsSecretAccessKey", mySecretKey)

df = sqlContext.read.parquet("s3://myBucket/myKey")
```

S3のデータを読み込むことができました！

実はこのドキュメントに記述されていたのですが、自分は上手く見つけられなかったのでQiitaに書いときます。
https://github.com/jupyter/docker-stacks/blob/master/docs/using/recipes.md#using-pyspark-with-aws-s3

他にも`jupyter/pyspark-notebook`使用時に便利なことが色々書いてあるので読んでみるといいかと。
[WIP]AWSチキンレースに挑戦！(Unityアプリ制作検討篇)

(キマったタイトルつけたかっただけなので他意はありません…）

# はじめに

要は、AWSの無料枠でどこまでできるのかを試したいな、と。
お金をかけないギリギリを攻めるということでこのタイトルにしました[^1][^2]

# レギュレーション

* 1年間の無料枠で使い倒す(1年経つ直前に閉鎖)
* あくまで検証用ですから！

# いきなり壁が

無料枠でできることを調べるついでに、今どきのWebページはHTTPSで通信しているので、そのビッグウェーブに乗ろうとするとRoute53の設定をすると有償化してしまう[^3]問題に直面。

* [参考1・AWSでドメイン、SSL証明書の取得、設定](https://qiita.com/masch/items/a5ef84998fb7784f9115)
* [参考2・無料ドメイン(.tk)とRoute53を利用して0円でHTTPS環境を設定してみた](https://dev.classmethod.jp/cloud/aws/mesoko-r53-cdn/)

…ウン、今回は**HTTP、IPアドレスのみ**の通信にしましょー

# CloudWatchはどうする？

**これもお金がかかるんで使いません！**(ドヤ顔)
なので、無茶に頻繁なアクセスをされると泣きます

# Unityのバックエンドとしてどうよ？

## 事前に必要なもの

* 当方はUnityをいじるのが多いので、Webアプリ作るより初期コストは小さそう
* [Unity（AndroidやiOS向け）SDK](https://docs.aws.amazon.com/ja_jp/mobile/sdkforunity/developerguide/what-is-unity-plugin.html)があるし、
* [C#用SDK](https://github.com/aws/aws-sdk-net)から派生した[デスクトップ向けSDK](https://github.com/aws/aws-sdk-net/blob/master/Unity.README.md)もあるので既存のAWSの構成に対処できます[^4]
* ただし、WebGLで出力するなら話は別。EC2が必要になったり、Unity・C#用のAWS SDKが使えなくなるのでそれはそれで困りもの
* [先人の知恵](https://qiita.com/Ijoru/items/8cdd49ef31bed7cafdac)も借りましょー[^5]

## AssetBundleはどうする？ S3使う？

* 使えるなら使いたいよね！[^6]
* でも、S3に置くとなるとちょっと料金体系が…
* まぁ、レギュレーションで「1年超えたら閉鎖」という縛りを入れているのであまり気にすることはないかと
* 5ギガって意外と使えるよ！…モバイルだったらw[^7]

## リリース用のページはほしいよね？

* EC2にページ置くのもいいけど、別のサービス（Herokuとか）を使うのも手かも。アプリだけS3に置いて

## 結論

* ま、適度に使うんだったらいいんじゃね？

# 余談

* 他のサービス（Azureとか）もそうだと思うけど、従量課金制は金銭感覚やセンスが本当に問われますよね。「**頭ン中で常にソロバンと大福帳が浮かんでいる**」状態でして…ネット料金が従量課金制に云々とかいう話になると「これ以上考えさせんといてくれ！」と叫びそうになります
* 当方が社会人になりたてで寮生活していた時を思い出しました…そこの電話が**テレホーダイ非対応**で…しかも、「ウルティマオンライン」にハマっていたから毎月請求書を見るのが怖くて怖くて…

# 以下、TBD

[^1]: 「無料でなんとかしてやろうとしているだけでチキンじゃねーか」とか「男らしく金を使って云々」とかは華麗にスルーします
[^2]: 天邪鬼な方々が有料課金になりそうなアクセスとかされると泣くのでAWS環境やElasticIP、URLは非公開にします
[^3]: 設定12時間以内なら検証用として無償だけど…1年通じて使うとなると…ねぇ
[^4]: API Gateway使うのはどうよ？ っていう話が…セキュリティが…というわけで保留！
[^5]: [GameLiftを使用した例](https://dev.classmethod.jp/cloud/aws/gamelift-unity/)もありますが、どう動くのかちょっと調べたい…というわけで保留！
[^6]: AssetBundleはUnity4まではPro版のみの機能でしたが、Unity5以降は全エディションで使用可能となりました
[^7]: AAAタイトルだったら何ギガ要るか…ちなみに、S3 Standardで２TBの容量を確保（するだけ）だったら月50ドル程度の出費となります
SAP Cloud PlatformとVRとIoTを組み合わせて、釣りゲームを作ってみた

# はじめに
この記事は [SAP Advent Calendar 2018](https://adventar.org/calendars/3262) の12月20日分の記事として執筆しています

こんにちわ、株式会社ＫＹＯＳＯでエンジニアをしている上田といいます。
よろしくおねがいします。

今回は、弊社米倉がSAP CloudPlatformと温度センシングを組み合わせて面白そうなものを作っていたので、少し遊んでみたことの紹介をさせていただきます。

なぜ、釣りゲームなのか？
それは温度センシング部分のハードウェアを見てもらえば一目瞭然ですが
![ハードウェア.png](https://qiita-image-store.s3.amazonaws.com/0/303235/5784615c-8bf1-4fc5-1767-1f39d4c058f7.png)

どう見ても釣りです。

なので、釣りゲームを試作して遊んでみることにしました。

## 環境（追加分のみ）
開発環境 : SAP Web IDE Full-STACK
ブラウザ  : Google Chrome, Safari
ライブラリ : A-Frame

## 構成概要
<img width="795" alt="スクリーンショット 2018-12-13 16.06.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/303235/7c3d6d97-1824-438d-69d2-4d8ecc81783c.png">

左側から、温度センシングデバイスで計測された温度データが、SORACOMを経由してSAP HANAへと流れていきます。
この温度データを取得してVRで表現したものが、今回作ったものになります。

## 画面
実際に作成した釣りゲームの画面です。

<img width="878" alt="スクリーンショット 2018-12-13 11.30.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/303235/8114a53a-b420-8a1a-7d05-d3678b530d91.png">

A-FrameというWebVRフレームワークを使用してブラウザ上へリアルタイムに描画しています。

では、少しA-Frameについて掘り下げて説明したいと思います。

## A-Frameとは
A-Frameは、Three.jsをベースとして開発されたフレームワークで、
HTMLのタグとしてシーンを記述出来ます。

A-Frameは、次のような特徴があります。
1. htmlタグでシーンを記述可能
2. VRサイトをレスポンシブに構築可能
3. 物理ベースレンダリングでマテリアル指定
4. ソースプログラムは、MITライセンスで公開

では、実際にA-Frame を利用したコードを見てみましょう。
魚( 奥のたい焼き )を表示している部分のコードです。

```html

<a-scene>
  <!-- sakana -->
  <a-image id="fish" position="1 0 -20" scale="2 2 0.1"
           src="img/sakana.png">
    <a-animation id="fish_anime" attribute="position" from="1 0 -20" to="1 0 -20" direction="normal" dur="1000" easing="linear"
                 repeat="0"></a-animation>
  </a-image>
</a-scene>
```
<a-image> タグが魚を表示するためのタグです。
表示に必要な情報を属性として表示しています。

|属性名 |内容 |
|:---|:---|
|position |表示位置( X Y Z )|
|scale|表示サイズ( X Y Z )|
|src|魚の画像|

また、この魚はアニメーションで移動するように設定しています。
このアニメーション設定を<a-animation>タグで指定しています。
こちらも同じく属性指定で細かな設定をしています。

|属性名 |内容 |
|:---|:---|
|attribute |アニメーション対象の属性値 `position` は表示位置を変更|
|from |開始位置( X Y Z )|
|to |終了位置( X Y Z )|
|dur |from から toまでアニメーションするのに必要な時間( 単位は ms )|
|easing|変更速度( linerは一定 )|
|repeat|繰り返し回数|


## A-Frame Inspector
A-Frameを使用する場合、自分でHTMLタグを記載して3Dオブジェクトを配置していくのは現実問題として厳しいと思います。
そこでグラフィカルに３Dオブジェクトを配置したり出来るA-Frame Inspector というGUIツールが用意されています。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/303235/95b39c82-0c46-1c43-54d0-3df4a16cb23b.png)

A-Frame Inspectorは、`<a-scene>`タグに一文を追加してから、`ctrl + alt + i`で起動します。

```HTML
<a-scene inspector="url: https://aframe.io/releases/0.3.0/aframe-inspector.min.js">
```

A-Frame Inpsectorで生成や設定した3Dオブジェクトは、そのままHTMLファイルに保存出来るので、デザインだけならマウス操作だけで（ほぼ）作ることが出来ます。


## 最後に
この釣りゲームの開発は`SAP Web IDE Full-STACK`で完結しました。
SCP はFiori がクローズアップされることが多いですが、Fioriに関係ない開発でも
インターネット環境だけあれば揃うのが SCPの強みかなと思います。
新卒エンジニアがつまずいたAutoLayoutの基礎

# はじめに
4月に新卒で入社してから8ヶ月が経ち、
研修や案件で一番苦労したStoryBoard上でのAutoLayoutについて、
備忘録として基礎の部分を記載します。

# AutoLayoutとは
AutoLayoutとはiPhoneやiPadの様々な異なる画面サイズに対して、パーツをいい感じに配置するための仕組みです。
StoryBoard上でパーツを配置する場合は、他のパーツの上部と揃えたり、y軸から○○pxの位置に配置したりなどの制約(Constrain)をつけることでパーツの配置を行います。

### ちなみに・・・
制約は自動でも設定できます。
**しかし**、自動で制約をつけてしまうといらない制約だったり、レイアウトが崩れたりします。
私は研修中ずっと自動で制約をつけていたため苦労しました。。。
自動で設定するやり方はおすすめできないためここでは割愛します。

#制約の方法
StoryBoard上で制約を行う場合、StoryBoardの右下にある5つのアイコンをいじることで大体は制約をかけることができます。
この中でも右の3つのアイコンはよく使うものだと思います。
<img width="300" alt="スクリーンショット 2018-12-19 16.51.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/198843/6f8e72b5-7e6b-7d08-5973-55941e68e813.png">

Viewに対して制約をかける場合、
・X軸
・Y軸
・Width
・Hight
をを使い制約をかけていきます。

# 制約の掛け方①
制約を掛ける方法として１番馴染みやすい方法がSpacing to nearest neighbor　だと思います。
この制約はStoryBoardの右下のアイコンの右から2つ目のアイコンから設定できます。
この方法は空白に値を入力して適応させるだけの方法です。


<img width="300" alt="スクリーンショット 2018-12-20 10.37.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/198843/6a33d744-ba87-1c2d-cd41-cedf2796cabb.png">

|名前  |内容  |
|---|---|---|
|Spacing to nearest neighbor  |隣接アイテムとの距離（余白）  |
|Width  |幅  |
|Height  |高さ　　|
|Equal Widths  |固定幅  |
|Equal Height  |固定の高さ  |
|Aspect Ratio  |アスペクト比  |
Aspect RatioはWidthかHeightのどちらかの制約が決まっていればそれに合わせて入力された比率でレイアウトしてくれます。

# 制約の掛け方②
2つ目の制約の掛け方は先ほどのStoryBoradの右下のアイコンの右から3つ目のアイコンをクリックすると出てくるAlignment Constrainsについて紹介します。
この制約は他のアイテムとの兼ね合いによって制約が決まる方法です。
<img width="293" alt="スクリーンショット 2018-12-20 11.33.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/198843/544aebb9-6738-ff72-d88c-6908d8c5431e.png">

|名前  |内容  |
|---|---|---|
|Leading Edges  |アイテムの左端から他のアイテムの左端までの水平距離 |
|Trailing Edges  |アイテムの右端から他のアイテムの右端までの水平距離 |
|Top Edges  |アイテムの上端から他のアイテムの上端までの垂直距離　　|
|Bottom Edges  |アイテムの下端から他のアイテムの下端までの垂直距離  |
|Horizontal Centers  |アイテムの中心から他のアイテムの中心までの水平距離  |
|Vertical Centers  |アイテムの中心から他のアイテムの中心までの垂直距離  |
|First Baselines  | ベースラインから他の部品のベースラインまでの垂直距離  |
上記の制約は他のアイテムとの兼ね合いによって制約が決まるなので複数のアイテムを選択した時に設定ができる制約です。

|名前  |内容  |
|---|---|---|
|Horizontally in Container  |中央からの水平距離 |
|Vertically in Container  |中央からの垂直距離 |

今回はAutoLayoutで主に使用する制約の説明のみでした。
機会があれば、他の記事で詳しく画面を作成して説明したいと思います。
SimPholdersの使い方

# SimPholdersの使い方

[qnote Advent Calendar 2018](https://qiita.com/advent-calendar/2018/qnote)の7日目に[Xcode使うなら入れておいた方がいいもの、便利な機能](https://qiita.com/k-k-c/items/6be974c38700754e50e4)を投稿した際にSimPholdersの使い方の記事が見つからなかったのでまとめてみました。

##### SimPholdersとは
SimPholdersはSimulatorを扱いやすくするアプリです。(iOSアプリ開発者は入れておいて損はないと思います)
体験版は11日の使用期限があり、11日を過ぎると使用できなくなってしまいます。
ごにょごにょすればまた使えるようになります。(自己責任で)

##### 使い方
まず起動すると下のダイアログのようなものが表示されます。(体験版の場合のみ？)
<img width="492" alt="スクリーンショット 2018-12-17 21.20.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/149731/dc484844-cff8-795c-feb8-f2e187c94e93.png">
Continue Trialを押してはじめてみましょう。

SimPholdersが起動するとメニューバーにアイコンが表示されます。
アイコンをタップすると下の画像の①と②があるメニューが開きます。


<img width="1119" alt="スクリーンショット.png" src="https://qiita-image-store.s3.amazonaws.com/0/149731/f16019f3-1a53-3e47-47ed-9685605f8bde.png">


### ① Recent Apps
最近開いたアプリが3つ表示されます。
フォーカスを当てると⑤のApp Actionsのメニューが表示されます。

### ② iOS xx Simulator
アプリがインストールされているSimulatorの一覧が表示されます。
複数のバージョンがインストールされているとバージョン毎に分かれて表示されます。
起動しているSimulatorには色が付きます。

### ③ Applications
フォーカスされたSimulatorにインストールされているアプリの一覧が表示されます。

### ④ DeviceAction
フォーカスされたSimulatorに対して操作を行うことができます。

- Reveal in File Viewer
Simulatorの中の場所をFinderで表示します。
~/Library/Developer/CoreSimulator/Devices/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/

- Launch
フォーカスされたSimulatorが起動していない場合に表示される項目で、フォーカスされたSimulatorを起動させることができます。

- Add Photos...
画像ファイルをSimulatorに入れることができます。
写真アプリを起動すると選択した画像が入っていることを確認することができます。

- Add Videos...
動画ファイルをSimulatorに入れることができます。
写真同様に写真アプリで確認することができます。

- install Application...
.appファイルをSimulatorにインストールすることができます。
(.ipaファイルは選択できない)

- Reset Content and Settings...
Simulatorに設定とインストールされているアプリを削除します。
SimulatorメニューのHardware/Erase All Content And Settings...との違いは確認していません。

- Copy Path to Pasteboard
クリップボードにSimulatorのパスをコピーします。
~/Library/Developer/CoreSimulator/Devices/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

### ⑤ App Actions
フォーカスされたアプリに対して操作を行うことができます。

- Reveal Sandbox in File Viewer
フォーカスされたアプリの場所をFinderで表示します。
~/Library/Developer/CoreSimulator/Devices/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/data/Containers/Data/Application/

- Launch in Simulator
フォーカスされたアプリを起動させることができるようです。
(エラーでSimulatorが起動するところまでは確認ができましたが起動させることはできませんでした。)

- Copy Sandbox Path to Pasteboard
クリップボードにアプリのパスをコピーします。
~/Library/Developer/CoreSimulator/Devices/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/data/Containers/Data/Application/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx

- Reset Data...
フォーカスされたアプリのデータを削除します。
(インストール直後の状態になります)
わざわざ削除してインストールする手間が省けますね。

- Uninstall...
フォーカスされたアプリをSimulatorから削除します。

- Open Database with Realm Browser
SimulatorにrealmファイルがあるとRealm Browserを開いて内容を見ることができます。

- Open User Defaults
フォーカスされたアプリに保存されているUserDefaultsを開いて内容を確認することができます。

### ⑥ App Information
フォーカスされたアプリの以下の情報を確認することができます。

- Bundle Identifier
- バージョン
- アプリファイルのサイズ
- Sandbox内のサイズ

# 最後に
便利なので使ってみてください。
超初心者向け　gitコマンド


今回は初心に戻って超初心者向けの基本であるコマンドを書いていきます。

###参考文献

GitHub　実践入門
サルでもわかるGit入門


###基本的な用語
まず最初に基本的な用語をさらっと説明をします。

- リポジトリ
ファイルやディレクトリの状態を示す場所
リモートリポジトリとローカルリポジトリの２種類に分けられる。

- ブランチ
履歴の流れを分岐して記録していくためのもの。分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことが出来る

- コミット
ファイルやディレクトリの追加・変更をリポジトリに記録する

- マージ 
ブランチでそれぞれ行った変更を統合ブランチ(通常はmaster)に統合する。変更内容の履歴はそのまま残るため、履歴は複雑になる。

- リベース
マージと同じでブランチの統合するときに用いる。リベースの場合は、履歴は単純になるが元のコミットから変更内容が変更される。



- チェックアウト
現在のブランチを切り替えるときに使用する操作。


- プル
リモートリポジトリの履歴の最新状態を取得できる。

- クローン
リポジトリの内容をまるまるダウンロードしてきて、別のマシンにローカルリポジトリとして作成できる。


###コマンドリスト

###基本的な操作

- リポジトリを初期化

```
$ git init
```

- リポジトリの状態を確認

```
$ git status
```

- ファイルを追加

```
$ git add <ファイル名>
```

- リポジトリの歴史を記録し、コミットメッセージを記録する

```
$ git commit -m"メッセージ"
```

- コミットログを確認

```
$ git log
```

- 指定したディレクトリ、ファイルのみのログを表示する

```
$ git log <ディレクトリ名　または　ファイル名>
```

- 変更差分を確認

```
$ git diff
```

###ブランチの操作

- ブランチ一覧を表示

```
$ git branch 
```

- ブランチを切り替える

```
$ git checkout <ブランチ名>
```

- ブランチを作成し、切り替える

```
$ git checkout -b <ブランチ名>
```

- 1つ前のブランチに切り替える

```
$ git checkout -
```

- ブランチをマージ

```
$ git merge --no-ff <ブランチ名>
```

- ブランチを視覚的に確認する

```
$ git log --graph
```

###コミットを変更する操作

- ブランチを分岐する前に戻る

```
$ git reset --hard <戻りたいコミットのコミットコード>
```

- コミットメッセージを修正

```
$ git commit --amend
```

- コミットをまとめる

```
$ git rebase -i <派生元コミット>
```

- rebaseを行う

```
$ git rebase develop
```

###リモートリポジトリへの送信

-  リモートリポジトリを登録

```
$ git remote add <リポジトリ> <リポジトリパス>
```

###リモートリポジトリから取得

- リモートリポジトリを取得

```
$ git clone <url>
```

- 最新のリモートリポジトリのブランチを取得

```
$ git pull <リポジトリ>　<ブランチ>
```
Pythonでバイナリデータを扱う | 読み込みと16進数表示（ただそれだけの記事）

<br>
[明治大学総合数理学部 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/meiji_univ) 21日目の記事です. 
現象数理学科４年の江口です. １年ぶりのQiita投稿です. 昨年の初投稿記事「[WaveNetまとめ](https://qiita.com/MasaEguchi/items/cd5f7e9735a120f27e2a)」は拙い文章でしたが, 読んでくださった方ありがとうございます！

今回はバイナリデータをPythonで扱う方法をまとめました. 
といってもバイナリデータを読み込んで, 16進数表記で表示する方法だけです. 


# 背景（この記事を書くに至った経緯）
ある地域のある時刻におけるレーダ雨量データを扱う必要がありました. このデータはバイナリで, ヘッダ部分(最初の64byte)に, 本来は16進数で意味を持つ観測地や観測日時, レーダ雨量データのデータサイズの情報があります. 16進数に書き直してデータの詳細を理解する必要があったわけです. そこでいざ調べてみると色々記事あるのですが, まあ難しいわけです(以下を読むと大したことはないのですが, サーチの下手な自分には大変だった). というわけで試行錯誤しながら身につけた方法を自分用にまとめなおしました. 

# 目的
バイナリデータを, データの内容がわかるように書き換える. 

# そもそもバイナリデータって？
バイナリデータとは「2進数で表されているデータ」のことです。コンピュータは電流のONかOFF, 「0」か「1」でデータを表現します。と思っていたのですが, ２進数に限らずコンピュータが理解できるように書かれているデータ全般を指すらしいです。人間が読んで理解できないデータですね。
これは「テキストデータ」と対比して使われます。テキストデータは.txtなど文字列のデータで, 人間が読めるデータです。

# バイナリデータの取り扱い
## バイナリデータの読み込み
以下のコードで読み込めます. 

```py3
with open(file_path, "rb") as f: 
  buf = f.read(byteSize)
```

そうです, これだけでバイナリデータを読み込めます. C言語だと`buf=malloc(sizeof(char)*byteSize);`からの`fread(buf, sizeof(char), byteSize, fp);`と少し手間がかかりました. <br>
注意点は`open(file_path, "rb")`の部分です. "r"が読み込み, "b"がバイナリデータに対しての操作を意味します(書き込みのときは"w"). <br>
`buf = f.read(byteSize)`のbyteSizeは読み込むデータのバイト数を指します. <br>
注) `buf=f.read(byteSize).hex()`と後ろにhex()を加えると16進数に変換してくれますが, 各桁1つずつが配列に代入されるので, 後の処理で再度配列2つずつに区切るのが面倒になります. 

## 16進数表示
先ほど読み込んだバイナリデータの１番目, buf[0]を16進数でprintするコードは以下の通りです. 

```py3
print("{0:02x}".format(buf[0]))
```

python3のprintの書き方は色々ありますが, 今回はformat()を使って変数の値をprintします. 
"02x"は値を16進数("x"の部分)で, 2桁("02"の部分)で表記します.  <br>
変数を複数表示したい場合は以下のように書きます. 

```py3
print("{0:02x}{1:02x}".format(buf[1], buf[2]))
```

# まとめ
```py3
with open(file_path, "rb") as f: 
  buf = f.read(byteSize)
print("{0:02x}".format(buf[0]))
```
以上です(笑)

# おわりに
内容の薄い記事になってしまいました. もっと内容を広く, 体系的にまとめるべきですね. 
<br>
低次元トポロジー計算ソフトウェアReginaについて書こうと思っていた時期が自分にもありました

# はじめに
この記事は谷ゼミの落書き帳 Advent Calendar 2018 20日目の記事になる予定でした．
なぜ過去形で書いているかというと，これを書いている12/20 11時現在まだページが真っ白なんですよね．．．

正直卒論の進捗が思ったよりもないのでこれ書いてる暇がありません!!!!!!!本当にごめんなさい!!!!
また，ちょっと時間ができたら(多分年末)にまた記事書いてあげます!!
ではみなさん良いクリスマスを!!!!
【個人的備忘録】pythonの*argsの使い方　まとめ

```
テストコード：

def Test(*args):   #*argsを引数に指定
    for i in arg:  #for文でiに代入
        print(i)   #printで出力
Test("come", "here", "cororonn!") #実行結果

# ↓実行結果↓
"""
come
here
cororonn!
"""

また次のようにもできる
def Test_second(word, *args):
    print("word =", word)
    for i in args:
        print(i)
# Test_second("TEST", "language")

t = ("TEST", "RESET")
Test_second("TEST", *t) 






```
Erisでyoutubeの再生をしてくれる簡単なDiscordBotを作った

#はじめに#
今回は、完全に趣味でDiscordのbotを作ってまとめれそうだったのでQiita初投稿です。

#目的#
discordの自作botでYoutubeを再生したい！
あわよくばmp3とかのリンクで再生したい！

#環境#
DiscordのAPIのNode.js wrapperとしてErisを使っています。
デプロイはHerokuで行っています。
Youtubeからの音声取得はytdl-coreを使用しています。
Eris : https://abal.moe/Eris/
ytdl-core : https://www.npmjs.com/package/ytdl-core

※ytdl-coreをHerokuで使用する際ffmpegを導入しなくてはいけません。
こちらのサイト様を参考にさせていただきました。
http://dosukoikoi.sub.jp/blog/archives/248

#コード#
```index.js
const eris = require("eris");
const ytdl = require('ytdl-core');

var bot = new eris(== 自分で取得したDiscordBotのToken ==);

//メッセージが作られた際に反応
bot.on("messageCreate", (msg) => {
	//BOTのメッセージには反応しない
	if (msg.author.bot) return;

	console.log(msg.content);

	MusicPlay(msg);
});

// Discordに接続します
bot.connect();

// 音楽の再生
const streamOptions = { seek: 0, volume: 0.06 };
function MusicPlay(msg) {
	// メッセージ投稿メンバーが通話に存在しない場合はスルー
	if (!IsVoiceChannel(msg.member.voiceState.channelID)) return;

	// URLを抜き出す
	let match = (msg.content).match(/(?:^|[\s　]+)((?:https?|ftp):\/\/[^\s　]+)/);
	if (!match) return;

	let url = match[1];

	console.log("再生するURL : " + url);

	let channelId = msg.member.voiceState.channelID;
	// ボイスチャンネルに参加して再生
	bot.getChannel(channelId).join().then(connection => {
		if (url.indexOf("youtube") == -1) {
			// Youtube以外の場合
			connection.play(url, streamOptions);
			return;
		}

		// Youtubeの場合 
		const stream = ytdl(msg.content, { filter: 'audioonly' });
		connection.play(stream, streamOptions);
	}).catch(console.error);
};
```
Erisには標準でmp3のリンクから音声を再生する機能がありますが、
Youtubeを再生する場合ytdlの機能を使用しての、音声streamを渡す必要がありました。

```
const stream = ytdl(msg.content, { filter: 'audioonly' });
connection.play(stream, streamOptions);
```


#まとめ#
今回はユーザーが音のURLを投稿したときボイスチャンネルに参加して音を再生するBotを作成しました。

初の記事なので至らない点が多いと思いますが手助けになれば幸いです。
間違っている点や改善点等あればコメントにて教えていただける助かります。
新人でもできる信頼関係構築のレシピ

もうすぐクリスマスですね。この記事は[モチベーションクラウド2018年アドベントカレンダー](https://qiita.com/advent-calendar/2018/mcs)21日目になります。昨日は@masao-shimadaさんの[QAとしてアジャイル開発で実践すべきこと](https://qiita.com/masao-shimada/items/aca4e52031d065069b1f)でした。お疲れ様でした。

僕は、この12月からモチベーションクラウドの開発部門に入ったばかりの新人です。前職ではテックリードもやったんですが、まだまだアプリケーションの仕様や使ってる技術を把握はできておらず、チームの皆さんにおんぶにだっこ状態です。
そんな仕事の成果ではなかなか貢献できない中、少なくともみんなと楽しく仕事をするために「信頼関係を築こう」と3週間ほどいろいろと動いてきました。
転職や移動、配属などで、仕事内容以外で信頼を築く必要がある人の助けになれば幸いです。

## 前提1：組織においてルールよりも信頼が大事
「厳密なルールよりも信頼を想像することが大事」だとリンクアンドモチベーション代表の[小笹さんも言ってました](https://www.nikkeibp.co.jp/article/nba/20090220/186794/?P=3)がその通りだと自分も思っています。ルールは増えると結局運用仕切れないし曖昧な部分も絶対に残ってしまう。それをカバーするのが信頼という考えです。
逆に言うと信頼があればルールは少なくて済むので仕事もしやすくてハッピーです。
なんでもいいので信頼を築くことはお互い楽しく過ごすために必須のことだと思っています。

## 前提2:他の人がやってないことをやるほうが信頼は築きやすい
人の評価は相対評価になりやすいです。部の全員がフロア内に響き渡る大声で挨拶をしている中で、「大きな声で挨拶をしよう」と決めてやっていても、それはなかなか評価されません。
でも、みんな遅刻ギリギリで来る会社で一人だけ朝６時には出社してるとしたらどうでしょう？それは、「あいつはいつも早く来ている」という認識になり、結果信頼が構築されると思います。
他の人と違うことをするというのが信頼を築くポイントです。

## やったこと1: 「挨拶をする」（ザイオンス効果）
仕事で成果が出せない以上、やれることは少ないです。なので、誰でもできる「挨拶」を超本気でやることにしました。
殺伐としたチームならいざしらず、モチベーションクラウドの開発チームはみんな普通に挨拶します。それと一線を隔すために「各人と目を合わせながら挨拶する」ようにしてます。
毎日しつこいくらいやるので、やりすぎて「グリーティングハラスメント」（通称: グリハラ）というワードまでできちゃいましたw
最近では他の新人エンジニア達も巻き込んでやってます。
なんでもないことですが、そこで生まれる会話もあるし、お互い気持ちいいのでおすすめです。
行動心理学的にも接触する機会が増えるごとに、抵抗がなくなっていくといわれてるので、接点を増やすのは信頼を築く上で大事な行為かなと思います。

## やったこと2: 「寝癖を直す」（リスクヘッジ）
前職だと、寝癖はもはやトレンドマークになってたんですが、リンクアンドモチベーションはコンサルティングがメイン事業の会社であり、開発メンバー以外はビジネスカジュアルやスーツの人が多いです。
きちっとした格好をすることは求められてないですし、今もジーパン＆Tシャツですが、寝癖は人によっては嫌悪感を抱かせてしまうリスクがあるため、寝癖は直すことにしました。
前職の人に会うと「成長したね」と褒められますw
格好に制限がないとしても、「見た目は9割」「第一印象は5秒できまる」などといわれるなかで、せめて嫌悪感を抱かれないようにするのは大事かなと思います。

## やったこと3: 「毎日半袖でいる」（ブランディング）
これは意図したわけではないのですが、GINZA SIXのオフィスは空調が素晴らしく冬でも過ごしやすい環境です。
もともと体温が高いので、冬でもオフィスの中では半袖でいたら「寒くないですか？」と話しかけられるようになりました。
たまたま半袖がなかったので長袖で出社したら驚かれちゃったので、その日は腕まくりでいることに。。。
そんなこんなで見事「冬でも半袖でいる変なやつ」というブランドが構築され、床に座りながら障害対応していてもよい権利を得ましたw


## 最後に
信頼関係は約束を守ることを積み重ねることによって築き上げられます。上記は勝手に期待を作り上げることで暗黙の約束を作って、その期待に答えることで約束を守っている感じです。
とはいえ、ビジネスにおいてはやっぱり仕事の成果が一番の信頼要素です。
これからは「すべての組織をこれで変える」ためにモチベーションクラウドも開発チームも最高の作品にできるように、最大限貢献していこうと思います。
みなさま、不束者ですがよろしくおねがいします。
Docker, Heroku環境にqiita-markdownを導入する

# はじめに

本記事は[qiita-markdownを含んだGemfileをHerokuにpushするには](https://qiita.com/kwappa/items/aa577c0baeb46d22a9be)と[herokuでqiita-markdownを使う方法](http://docs.komagata.org/5422)を参考にしています。
それをもう少し噛み砕いて、かつ内容が多少古くなっているため2018年12月21日現在まで、私が動作確認のとれた方法を書き記したいと思います。

## qiita-markdownを導入するまでの基礎知識

qiita-markdownは[charlock_holmes](https://github.com/brianmario/charlock_holmes)と[rugged](https://github.com/libgit2/rugged)のふたつのgemに依存しています(正確にはgithub-linguistというgemもありますがこちらはGemfileに普通に書けばいいので特に問題はありません)。
そのためこのふたつのgemを同時に導入する必要があるのですが、Herokuは多少の知識が必要です。重い内容ではありませんが、初めてHerokuをいじる、もしくは軽く程度の方には多少荷が重いと思うのでもう少し分かりやすくまとめたいと思います。

具体的にはcharlock_holmesはlibicuが、ruggedはcmakeという外部のツールをインストールする必要があります。これをHerokuとついでにDocker(特に公式のRubyイメージは利用している方が多いハズ)にいれる部分を記します。


### Docker

公式のRubyイメージからのビルドを想定しています。
以下Dockerfile

```:Docker

FROM ruby:2.5.0

ENV LANG C.UTF-8
ENV WORKING_DIR /var/www/html

WORKDIR $WORKING_DIR

RUN apt-get update -qq && \
    apt-get install -y sudo build-essential libpq-dev vim postgresql-client nodejs

# charlock_holmes, ruggedの依存ライブラリ
RUN apt-get install -y libicu-dev cmake

ADD ./Gemfile $WORKING_DIR
ADD ./Gemfile.lock $WORKING_DIR

RUN gem install bundler

RUN bundle install
```

よくある普通の構成だと思います。
コメントしている部分が注目すべき部分でDockerfileではapt-getよりlibicu-devとcmakeをいれてください。libicu-develをいれている方もいますが、私の環境では公式Rubyイメージでlibicu-develをいれるとcharlock_holmesはbundle installエラーとなりました。もしかたら入ったかたもいらっしゃる可能性はありますがここではこちらを推奨します。

### Heroku

ここが本題です。
まずはじめにbuildpackを用意します。
buildpackはHeroku上の環境構築だと思っていただければいいと思います。
例えばRubyであったら `heroku/ruby` とういうbuildpackをいれることによってRailsは動作することができるます。
このbuildpackは複数いれることができますが、順番によっては動作しない例もある(私はまだお目にかかったことはありませんが)とのことなので、気をつけてください

#### buildpackの追加
ではHeroku上にbuildpackを追加していきましょう。
まずはじめはcharlock_holmesを動作させるためのlibicuをいれます...が直接は無理なのでaptでとってこれるように準備します。
Herokuでは `Aptfile` と呼ばれるものをアプリのルートで作成することによって、そこに必要なツールをインストールすることができます。

```:Aptfile
libicu52
libicu-devel
```

こちらではDockerと違いlibicu-devではエラーになったのでlibicu-develを入れてあげます。
次に、このAptfileを実行させるために必要なbuildpackを用意してあげます。これは `heroku buildpacks:add` コマンドでHeroku環境に入れることができます。ただし

> 順番によっては動作しない例もある

ため読み込む順番を指定してあげます。オプションの `--index` を使います。
最終的に打ち込むコマンドはいかになります。
`heroku buildpacks:add --index 1 https://github.com/heroku/heroku-buildpack-apt`
これでAptfileとbuildpackの環境が入ったのでcharlock_holmes環境はOKです。

次に、ruggedをいれるためcmakeを導入します。
こちらはbuildpackだけをaddしてあげれば良いのですが、現在のGitHubのリポジトリURLが違うため注意が必要です。以下コマンドを入力してください(またURLは変更される可能性があります。その時はggるなりすればリポジトリがでてくるはずなので注意してください)。
`heroku buildpacks:add --index 2 https://github.com/customink/heroku-buildpack-cmake`

最後に必要なbuildpackが入っているか調べます `heroku buildpacks` コマンドを打って順番通りになっていたら成功です! *補足* 最後にheroku/rubyがあるようにしてください。

あとはいつも通り `git push heroku master` してあげてください。 Good Luck!


## 参考
- [qiita-markdownを含んだGemfileをHerokuにpushするには](https://qiita.com/kwappa/items/aa577c0baeb46d22a9be)
- [herokuでqiita-markdownを使う方法](http://docs.komagata.org/5422)
ng-hrefの遷移先を条件でふり分ける3つの方法

### 方法1. ng-ifを使ってNULL と IS NOT NULL判定(ng-ifを2つ書く)
複雑怪奇なコードになりやすいので、微妙だが、実装が一番容易

```
<div ng-if="!test.view">1</div>
<div ng-if="!!test.view">2</div>
```
#### 解説
if-elseを書きたいところだけれど、ng-ifではelseがないので、条件が真になるパターンと偽になるパターンをあえて書く。
二重否定(!!)で真の時の条件式、否定での偽の時のパターン

> 参照: javascript - how to check for null with a ng-if values in a view with angularjs? - Stack Overflow : http://stackoverflow.com/questions/23556092/how-to-check-for-null-with-a-ng-if-values-in-a-view-with-angularjs

### 方法2. ng-clickの中に処理を仕込んでng-hrefの参照先を切り替える。
多分、正攻法

```html.
<a ng-href='{{link}}' ng-click='test(type);'> your link </a>
```

```コンポーネント.
$scope.$watch('m', function(value){
    $scope.link = value ? 'link1': 'link2';
})
```

> 参照 javascript - AngularJs if statement in ng-href - Stack Overflow : http://stackoverflow.com/questions/29888624/angularjs-if-statement-in-ng-href

### 方法3. ng-href内で三項演算子を書く 
方法1よりはマシ
複雑な条件判定式を書こうとすると複雑怪奇なコードを生む可能性が高い

```
<a ng-href='{{(element.url.indexOf("#")>-1) ? element.url : element.url + "client_id="}}{{credible.current_client_info.client_id}}'>{{element.title}}</a>
```

### 最後に一言言わせて欲しい

Qiitaに下書きかいて2年も放置していたので、ずいぶん古いネタになってしまった。
が、せっかく書いていたので公開して、残しておこうと思う。



Angular聞かなくなったね…

おしまい
Googleに淘汰されたコマンド~manとapropos~

エンジニア諸兄姉は日頃常々シェルを用いてコンピュータの操作を行っていると思いますが、いかがでしょうか。
えぇ、もちろんその通りでしょう。
もしコマンド操作している際に、分からないコマンドがあった場合どうしていますか？
え？Googleで調べている?

**バカヤローーーー!!!**~~(申し訳ございません)~~

分からないコマンドは`man`と`apropos`を使って調べていきましょう。

#📕man
how to use
`$ man KEYWORD`
manとは、皆さんご存知の通りキーワードに指定した語句のマニュアル(MANual)を表示するコマンドです。
それではmanコマンドについてよく見ていきましょう。manコマンドのmanを開いてください。
通常はlessで表示されます。lessとは何かって? man less

```
$  man man
NAME
       man - format and display the on-line manual pages

SYNOPSIS
       man  [-acdfFhkKtwW]  [--path]  [-m system] [-p string] [-C config_file]
       [-M pathlist] [-P pager] [-B browser] [-H htmlpager] [-S  section_list]
       [section] name ...


DESCRIPTION
       man formats and displays the on-line manual pages.  If you specify sec-
       tion, man only looks in that section of the manual.  name  is  normally
       the  name of the manual page, which is typically the name of a command,
       function, or file.  However, if name contains  a  slash  (/)  then  man
       interprets  it  as a file specification, so that you can do man ./foo.5
       or even man /cd/foo/bar.1.gz.

       See below for a description of where man  looks  for  the  manual  page
       files.
...

```

DESCRIPTIONに書いてある通り、manコマンドはコマンドのマニュアルだけでなく、関数やファイルについても見ることができ、セクションを指定するとそのセクション内で調べていきます。セクション毎の対応は以下のようになっています。

|セクション番号|表示する項目|
|---|---|
|1|Linuxコマンド|
|2|カーネル関数|
|3|システム関数|
|4|スペシャルファイル|
|5|フォーマット|
|6|プレインストールされたゲーム等|
|7|マクロ|
|8|システム管理コマンド|
|9|カーネルルーチン|

セクション番号はキーワードの前に指定します。
manにはオプションも豊富に存在するので是非manのマニュアルを見てみてください。

#🔎apropos
how to use
`$ apropos KEYWORD`
aproposは、キーワードを部分一致検索で索引データベースから検索し、短い説明を表示するコマンドです。
要は、
A「あれ〜あのコマンドなんだっけ・・検索するやつ・・・ap・・apr・・・・？そんな感じだよなぁ〜」
って時に使えます。
こちらも、通常はlessで表示されます。

```
$ apropos apr

apropos(1)               - search the whatis database for strings
ldap.conf(5), .ldaprc(5) - LDAP configuration file/environment variables
```
おー出てきましたね！A君が探してたコマンドは見つかったようですね

**ちょっとちょっと、そんな説明でいいんですか?!**
これじゃaproposの便利さは伝わりませんね。
そうですaproposはもっとすごいんです。
`apropos`というコマンドは、何をしますか？
検索、searchですね。そうです。
では`apropos search`を実行してみましょう。
`$ apropos search`
どうなりました？aproposの項目がありますね？
その他にfindやgrepなど・・
how to useを見てください。aproposの引数は何もコマンドじゃないんです。
目的の動作を入力しても、それを満たすコマンドを表示してくれるんです。
これが、aporposの凄さです
が、普段からCLIを使っている皆さんにとっては当たり前のことでしたね。(^○^)

#📘info(追記)
how to use
`$ info`
infoコマンドを入力するとinfoページが表示されます。こちらはmanと違いemacsライクな画面で表示されますが、psを見るとinfoと表示されています。(manやaproposはless)
ただしemacs互換なので操作方法は変わりません。
manとの違いといえば、infoコマンドはGNU由来なので、比較的新しくGNUプログラム版manのようなものです。
表示されるメニューから、アスタリスクが書いてある行が別ページへのリンクになっています。ただし用語としてはページではなくノードと呼びます。(実はinfoコマンドはそこまで使わないのでよくわからない)
`info COMMAND`とすることで、その関連ノードを直接開くこともできるらしいです！曖昧な説明で申し訳ないです！もし詳しい方、なにか間違いに気がついたらご報告お願いしますm(_ _)m

#おまけ
aproposの他のwhatisというコマンドもあります。基本aproposと変わりませんが、こちらは完全一致検索となっており、aproposほど強力ではないので除外しました。
合成数の和(advent calendar 2018,Prolog)

advent calendar 12/19を見ましたら埋まっていませんでしたし、
Prologの日もありませんでしたので至急コードを書きました。
Fが合成数ならリストに加えF+1を評価しリストの長さがNなら合計して終了です。

```Prolog
%swi-Prolog  version 7.4.2
%solve(100,R). %など
%:-initialization(solve(100,R)).  % ideone

syn(X):-floor(sqrt(X),Y),between(2,Y,N),X mod N =:=0,!.

solve(N,_,L,R):-length(L,N),sumlist(L,R),write(R).
solve(N,F,L,R):-(syn(F)->L1=[F|L];L1=L),F1 is F+1,solve(N,F1,L1,R).
solve(N,R):-solve(N,4,[],R),!.
```
（追加）
Prologは戻り値が他の言語のような形では帰りませんので習慣でsolve(N,R)と書きましたが、
write/1があればRはいりませんので、そちらも載せます。

```Prolog
%solve(100). %など
%:-initialization(solve(100)).

syn(X):-floor(sqrt(X),Y),between(2,Y,N),X mod N =:=0,!.

solve(N,_,L):-length(L,N),sumlist(L,R),write(R).
solve(N,F,L):-(syn(F)->L1=[F|L];L1=L),F1 is F+1,solve(N,F1,L1).
solve(N):-solve(N,4,[]),!.
```
railsアプリを一瞬でデプロイできるHeroku 私的tips

# 高知工科大学2018AdventCalendar
この記事は高知工科大学2018AdventCalendar２日目の記事です。
（12/20 now）

# Herokuとは
![image.png](https://qiita-image-store.s3.amazonaws.com/0/288717/93e3f635-7fba-ae1b-59fc-ce5e4ee19f9f.png)

Herokuって検索してでてくる、こんな感じのアイコンのwebサービスです。
無料で、10分程度でwebアプリケーションを世界中に公開することができます。
登録方法は他のサイトで解説されているので、そちらを参照するのがいいと思います。
https://tech-camp.in/note/technology/16108/

今回はrailsアプリをherokuにアップロードしようとして詰まった箇所をまとめていこうと思います。
デプロイはエラーがつきものなので、遭遇するたびに追加していきたいです。

# Tips

### herokuのrubyバージョンを下げる時に使うコマンド
```shell
$  heroku stack:set heroku-16
```
エラーが英語で出てくるのでわかりやすいと思います。

```
remote:  !     An error occurred while installing ruby-2.3.1
remote:  !     
remote:  !     This version of Ruby is not available on Heroku-18. The minimum supported version
remote:  !     of Ruby on the Heroku-18 stack can found at:
remote:  !     
remote:  !     https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
```

### rails_app/app/assets/imagesの画像エラー
画像のプリコンパイラができていないと発生します。

```config/environmernt/production.rb
  config.assets.compile = true
```

この部分がデフォルトではfalseになっているので気をつけてください。
deployの時に画像のあたりでエラーが起きると思ったら確認してみてください。

###　どうあがいてもherokuにpushできない
```shell
$ heroku create
$ git push heroku master
```
この二つのコマンドでherokuにdeployできるんですが、自分なりにエラーを探っているうちに、heroku createで作成したサイトを削除したり、ログインを変えてみたりすることがあると思います。そんなことをしていると、このアプリと接続しているherokuのリポジトリと、自分が接続したいherokuのリポジトリが食い違っていることがあります。そんなときはどうあがいてもherokuにpushできません。

```shell 
$ heroku open
```
このコマンドを使えば接続されているherokuのアプリが開けるんですけど、存在しない場合は開くことができませんし、自分が接続しているリポジトリのurlがわからなければ、herokuのアプリを管理しているときにそのurlを誤って削除してまうこともあります。(無料版のherokuは5つしかurlを同時にもてないため)
######そんな時は接続されているリポジトリを確認するコマンドと、接続するリポジトリを変更するコマンドを使いましょう。

```確認.shell
$ git remote -v
```
```変更.shell
$ git remote set-url heroku herokuのurl.git
```

ここら辺はgitのコマンドぽいのですが、勉強不足でgitとherokuについての理解が足りないので、また追記しようと思います。

## to be Continued...
誤字脱字や記事の間違いなどの指摘よろしくお願いします。

####編集履歴
2018/12/20　記事作成
2018/12/28　adventcalendarに参加していることを追記
Laravel Socialite でQiitaログインできるやつ作りました

# QiitaのOAuthがちょっとおかしい件

Laravel Socialite や [ここ](https://qiita.com/kamontia/items/5874119ab3928d2d9b6d)で言われているように[golang oauth2](https://github.com/golang/oauth2/) など
汎用的に使えるOAuthクライアントが動作しないことがある。
どうやらアクセストークンを発行するURLが Content-Type: application/jsonじゃないと受け付けないようです。

# LaravelでQiitaログインするのが結構手間

TwitterやGoogleログインはSocialiteで実装できるず、Qiitaだけ別で書くというのが
いまいち綺麗じゃない感じがしたので、Qiita特有の症状を考慮したライブラリを作りました

# 成果物
　
[LaravelSocialiteQiitaProvider](https://github.com/mikkame/LaravelSocialiteQiitaProvider)

です。使い方はREADME参照のこと
カニを飛ばすサイトを作りました

# 自己紹介
[1980YEN](https://1980yen.com/)というバンドの技術的なことをやってます。
普段は普通のサイト作ったりしてます。

![kani.gif](https://qiita-image-store.s3.amazonaws.com/0/48583/6bb306a4-8a75-67cb-8a22-9f0768d4ce82.gif)
# 静的サイトとリアルなバンド演奏をWebSocketを使って連動させる
食品まつり a.k.a foodmanという天才の人がカニって言ってるだけの曲を作ったので、ライブ中にカニって言うたびにサイト内にカニを飛ばしました。
以下に概念図を示します、よろしくご査収ください。
※画像は構想段階のもので一部本来の仕様と異なる部分があります
![Image from iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/48583/aee022cb-cd7e-7ec9-80a3-6a7bbe6faeac.jpeg)

1. 食品さんのAbleton Liveプロジェクト内にでカニと言ってるだけのトラックがあったので、m4lでアタックをとる
2. アタックのたびにEC2インスタンスにUDPを送りつける
3. S3に置かれた静的サイトとEC2インスタンスをWebSocketでつなげておく
4. m4lから送りつけられたタイミングでWebSocketでブラウザにイベントを投げつける
5. サイト閲覧者各人のブラウザでカニが飛ぶ

Max/MSP、Python、JavaScriptあたりで実装しました。
ちなみに実際にサイト内でカニを飛ばしたのは同僚のウマ先生なので、フロントについては僕はあまり何もしていません。
繰り返しになりますがウマがカニを飛ばしました。
ちなみにThree.js使ったと言ってました。

# 課題や学び
## WebSocketかServer-Sent Eventsか
今回はサーバから一方的にイベントを送る単方向通信なのでServer-Sent Events（以下SSE）で良かったのですが、httpプロトコルに則ってるから色々面倒くさいとかを読んでWebSocketを採用しました。
特に検証したわけではなかったので、SSEもそのうち試してみたいと思います。
ちなみにWebSocketは結構レイテンシ少なくてよかったです。

## EC2インスタンスをSSLにするあたりでコケた
フロントはCloudFrontでSSL化していたのですが、EC2の方もSSL化しないとWebSocketはれないことが分かったので、色々調べたのですが、結局出来なくてフロントのSSLを切るという荒業に出ました。
あまりEC2を公開するカタチで使ったことないので、その辺の知見がカスなので勉強したいです。

## インスタンスタイプについて
開発中はt2.micro、ライブ中はt2.mediumにしていたのですが、どれくらいの負荷があったのかは謎です。
今度ちゃんと計測するのが課題です。

# まとめ
WebSocketはもっと不真面目に使うと面白いもの沢山出来る予感がしました。
今回の仕組みもライブ演出の外側という点で出来ることある気がします。
年末年始おめでたい雰囲気の演出としてカニを飛ばしたいという方はご相談ください。
1980YENの[3rdアルバム「FAST FOOD」](http://fast-food.1980yen.com/)も宜しくおねがいします。
真の「うんこなう」判定機を作った~機械学習を使って本当にトイレ（しかも個室）にいるのか調べる~

みなさん、クリスマスイブを前日に控えた今日、いかがお過ごしでしょうか。

[クソアプリ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app)、23日目の担当、[nabettu](https://twitter.com/nabettu)です。お手柔らかにお願いします。

# 何を作ったか

Twitterで「〜なう」というつぶやき、たくさん見たことがあると思います。流行語大賞にもなりましたし。

その中でも「うんこなう」とつぶやく際に、**本当に「うんこなう」なのかどうか**を判定するWebサイトを作りました。

それがこちら。**"真の「うんこなう」判定機"** です。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
https://kusoapp2018.netlify.com/
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

トイレに行ってから、サイトにアクセスしてみてください。

PCでも一応動きますが、PCをトイレの個室に持ち込むのは怪しいので、誰かに目撃されてあらぬ疑いをかけられても私は何も保証しません。

![ogp.png](https://qiita-image-store.s3.amazonaws.com/0/40154/5c7dbaf9-47a6-7bfa-db8a-c24849424766.png)


# どんなサイトか

1. アクセスし「カメラをON」にすると、端末のカメラを許可するかどうか出ます。あらぬ疑いをかけられないように周りに注意しながらONにします。

2. すると、画面にカメラで写している映像が表示されます。

3. 次にカメラで**「トイレットペーパー」**を写してみてください。あなたが本当にトイレに居るならトイレットペーパー、ありますよね？もし個室に入っているのにトイレットペーパーが無い状況だったら、スマホなんかいじってないで紙を探してください。そんな状況では💩が出来ないので「うんこなう」とはつぶやけません。一大事です。qiita見てる場合じゃねぇ！
<img width="320" alt="Image from iOS (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/40154/697e8f7a-b36d-b633-234b-48f1fc288651.png">

4. 無事にトイレットペーパーをカメラに写すと、**「うんこなう」とつぶやけるツイートボタン**が表示されるはずです。栄光の「うんこなう」をつぶやきましょう。

<img width="320" alt="Image from iOS (2).png" src="https://qiita-image-store.s3.amazonaws.com/0/40154/e0b1556c-ce8e-c65a-3a1e-9a460f9b03e5.png">


# どうやって判別しているか

[tensorflow.js](https://js.tensorflow.org/)を利用して、カメラの映像に何が写っているかを判別しています。

TensorFlowはGoogleがオープンソースで開発している、機械学習ライブラリです。

今回は事前に機械学習を行なっておいた学習データを、tensorflow.jsを使う事でブラウザ上で利用して、カメラに何が写っているか判別しています。

学習データは[emoji-scavenger-hunt](https://emojiscavengerhunt.withgoogle.com/)という、googleがtensorflowのデモとして公開しているサイトの学習データをそのまま利用させてもらっています。


サイトのソースはこちら↓で、parcelでその辺りのデータを全部ドン！っとまとめています。

[https://github.com/nabettu/kusoapp2018](https://github.com/nabettu/kusoapp2018)

また、スマホブラウザでのカメラの利用はiOSだと11から出来るようになっていて、その辺りはuserMedia APIを利用しています。

# まとめ
AIを使えば本当に「うんこなう」なのかどうかもわかるぞ。すごい。AIに仕事が奪われる未来が見えてきましたね。うんうん。

明日のアドベントカレンダー担当は[K_M95](https://qiita.com/K_M95)さんです。よろしくお願いします。

これでワイもAIエンジニアやガッハッハ

こんなクソ記事を最後まで読んでいただきありがとうございます。また来年もクソアプリアドベントカレンダーでお会いしましょう。良いお年を。
初心者向け☆LPデザインのワンポイントアドバイス

こんにちは。
オークファンでWebデザインをしている池田です。
自分はちゃんと出来ているのか振り返りつつ、
LPのデザインをするときのワンポイントアドバイスを書いてみました。
![main_ttl.png](https://qiita-image-store.s3.amazonaws.com/0/192856/eac1ab86-0012-7a11-70e9-51279ce525f7.png)


デザインはアートと違い自分を表現するものではありません。
__LPには目的があります。__ 
まずは__目的を知る__ことからはじめましょう。
例えば、商品を紹介するLPであれば商品を知ってもらって終わりではなく、最終的にはその商品を購入してもらう事が目的になります。
目的を知ればどのようなデザインにすればいいのか見えてきますね！

![hd01.png](https://qiita-image-store.s3.amazonaws.com/0/192856/fdfcf2ad-f348-788a-2977-40fd7211859c.png)

###LPの最終目的は？
__LPをみた人にどうして欲しいのか？何を知って欲しいのか？__ 
まずはそこからです。
###ターゲットはどんな人？
男性か女性か？年齢は？　職業は？
ターゲットの詳細（ペルソナ）は細かくわかればわかるほどいいです。
５０代の会社員男性向けにメルヘンなものを作ってもコンバージョンが上がるとは思えませんからね。

###キーカラーは？
ターゲットの詳細情報を元に少し絞り込めますね。
この色はないなというものがあるはずです。
さらに絞り込んだカラーの中から、LPで伝えたい事を魅力的に見せるには何色を使えばいいのか考えながらカラーを決定していきます。
可能であれば、色パターンを出してABテストをしてみるのもいいかもしれません。

![hd02.png](https://qiita-image-store.s3.amazonaws.com/0/192856/2cb6a742-0c6c-ce59-57c0-9919c0e7fc07.png)
###イメージ画像はどうする？
LPの顔であるメインビジュアル。ここでLPの印象が決まります。
商品の紹介をするLPであれば、その商品をどのように入れるのか。
例えば、商品を背景込みの写真で入れるのか、切り抜くのか、イラストにするのか、
そして、それをどれくらいの大きさで入れるのかで全く商品のイメージが変わるので、
__どのように入れればその商品が魅力的に見えるの__かじっくり考えましょう。

###キャッチコピーについて
キャッチコピーは興味を持ってもらうための掴みの部分なので、入れ方はかなり重要です。もちろん、キャッチコピーの文言も相当大事ですが、デザイナーがやるべきことは、__どんなフォントでどのように入れるか__を考えることです。中でもフォント選びは慎重にしなければなりません。フォント選びに失敗すると、あっという間にイマイチなデザインになってしまいます。

![hd03.png](https://qiita-image-store.s3.amazonaws.com/0/192856/072c7808-ab1c-96f9-df92-36eef0e7e133.png)
###セクション
コンテンツの中身はいくつかのセクションに分かれているかと思います。
セクションごとに色分けなどして、セクションの区切りがわかるようにしましょう。
セクションの区切りをきちんと見せる事によってサイト全体にリズムができ、読みやすいLPになります。
###タイトル
セクションごとにデザインするのではなく、ある程度共通化してサイト全体に統一感を持たせましょう。
理由があって、あえて変えているなら問題ないのですが、そうでなければまとまりのないLPになってしまいます。
###画像
視覚的にテキストを補足するために、写真やイラストを入れる事があると思います。
その際、写真やイラストのテイストは同じものを選びましょう。

![hd04.png](https://qiita-image-store.s3.amazonaws.com/0/192856/796efa2a-cdaa-65e4-4157-97e30570429a.png)
上で書いたポイントを押さえたら、あとは__楽しみながらLPを作りましょう！__
楽しみながら作れば、デザインの魅せ方アイディアがどんどん浮かんでくるはず！
悩んだときには、LPデザインのまとめサイトなどをみてみましょう。
今のLPの流行りを知ることができたり、デザインのアイディアが貰えるはずです。
みんなで素敵LPを作りましょー！

![img_end.png](https://qiita-image-store.s3.amazonaws.com/0/192856/a8cad9fe-b8a4-1e60-52c2-d8c0b3f09e6e.png)


<p data-height="480" data-theme-id="0" data-slug-hash="PXPBJz" data-default-tab="css,result" data-user="aucfan-ikeda" data-pen-title="PXPBJz" class="codepen">See the Pen <a href="https://codepen.io/aucfan-ikeda/pen/PXPBJz/">PXPBJz</a> by aucfan-ikeda (<a href="https://codepen.io/aucfan-ikeda">@aucfan-ikeda</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
cssだけで描いてみたのですが、中々楽しかったですよ♪
それではみなさま、素敵なクリスマスをお過ごしください☆☆
SSH Key作成から鍵認証のために鍵をリモートサーバーにコピーするまで

いつも忘れて調べてるのでメモ。

まずは鍵作成。

```bash:terminal
ssh-keygen -t rsa -b 4096
```

リモートに鍵をコピー

```bash:terminal
# ~/.ssh/id_rsa.pubを渡す場合
ssh-copy-id "ユーザー名"@"リモートサーバーのアドレス"
```

参考：
[お前らのSSH Keysの作り方は間違っている](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
[ssh-copy-idで公開鍵を渡す](https://qiita.com/kentarosasaki/items/aa319e735a0b9660f1f0)
東京の地域Rubyコミュニティについての雑なまとめ

# 概要

東京の地域Rubyコミュニティについて雑にまとめてみました。
地名が名前についていないもの（例：よちよち.rb）や東京以外（Saitama.rbなど）は除外してあります。
内容が間違っているところもあるかもしれません。予めご了承ください。
なお、順番に意味はありません。

# 形式

* URL
* 主な会場
* 主な開催日
* コメント

# 本題

## Asakusa.rb

* https://asakusarb.esa.io/
* 株式会社永和システムマネジメント、株式会社Speee
* 毎週火曜日
* 雑談形式。Rubyコミッターが多数。

## Shinjuku.rb

* https://shinjukurb.connpass.com/
* Repro株式会社
* 第4水曜日
* Ruby以外のトピックも幅広く取り扱う。参加者と発表者との対話を重視しているのが特徴的。

## Shibuya.rb

* https://shibuyarb.doorkeeper.jp/
* Repro株式会社、PIXTA株式会社
* 第3水曜日
* 珍しい発表やLTを特に募集しないコミュニティ。面白い雑談に発展することも。

## Sendagaya.rb

* https://sendagayarb.doorkeeper.jp/
* 株式会社トクバイ
* 毎週月曜日
* リモート参加できるらしい。でも、参加したことないので詳しくはわかりません…

## Ebisu.rb

 * https://ebisurb.connpass.com/
 * 恵比寿付近の複数会場
 * 第4水曜日
 * LTの本数が多いのが特徴。内容もバラエティに富んでいる。

## Meguro.rb

* https://megurorb.connpass.com/
* 目黒付近の複数社で持ち回り開催しているようです。
* 第4木曜日
* 詳しくはよく知りません、というのは執筆日に初参加だからです。

## Omotesando.rb

* https://omotesandorb.connpass.com/
* 株式会社ビジネスバンクグループ、Sansan株式会社
* 第1木曜日
* LT中心の内容。ビジネスバンクグループ開催の際はたまにMatzその人が現れる。会場でそのまま懇親会をやるスタイル。

## Ginza.rb

* https://ginzarb.doorkeeper.jp/
* メドピア株式会社
* 第3火曜日
* LTはなく、予め設定されたトピックに基づいて議論していくスタイル。

## 西日暮里.rb

* https://nishinipporirb.doorkeeper.jp/
* 株式会社マネーフォワード、Study Sapuri Lab
* 不定期？
* もくもく会。場所・日時ともにあまり一定していない。

## Otemachi.rb

* https://enechange-meetup.connpass.com/
* ENECHANGE株式会社
* 水曜日メイン？
* 初学者向けらしい。メインの発表とLT、懇親会を組み合わせたスタイル。

## Tama.rb

* https://tamarb.connpass.com/
* 物理多摩と論理多摩（渋谷か恵比寿）
* 隔週水曜日と月末土曜日
* 輪読会。チェリー本とオブジェクト指向実践ガイドを読む。

# はしごのススメ

コミュニティはこれだけあるので、一つと言わず複数参加してみるといいと思います。
トピックの取り上げられ方も特色があるので、いくつか出てみると今のRubyを取り巻く空気をより身近に感じられるかもしれません。

# おまけ：まとめてみて気づいたこと

まず、金曜日開催のコミュニティは実は一つもないです。やっぱりみんな華金をエンジョイしたいのでしょうか？
会場は2箇所持ち回りかそれに準ずるパターンが多いです。また、山手線西部に集中しており、東部にはAsakusaとOtemachiがあるのみとなっております。
サイトはConnpassとDoorkeeperに分かれています。
主催者は複数人いる場合が多いです。一人で、主催者をやっている方、本当にお疲れ様です、すごいと思います。
Slackを持っていたりするコミュニティも増えました。次回のトピックや振り返りなどを共有・議論しているケースが多いのでしょうか。
EC2 EBS ディスクの容量アップ方法 (Amazon Linux)


AWS EC2 容量アップ方法。一旦上げた容量は下げれません。
Amazon Linux 内のコマンドをコピペ実行するためのメモ帳です。

[Concrete CMS](https://concrete5-japan.org) でサイトの運営保守していると、日々ディスク容量が多くなるんですよね・・・。

## STEP 1: AWS Console へ行き、EBS の容量を上げる

CLI を使ってもOK

コンソールからの変更方法はこちらから。



1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。
2. EC2インスタンスのストレージタブ、もしくはナビゲーションペインの「ボリューム」を選択します。
3. 変更するボリュームを選択し、「Actions (アクション)」、「Modify volume (ボリュームの変更)」の順に選択します。
4. Modify Volume (ボリュームの変更) 画面に、ボリューム ID とボリュームの現在の設定 (タイプ、サイズ、IOPS、スループットなど) が表示されます。
    - サイズを変更するには、「Size」 に新しい値を入力します。
5. ボリューム設定を変更したら、「変更」 を選択します。確認を求めるメッセージが表示されたら、「Modify (変更)」 を選択します。

※公式ドキュメント:[Elastic Volumes を使用して EBS ボリュームを変更する](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/requesting-ebs-volume-modifications.html) より

**これで終わりではありません。**

次に EC2 側の OS レベルで設定を変更します。


## STEP 2: SSH で実行するコマンド

sudo or root 権限のある SSH でログイン。
以下のコマンドを実行していきます。


```
# 最初に今のディスク容量を確認
df -h

# パーティション情報一覧を取得して
# パーティション名を取得 (xvda1 とか nvme0n1 の数字がついているはず)
lsblk

# パーティションサイズ拡張: ディスク名のパーティション番号の間に半角スペースをつけて実行。
## さきほどの lsblk コマンドの実行結果によってどちらか1つのコマンドを実行

## Amazon Linux はこっちが多い
sudo growpart /dev/xvda 1
## Amazon Linux 2 はこっちが多い
sudo growpart /dev/nvme0n1 1

# パーティション内のリサイズ
## Linux ext4 だったら resize コマンドで拡張
sudo resize2fs /dev/xvda1
## Amazon Linux 2 は XFS なので
### パーティション名に応じて以下のコマンドどちらか1つを実行
sudo xfs_growfs /dev/xvda1
sudo xfs_growfs /dev/nvme0n1p1

# 最後にディスク容量が増えているか確認
df -h
```

この記事は、僕の個人ブログからの転載です
https://ja.katzueno.com/2022/07/3949/
Outsystemsの「Associate Web Developer」認定試験を受けた感想

# 想定読者
このエントリーはOutsystemsの初心者で、「Associate Web Developer」認定試験を受けようと思ってる人が対象になります。

※既に「Associate Web Developer」認定試験に合格した人、またはoutsystemsの中上級者には向いていませんのでご了承ください。
# 自己紹介
金融系システムの開発と保守業務に約二年間半を経験しました。現在ランスタッド IT本部に所属し、主にOutSystemsでの開発業務に携わっております。しかし、まだOutSystemsの開発経験が浅く、初心者としてOutSystemsと仲良くになりますように頑張っています。
#はじめに
この記事はRandstad Advent Calendar 2018 の23日目の記事です。今年12月にBluememe社が主催した「OutSystems Webアプリ開発ブートキャンプ」に参加させていただきました。合否結果の通知がまだ届いてませんが、認定試験と受験感想についてシェアさせていただき、受験予定がある方に少しでも参考になれば幸いです。
# Outsystemsとは？
Outsystemsは下記のように、モバイルやWebアプリケーションの開発を高速化できるローコードなエンタープライズ・ラピッド・アプリケーション開発プラットフォームです。他のプログラミングに比べて、メリットとしては全部自分でコーディングする必要がなく、視覚的開発で従来より高速開発を実現できます。しかし、その一方、各コンポーネントの機能を使いこなさないと簡単に開発出来ないと思います。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/314302/df44674b-23e3-36c1-63ce-875d4d459943.png)


# Outsystemsの認定試験の種類
開発者向け認定試験は、次の三つのレベルがあります。今回は「Associate Web Developer」認定試験を受けた感想をシェアさせていただきたいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314302/8ca8e45d-fcc9-5049-01a1-78cbd7070b90.png)



# 「Associate Web Developer」認定試験について

###認定試験の詳細###
Outsystemsのホームページから認定試験の詳細について下記のような説明がありました。
「プロフェッショナルデベロッパーの指示のもとで、自律的に開発を行い、シンプルなウェブアプリケーションを開発できます。他の開発環境や開発言語と経験を活かすことができます。」

※認定試験について、下記のリンクにご参考ください。
https://www.outsystems.com/learn/certifications

###認定試験の前提条件###
「Associate Web Developer」認定試験を申請するにはOutsystemsに関する開発経験が要求されませんが、開発者向けオンラインコースの受講、またはBluememeという会社が主催したDeveloper Bootcampでの演習を受講済みではないといけません。今回はブートキャンプに参加後にすぐ受験することにしました。

   ※ブートキャンプの予定と申請は下記のリンクにご参考ください。
 http://www.bluememe.jp/outsystems/outsystems_support/bootcamp-schedule.html


# 認定試験を受験した感想
  自分のOutsystemsの経験は認定試験を受験したまでに約四ヶ月でしたが、実際の開発経験は約一ヶ月でした。今回はブートキャンプに参加して試験に臨みました。二時間で49問があり、時間的には余裕がありましたが、合否問わず（結果はまだ）、初心者にとって難しかったと思います。

試験を振り返って、自分の準備不足としては各コンポーネントの概念と役割について大まかに理解していますが、類似する機能の相違と実際操作で出来ないことについて曖昧なところが多いと反省しました。例えば、screen actionとserver actionの違いについて下記のようにみんな認識していると思います。
         _Screen action = ユーザの操作に応じて起動するAction(runs on the server)_
         _Server action = 他のScreen/Server Actionから呼び出せるAction(runs on the server)_


しかし、もしscreen actionとserver actionが追加できるParameterについて質問されると、開発経験が浅い人には、screen actionはOutput Parameterを追加できないことに気づかない人が多いと思います。

**screen action**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314302/e5351601-8112-37a4-eb3c-5e55d0028b4e.png)
**server action**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314302/99fe74fe-26f6-4cdf-757a-94774f11545d.png)

このほか、下記のように各機能について出題されると正しいかどうかを曖昧なく判断できることも重要だと思います。

- Web Blockは「Preparation」を追加できない？
- Table Recordsでデータ表示させるにはexpressionしか使えない？
- Table Recordsでデータ表示させるにはEntityをドラゴンドロップでしかできない？
- UI flowでstart/end point と default start/end pointの違い？

上記はあくまでにサンプルの例ですが、Outsystemsの初心者にとって、実際の間違いが起こる前に、各コンポーネントができることとできないことをあまり意識しなく操作する人が多いと思います。

#終わりに
「Associate Web Developer」認定試験は上位の指示の元、正しく開発できるかをテストしています。認定試験を受ける前に、オンラインコースやブートキャンプの資料内容を覚えることが勿論大事ですが、実際開発中で各プロパティの意味を理解と、コンポーネントを使いこなすことを前提で試験に臨むことが大事だと思います。
正規表現メモ

# 設定内容
自分用メモ。
※随時更新中

デバッグには以下のサイトなどの正規表現解析ツールがオススメ。
[Debuggex: Online visual regex tester\. JavaScript, Python, and PCRE\.](https://www.debuggex.com/)

## 対象の行
テキストエディタでの置換に。

### スペース・タブだけの行
`\t`の後は半角スペース、全角スペース。

```javascript
 ^[\t 　]+([\r\n])
```

### 何も無い空行

```javascript
^[\r\n]+
```

### 何も無い空行またはスペース・タブのみの行
`\t`の後は半角スペース、全角スペース。

```javascript

^[\t 　]*[\r\n]+
```

### スペース・タブの後に任意の単語から始まる行
`\t`の後は半角スペース、全角スペース。
デバッグを仕込んだ行の削除などに。

```javascript
^[\t 　]*console\.log\(.*\r\n
```

## HTMLタグ
HTMLタグ全般の除去などに。

```javascript
<(".*?"|'.*?'|[^'"])*?>
```

## 日付形式
`yyyy/mm/dd`形式の文字列が1900/01/01～2999/12/31までの歴上日になっているかのチェック。
IM-FormaDesignerのカスタムチェックなどに。
上述の[正規表現解析ツール](https://www.debuggex.com/)などにかけるとなかなか面白いよ。

```javascript
^(?!([02468][1235679]|[13579][01345789])00\/02\/29)(((19[0-9]{2}|2[0-9]{3})\/(01|03|05|07|08|10|12)\/(0[1-9]|[12][0-9]|3[01]))|((19[0-9]{2}|2[0-9]{3})\/(04|06|09|11)\/(0[1-9]|[12][0-9]|30))|((19[0-9]{2}|2[0-9]{3})\/02\/(0[1-9]|1[0-9]|2[0-8]))|((19|2[0-9])([02468][048]|[13579][26])\/02\/29))$
```

## URLのドメイン部分まで
`http://hogehoge.com:8080/fugafuga/index.html`などのURLから、`http://hogehoge.com:8080`のようにドメイン部分までを抜き出します。
最後の`(?=\/)`は「肯定的先読み」で、`(?=[pattern])`とすると`[pattern]`の直前までが対象になります。これによって、`/`までを検索するけど`/`自身は対象に含めないようにしています。
また、正規表現はデフォルトで最長一致のため、何もしないと`http://hogehoge.com:8080/fugafuga`までが対象になってしまいます。そこで、`(?=\/)`の前に最短一致の`?`を付けることで`http/https`以降で最初の`/`までを対象にしています。

```javascript
https?:\/\/[\w/:%#\$&\?\(\)~\.=\+\-]+?(?=\/)
```

## 全銀使用可能文字チェック
全銀データレコードの使用可能文字チェックです。
以下の半角文字のみの場合にマッチします。

- 数字 `0-9`
- 英大文字 `A-Z`
- カタカナ `ｱ-ﾝ`
- 括弧 `()`
- ピリオド `.`
- ハイフン `-`
- スラッシュ `/`
- スペース ` `

使用可能文字のチェック以外に、否定先読みを使って

- 最初がスペースで始まるパターン`^(?! )`
- 最後がスペースで終わるパターン`(?!.* $)`

を除外しています。
また、半角カナのパターンを

- カナ1文字(`ｦ`を除く) `[ｱ-ﾝ]`
- 濁点付文字 `([ｳｶ-ﾄﾊ-ﾎ]ﾞ)`
- 半濁点付文字 `([ﾊ-ﾎ]ﾟ)`

に分けて定義することで、`ｱﾟ`のようなありえない濁点/半濁点付文字を除外しています。

```javascript
^(?! )(?!.* $)([ｱ-ﾝA-Z0-9\(\)\.\-\/ ]|([ｳｶ-ﾄﾊ-ﾎ]ﾞ)|([ﾊ-ﾎ]ﾟ))+$
```

# 参考にさせていただいたページ
- [サクラエディタ掲示板 - [2615] RE: 空白だけの行の削除](http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?ol=200212&tree=c2615)
- [正規表現 \- 文字列内から HTML タグを正確に判別！ \- mk\-mode BLOG](https://www.mk-mode.com/blog/2013/02/13/regexp-html-tag/#)
- [yyyymmdd形式日付文字列の妥当性をチェックする正規表現を読み解く](https://qiita.com/shojit/items/c633a329dbbcc56923d6)
- [python 正規表現でURLの一致チェック、抽出を行う \| trelab](http://trelab.info/python/python-%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A7url%E3%81%AE%E4%B8%80%E8%87%B4%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%80%81%E6%8A%BD%E5%87%BA%E3%82%92%E8%A1%8C%E3%81%86/)
- [正規表現の先読み・後読みを極める！ \- あらびき日記](https://abicky.net/2010/05/30/135112/)
- [正規表現で文字列を含まない、否定の記述 \| UX MILK](https://uxmilk.jp/50674)
- [正規表現入門　～ではない行。～を含まない行。否定の正規表現 \| 株式会社AMG Solution](https://amg-solution.jp/blog/5238)
Ubuntu 18.04 LTSにGLUTをインストール

# はじめに
少し時代遅れ感はしますが、最近のUbuntuにGLUT(OpenGL Utility Toolkit)をインストールする必要がある場合のためにメモしておきます。

## 環境
- Ubuntu Budgie 18.04.1 LTS 64-bit
- VMWare Workstation 15 Player for Windows 上で実行

以下の記事で環境構築時の手順を公開しています。
[Ubuntu Budgie 18.04をVMWareにインストール＆直後の設定](https://www.bit-plus.work/note/linux/ubuntu-budgie-18-04-1-vmware/)

# インストール
まず、いつものようにaptの更新を行います。

```
$ sudo apt update
$ sudo apt upgrade
```

次に、Freeglut3とその開発パッケージに加えて、オープンソースのOpenGL実装であるMesa 3Dの開発パッケージをインストールします。

```
$ sudo apt-get install libglu1-mesa-dev mesa-common-dev freeglut3-dev
```

"freeglut3"や"libgl1-mesa-dev"も必要ですが、これらは依存関係で一緒にインストールされるので問題ありません。

# コーディング
コーディングする際には、以下のようにGL/glut.hをincludeします。

サンプルとして示す以下のソースコードは、白背景に赤い四角を描画します。

```c++:test.cpp
#include <GL/glut.h>
 
void show(void);

int main(int argc, char** argv)
{
  glutInit(&argc, argv);

  glutInitDisplayMode(GLUT_SINGLE);
  glutInitWindowSize(400, 300);
  glutInitWindowPosition(200, 200);

  glutCreateWindow("GLUT test");
  glutInitDisplayMode(GLUT_RGBA);
  glClearColor(1.0, 1.0, 1.0, 1.0);
    
  glutDisplayFunc(show);
  glutMainLoop();

  return 0;
}

void show(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3d(1.0, 0.0, 0.0);
  glBegin(GL_LINE_LOOP);

  glVertex2d(-0.5,-0.5);
  glVertex2d(-0.5, 0.5);
  glVertex2d( 0.5, 0.5);
  glVertex2d( 0.5,-0.5);

  glEnd();
  glFlush();
}
```

# コンパイル
コンパイルする際には、以下のようにオプションを指定します。

```
$ g++ -Wall -Weffc++ -o glut_test test.cpp -lglut -lGLU -lGL
```

このようにして、最近のUbuntu上でGLUTを使用することができます。
Quick start Speech to text on Microsoft Azure with PHP

## Why
There is no sample code with PHP on [official document](https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/)


## Environment
PHP 7.1.8
Zend Engine v3.1.0

## Code

```php
<?php
$language = 'en-US'
$url = 'https://westus.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language='.$language;
$curl = curl_init();

$header = [
    'Ocp-Apim-Subscription-Key: {your key}',
    'Content-Type: audio/wav; codec=audio/pcm; samplerate=16000',
    'Accept: application/json'
];

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, file_get_contents('test_audio.wav'));

$response = curl_exec($curl);
curl_close($curl);

/* for debug
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$info = curl_getinfo($curl);
var_dump($info);
*/

var_dump($response);                         
```
raspberry pi 1でtensrorflow lite その21


#概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
ラズパイで、リアルタイム処理してみた。
sdrをやってみる。
AMラジオ受信機やってみる。
回路の製作。

#回路図

部品は、IC、2個のみです。
LTC1799は、発信機モジュール。
74HC4066は、アナログスイッチです。

![](http://jsrun.it/assets/G/S/F/m/GSFmD)

#写真

![CIMG2823.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/e68273e2-5175-53c3-6831-ba432c77c5ea.jpeg)

パイオニア製チュナーに、取り付ける。

![CIMG2822.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/120049b5-5c7e-75b5-6b44-4ded0923d9cd.jpeg)

以上。