OmniAICreator/Qiita-1.07M huggingface dataset:
pythonのWordCloudに、形態素解析を使わずに、手動で空白区切りの日本語テキストを入力する話


データに紐づいてる日本語メタデータを形態素解析せずにそのまま使用して、
データ集合の特徴を可視化しようとした話。
また、その時に、単語がうまく認識されなかったと言う話の備忘録。

WordCloudクラスに入力したテキストデータは、
以下のように日本語のメタデータのリストを空白でくっつけたもの。

``` python:データ例
data = " ".join(["りんご", "みかん", "ぶどう"])
```

wordcloudは[こちら](https://github.com/amueller/word_cloud)のライブラリを使用して、
以下のように作成した。

``` python:通常のwordcloud作成例
from matplotlib.pyplot import plt
from wordcloud import WordCloud

wc = WordCloud().generate(data)
plt.imshow(wc)
plt.axis("off")
```

このように日本語テキストを食わせると、
条件は分からないけど、一部の単語間の空白で区切られず、「りんご みかん」のようなまとまりで認識されて、wordcloudが作成されてしまうことがある。
詳細は調査していないので分からないが、ライブラリの該当部分を軽く見る限りでは文字コード周りの問題で、特定の文字の後に空白が入った場合に意図しない挙動をしているのだと思われる。


解決策としては、
collectionsモジュールのCounterとかを使って自分で単語の頻度情報を作成し、
WordCloudクラスのgenerate_from_frequenciesを使用すればよい。

``` python:wordcloud作成例(修正版)
from collections import Counter
from matplotlib.pyplot import plt
from wordcloud import WordCloud

words = Counter(data)
wc = WordCloud().generate_from_frequencies(words)
plt.imshow(wc)
plt.axis("off")
```
parcelで超絶簡単にhttpsの動作テストしてみる

# 概要

以前のバージョンでparcelでhttps使えなくてなんだかなぁ・・・と思ってたんですが
今日、ちょっとやってみたら、めちゃくちゃ簡単で感動しました。

なので、ちょっと記事にしておきます。

# というわけで簡単なhttpsで動作するテストを書いてみる。

OSX High sierra
node v9.4.0
使いました。

```
$ mkdir httpsTest
$ cd httpsTest
$ npm init
$ npm install --save parcel-bundler
```

index.htmlを適当に作る

```index.html
<html>
  <head></head>
  <body>test</body>
</html>
```

package.jsonのscript:testを書き換える

```package.json
{
  "name": "httpstest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "parcel --https index.html"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "parcel-bundler": "^1.4.1"
  }
}
```

あとは実行するだけ

```
$ npm test

> httpstest@1.0.0 test /Users/taktod/Documents/node/httpsTest
> parcel --https index.html

Generating SSL Certificate...
Server running at https://localhost:1234 
```

<img width="485" alt="スクリーンショット 2018-01-19 15.12.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/6246/1f15980b-3352-1374-2577-ccaf8326c43b.png">

できました。

なにこれ、証明書自動生成とかすごく助かるんですけど。
WebVR A-frame で実現するぐるっと回り込むカメラ

A-Frameという超簡単にWebGLが組めるフレームワークを今更ながら知ったのですが、カメラの挙動が欲しいのと違ったため、ちょっといじってみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">A-Frameでぐるっと回るカメラワーク <a href="https://t.co/55muzgAuND">pic.twitter.com/55muzgAuND</a></p>&mdash; ShoyoFILMS (@shoyofilms) <a href="https://twitter.com/shoyofilms/status/954231815828467713?ref_src=twsrc%5Etfw">2018年1月19日</a></blockquote>


# A-Frameとは

WebGLを扱うThree.jsをベースに開発されたフレームワークで、ざっくり言うとブラウザ上にVR空間を作ることができます。

公式
https://aframe.io/
とてもわかりやすい記事
https://qiita.com/haruan2394/items/a2d54101377b96ba08f2

# ぐるっとまわりこむカメラやりたい！
上記の記事のサンプルなどではカメラはWASDで移動できるわけですが、自分が欲しかったのは空間の中心にあるオブジェクトの方を見ながらその周りをまわるようなカメラワークでした。ようするにアニメの「サマーウォーズ」のOZとか「攻殻機動隊」の電脳空間みたいなのがやりたかったわけですね。

見つけられてないだけかもしれませんが、サンプルがなかったので自分で作ってみました。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>A-Frame</title>
    <meta name="description" content="A-Frame Panorama Sample">
    <script src="https://aframe.io/releases/0.7.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene vr-mode-ui="enabled: false">
		<a-box color="tomato" position="0 0 0" position="0 0 0" depth="2" height="2" width="2" id="moon"></a-box>
		<a-box color="tomato" position="0 1 1" position="0 0 0" depth="1" height="1" width="1" id="moon"></a-box>

	    <a-camera position="0 0 10" rotation="0 0 0" camera="userHeight: 0" id="camera">
		    <a-ring color="teal" position="0 0 -1" radius-inner="0.05" radius-outer="0.07"></a-ring>
	    </a-camera>
    <a-sky src="t.png" rotation="0 170 0"></a-sky>
    </a-scene>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
    <script>
		let camera_length=10;
		let camera_theata=0;

    	//IE11用
		(function () {
		  if ( typeof window.CustomEvent === "function" ) return false;
		  function CustomEvent ( event, params ) {
		    params = params || { bubbles: false, cancelable: false, detail: undefined };
		    var evt = document.createEvent( 'CustomEvent' );
		    evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
		    return evt;
		   }
		  CustomEvent.prototype = window.Event.prototype;
		  window.CustomEvent = CustomEvent;
		})();

    	//ぐるっとまわりこませる
		$(window).keydown(function(e){
		  if(e.keyCode==88){//x
		  	camera_theata++;
			$("#camera").attr("position",camera_length*Math.sin(camera_theata*Math.PI/180)+" 0 "+camera_length*Math.cos(camera_theata*Math.PI/180));
			$("#camera").attr("rotation","0 "+camera_theata+" 0");
		  }
		});
	</script>
  </body>
</html>
```

t.pngはこちらの1200x600画像を使いました。ご自由にお使いください。
![t.png](https://qiita-image-store.s3.amazonaws.com/0/82103/02a00721-0255-cf47-9af8-002d9b15d6d8.png)

こちらでxキーを押すと原点に設置されたキューブの周りをまわるようになります。原理はいたって単純で、三角関数で原点周りを移動しながらカメラの向きを変えて原点を常に見ている状態にしています。ここら辺はLookAtつかったほうがいいかもしれません。なお原点からの距離はcamera_lengthで調整してください。
[iOS] 画像をフェードアニメーションで切り替えていく

```swift
class SampleViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    var images: [UIImage] = [
        UIImage(named: "sample_img1"),
        UIImage(named: "sample_img2"),
        UIImage(named: "sample_img3")
    ]
    let index = 0
    let animationDuration: TimeInterval = 1
    let switchingInterval: TimeInterval = 3

    override func viewDidLoad() {
        super.viewDidLoad()
        imageView.image = images[index]
        animateImageView()
    }

    // 画像をフェードで切り替えるアニメーション
    func animateImageView() {
        CATransaction.begin()
        CATransaction.setAnimationDuration(animationDuration)
        CATransaction.setCompletionBlock {
            DispatchQueue.main.asyncAfter(deadline: .now() + self.switchingInterval) {
                self.animateImageView()
            }
        }
        
        let transition = CATransition()
        transition.type = kCATransitionFade
        
        brandImageImageView.layer.add(transition, forKey: kCATransition)
        brandImageImageView.image = brandImages[nextBrandImagesIndex]
        
        CATransaction.commit()
        
        nextBrandImagesIndex = nextBrandImagesIndex < brandImages.count - 1 ? nextBrandImagesIndex + 1 : 0
    }
}
```

参考: [stackoverflow「Adding Image Transition Animation in Swift」](https://stackoverflow.com/questions/26898955/adding-image-transition-animation-in-swift)
SMILES記法の化合物のMACCS keysを求める

##覚えておくためのメモ

以下はMochimasa氏のQiitaエントリ[化合物をベクトルにして比較しプロットする](https://qiita.com/Mochimasa/items/f1b60246ece7da46f6a9)を参考にしました
`np.zeros()`の使い方は[0を要素とする配列を生成するnumpy.zerosの使い方](https://deepage.net/features/numpy-zeros.html)を参考にしました

モジュールはRDkitとNumpyを使う


```python
#モジュールの読み込み
from rdkit import Chem
from rdkit.Chem import MACCSkeys
from rdkit import DataStructs
import numpy as np
```

化合物をSMILES形式で読み込む（ChEMBLで取得）
MACCS Keysの計算

```python
mol = Chem.MolFromSmiles('CS(=O)(=O)NCCC1CCN(CC1)c2ncnc3cc(sc23)C(=O)N')
fps = MACCSkeys.GenMACCSKeys(mol)
```

fpsにMACCS keyが入っているはずなので`print`してみよう

```python
print(fps)
```

    <rdkit.DataStructs.cDataStructs.ExplicitBitVect object at 0x10aef65d0>


BitVector?なのでそのままでは数値や文字としては表示できない<br>
Tanimoto係数などSimilalityはBitVectorのまま比較すればよい


```python
fp_bits = tuple(fps.GetOnBits())
print(fp_bits)
```

    (32, 33, 36, 38, 51, 55, 58, 60, 61, 62, 65, 67, 69, 73, 75, 77, 80, 81, 82, 83, 84, 85, 86, 88, 91, 92, 93, 94, 96, 98, 100, 101, 102, 104, 105, 106, 108, 110, 111, 112, 116, 117, 118, 120, 121, 122, 124, 125, 128, 129, 130, 131, 133, 135, 136, 137, 138, 142, 145, 146, 147, 148, 151, 153, 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165)


MACCS Keysのどのbitが<b>On</b>,つまり"1"になっているかを示す<br>
これをnumpyで1 or 0のベクトルとして表すと


```python
fp_arr = np.zeros((1,))
DataStructs.ConvertToNumpyArray(fps,fp_arr)
print(np.array(fp_arr))
```

    [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
      0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  1.  0.  0.
      1.  0.  1.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  1.  0.  0.
      0.  1.  0.  0.  1.  0.  1.  1.  1.  0.  0.  1.  0.  1.  0.  1.  0.  0.
      0.  1.  0.  1.  0.  1.  0.  0.  1.  1.  1.  1.  1.  1.  1.  0.  1.  0.
      0.  1.  1.  1.  1.  0.  1.  0.  1.  0.  1.  1.  1.  0.  1.  1.  1.  0.
      1.  0.  1.  1.  1.  0.  0.  0.  1.  1.  1.  0.  1.  1.  1.  0.  1.  1.
      0.  0.  1.  1.  1.  1.  0.  1.  0.  1.  1.  1.  1.  0.  0.  0.  1.  0.
      0.  1.  1.  1.  1.  0.  0.  1.  0.  1.  1.  1.  1.  0.  1.  1.  1.  1.
      1.  1.  1.  1.  0.]


`np.zeros((3,4))`　で3x4の行列, つまり`np.zeros((1,))`　では1行だけの,0が並んだベクトル<br>
これをひとつひとつの化合物に適用して積み重ねた行列を作れば、PCAができる...!
【Unity：エディタ拡張】EditorWindowからスクリプトを開く

# 概要
EditorWindow作成して
スクリプト編集しようって時にいちいちスクリプトファイル探して開くの面倒なので対応した

<font color=red>※変更：パス直書きだとイケてないので取得するように対応してみた</font>

# サンプル

```cpp:スクリプト
using System.Runtime.CompilerServices;
using UnityEditor;
using UnityEngine;

public class EditorSample : EditorWindow, IHasCustomMenu
{
	public void AddItemsToMenu(GenericMenu menu)
	{
		// メニュー追加
		menu.AddItem(new GUIContent("Open Script"), false, () =>
		{
			//UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath("Assets/Scripts/Editor/Sample.cs", typeof(UnityEngine.Object));
			string filePath = GetSourceFilePath();
			filePath = filePath.Replace(Application.dataPath.Substring(0, Application.dataPath.LastIndexOf("/") + 1), "");
			UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(filePath, typeof(UnityEngine.Object));
			if (obj != null)
			{
				Selection.activeObject = obj;
				// 第２引数は行数
				AssetDatabase.OpenAsset(obj, 0);
			}
		});
	}

	private string GetSourceFilePath([CallerFilePath] string sourceFilePath = "")
	{
		return sourceFilePath.Replace("\\", "/");
	}
}
```

![additem.png](https://qiita-image-store.s3.amazonaws.com/0/216261/410f3135-e957-48f7-4142-09431eca6be0.png)
ウィンドウ右上のボタンかタブ右クリックで開くメニューに追加される
Raspberry PiでUSB Web CAMの動画を配信する ～mjpg-streamer編～

# Raspberry PiでUSB Web CAMの動画を配信する ～mjpg-streamer編～

今回はServerとして[mjpg-streamer](https://github.com/jacksonliam/mjpg-streamer)を用いる。mjpg-streamerには[original](https://sourceforge.net/projects/mjpg-streamer/)と[fork](https://github.com/jacksonliam/mjpg-streamer)があるが、最終更新日が新しいfork版の方を用いる。

## 使用機材
- Raspberry Pi 2 Bodel B
- Logicool HD Web CAM C270
- 8GBのmicro SD Card

## OS
- RASPBIAN STRETCH LITE (2017-11-29)

## 手順

既にRaspbianをSD CardにInstallしてあるものとする。
[インストール方法については公式を参考](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)

Raspberry Piを起動し、ログインしておく。(今回の作業では標準ユーザー Pi で作業している。)

### Compileに必要なものをInstallしておく

```Shell
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git cmake libjpeg8-dev
```

### mjpg-streamerをInstallする

```Shell
cd ~
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/
cd mjpg-streamer-experimental
make
sudo make install
```

### Web公開用のディレクトリを用意する

```Shell
sudo cp -r www /var/www
```

### mjpg_streamerを起動する

```Shell
sudo mjpg_streamer -i 'input_uvc.so -d /dev/video0 -r 640x480 -n -y' -o 'output_http.so -w /var/www -p 8080'
```

## 配信を見るには
MotionJPEGの再生に対応したWeb browser(ChromeやEdge)で http://[RPiのIPaddress]:8080/ を開けば再生される。

## 雑記
- こちらは自動起動化に成功したので別記事にて
    - [Raspberry PiでUSB Web CAMの動画を配信する ～mjpg-streamer自動化編～](https://qiita.com/cactanaka/items/2a82a1b98b9dbeba31da)
- 視聴ノードが1つの場合では配信遅延が少なくかなりスムーズに再生できているので実用に耐えるレベル
- /var/wwwにコピーしたstream_simple.htmlに配信ページのサンプルがあるのでこれを改造すれば色々作れると思われる
jbuilderのjsonにSTIのtypeカラムを含める

# はじめに
railsからreactにjsonを渡す時にそのままではSTIのtypeが渡せずにfrontでSTIの判定ができなかった。
例として、blockモデルがnormal_blockやplain_blockなどのSTIを持っているとします。

```ruby
json.lp_blocks @lp_blocks.all do |lp_block|
  json.lp_block lp_block # これだとrailsの使用上typeはjsonに含まれない。
  ...
end
```
#解決策
[こちら](https://qiita.com/daei/items/a68970f18de8bf78f891)の記事のコメントを参考にしました。

```ruby
json.lp_blocks @lp_blocks.all do |lp_block|
  json.lp_block lp_block.as_json(methods: :type)
  ...
end
```
ReactVRで簡単にVRツアーを作るならLiveTourLabを使おう


## ReactVR
[ReactVR](https://facebook.github.io/react-vr/)はReact.jsのようにコンポーネントを組み合わせて作れるVRコンテンツが作れるフレームワークです。
WebVRとReactNativeを使っていて、Webの基本技術を使いながらVRコンテンツを簡単に作成できます。

## しんどい
ReactVRでは `<Text />` や`<VRButton />`といったVR用コンポーネントが予め容易されていますが、標準のものは簡素なものでスタイルはCSSで当てて作っていきます。

これがかなりしんどくて、Unityでは3D空間があってそこにオブジェクトをグラフィカルに置けますがスタイルもなくただのオブジェクトを雰囲気で置いていくしかないため本格的なコンテンツを作るときは難しいです。

## LiveTourLab
その問題点を解決するのが、[LiveTourLab](https://livetourlab.com/)です。
これは部屋の紹介などのツアー型のVRコンテンツが簡単に作れるライブラリで、Reactコンポーネントとして提供されています。

```javascript=
import React from 'react';
import { LiveTour } from 'live-tour-lab';

export default class sample extends React.Component {
  render() {
    return (
      <LiveTour tourURI='sample.json' />
    );
  }
};
```
ReactVRの`index.vr.js`内で`LiveTour`コンポーネントを呼び出してあげて後述する書式のjsonをpropsとして入れるだけでVRコンテンツが表示されます。

### jsonでコンテンツを記述する
```json
{
    "name":"sample",
    "defaults":{
	"infos":{
		"icon":"icon.png"
	    }
	},
	"firstSceneId":"room1",
	"scenes":[
	    {
		"id":"Room1",
		    "photopanos":[
		    {"src":"room.jpg","rotateY": 75}
		],
		"navs":[
			{"to":"Television","txt":"Move", "rotateY": 75}
		],
		"preloads":[
			{"src":"room2.jpg"},
			{"src":"room3.jpg"}
		]
	}
    ]
}

```
このようにjsonを記述してコンテンツを配置します。
`photopanos`にはThetaなどの360度カメラで撮影した画像を指定するとVR空間へ360度表示されます。
`navs`はボタンになっていて、次のシーンへのリンクになっています。
見つめることでクリックできるのが特徴です。
`preloads`で次のシーンに使う画像を予めロードしておけるので、シーンが移動したときにロードで止まって没入感が損なわれることを防げます。

その他にも色々なオブジェクトが用意されているので詳しくは
[LiveTourLabのドキュメント](https://livetourlab.com/docs)を確認してみてください
(未解決) pySerial 3.* + CentOS 6.8 > Python 2.6は対応しない (ValueError: zero length field name in format) | Python 2.7は対応してそう > Python 2.7と3.6ではConnection timed out

```txt:動作環境
CentOS 6.8 (64bit)
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
```

### 概要

USB<->RS-232C変換ケーブルを使用して、シリアル出力のツールを作ろうとしていた。

pipとpySerial関連をCentOS6.8用にセットアップした。

- Linux対応の変換ケーブル
    - Prolific USB
- デバイスは[/dev/ttyUSB0と/dev/ttyUSB1](https://qiita.com/7of9/items/c35da5a818b4d0110c0e)として認識
- [ループバック用コード](https://qiita.com/7of9/items/6f1802ae067246ce4a09)
- 自作のループバック用アダプタ
    - DSUB9ピン同士でTXとRXをクロス接続

上記のループバック用コード(名前を`loop_test_180119.py`とした)実行時に下記のエラーとなる。

```bash
$ sudo python loop_test_180119.py
Hello
Traceback (most recent call last):
  File "loop_test_180119.py", line 16, in <module>
    main()
  File "loop_test_180119.py", line 6, in main
    con1=serial.Serial('/dev/ttyUSB0', 9600, timeout=10)
  File "/usr/lib/python2.6/site-packages/serial/serialutil.py", line 240, in __init__
    self.open()
  File "/usr/lib/python2.6/site-packages/serial/serialposix.py", line 272, in open
    self._reconfigure_port(force_update=True)
  File "/usr/lib/python2.6/site-packages/serial/serialposix.py", line 345, in _reconfigure_port
    ispeed = ospeed = getattr(termios, 'B{}'.format(self._baudrate))
ValueError: zero length field name in format
```

### エラーの理由

https://github.com/pyserial/pyserial/issues/185

> pyserial doesn't support Python 2.6 according to its [classifiers](https://github.com/pyserial/pyserial/blob/dc56ac9002a5830442bff1e3c9ff9a34f3bc3e4e/setup.py#L85-L86) and [documentation](https://github.com/pyserial/pyserial/blame/dc56ac9002a5830442bff1e3c9ff9a34f3bc3e4e/documentation/pyserial.rst#L45-L50).

Python 2.6は対応しない。
Python 2.7は対応していそう。

### Software CollectionsによるPython 2.7 > 未解決

[Cent OS 6で手軽にPython 2.7を使う方法](https://qiita.com/informationsea/items/2a91ca07157a94b8594b)
に記載の方法でPython 2.7.13を使用できるようにしてみました。

実行時にpySerialが見つからないとなり、pip install pyserialではPython2.6用にインストール済となりました。

### Python3.6で対応

Python2.7に上げるよりもPython3.6を別途インストールして実行できるようにしました。

[CentOS6.9にPython3を導入](http://enjoits.work/linux/centos/centos6-9%E3%81%ABpython3%E3%82%92%E5%B0%8E%E5%85%A5) @ EnjoITs
の記事にてコマンドを3.6用に適宜変更してセットアップしました。

### Python 2.7と3.6ではConnection timed out

Python 3.6ではConnection timed outエラーが出る。

症状としては以下と同じようだ。

https://stackoverflow.com/questions/41123477/can-access-serial-port-with-python-2-6-but-not-with-2-7-or-3-5-using-same-code
Outsourcing Development Companies : A reliable partner for your growth

![Outsourcing-IT-Projects.jpg](https://qiita-image-store.s3.amazonaws.com/0/178336/76fea403-7a27-4215-5c5d-cee074e69729.jpeg)

Are you losing your precious clients because your staff is not aware of the latest trends or technologies?

What if I tell you that you can deliver any IT solution to your clients without spending time and money on your staff? Yes, with an effective partnership with outsourcing development company you can achieve business growth in a short span. 

More Information :- https://excellentwebworld.com/it-projects-outsourcing/
Unreal Engine 4メモ：UFUNCTION()はオーバーロード出来ない

```c++:sample1.cpp
UCLASS()
class AT_API ClassName
{
public:
	UFUNCTION(BlueprintCallable)
	void Function(int a, int b);

	UFUNCTION(BlueprintCallable)
	void Function(int a, int b, int c);
}
```

```:エラー
error : 'Function' conflicts with 'Function /Script/Project Name.ClassName:Function'
```

エンジンソースを見てみると下記のようになっています。

```c++:/UE4/UnrealEngine/Engine/Source/Programs/UnrealHeaderTool/Private/HeaderParser.cpp

1858: FError::Throwf(TEXT("'%s' conflicts with '%s'"), *ThisName.ToString(), *It->GetFullName() );
```
> HeaderParserは非関数リストに新しい関数を追加する前に、既知の関数名をすべて列挙(iterate)する。
> パラメータが何であっても、同じ名前のものがあればこのエラーがスローされます。
> したがって、同じクラスに同じ名前の2つのUFUNCTIONSを持つことはできません。

UFUNCTION()はオーバーロード出来ないため、回避する必要があります。
他のスクリプト言語でもオーバーロード関数をバインドできなかったりするのでBPの仕様がそうなっているのでしょう。

```c++:sample2.cpp
UCLASS()
class AT_API ClassName
{
public:
	UFUNCTION(BlueprintCallable)
	void Function(int a, int b);

	UFUNCTION(BlueprintCallable)
	void FunctionWithC(int a, int b, int c); // 関数名を変える
}
```

参照：https://answers.unrealengine.com/questions/45623/function-declaration-with-the-same-name-with-diffe.html
digdag の scheduler って何？

※ 1/20 表を更新しました。
　@hiroysato さん、ご指摘、共有ありがとうございます。

-----

digdag run で直接実行する方法や、digdag push でスケジュール登録する以外に、dig を実行する方法があるのか！？
というわけで調べてみたら、とても良い表が見つかったので共有します。
※ 今後は[オリジナル](https://docs.google.com/spreadsheets/d/1vRasKHyInrhRIlmY0WoxD8kaAUgiZO1dPsGGCSSS3aM/edit#gid=0)のほうが先に更新されていくと思うので、最終的な確認はそちらを参照してください。

|項目|local mode|local mode with scheduler|server mode|
|:-:|:-:|:-:|:-:|
|ワークフロー格納先|ファイル|データベース|データベース|
|サーバ・スケジューラ起動コマンド|なし|digdag schduler|digdag server (REST API)|
|ワークフロー登録方法|登録不要|自動読み込み|push 登録|
|スケジューリング|不可|可能|可能|
|実行ホストの分離|不可|不可？|可能|
|格納先データベース|なし|H2,PostgreSQL *1|H2,PostgreSQL|
|実行結果格納先|.digdag ディレクトリ|データベース,S3等?|データベース,S3等|
|ログ出力先をプラグインで指定 *2|不可|可能？|可能|
|負荷に応じてサーバを増やせるか|不可|不可|可能|
|TD の実績|よく使う|あまり使われていない|よく使う|
|用途|開発、スケジュール不要なワークフロー|小規模な環境、定期実行|大規模環境|
|Web UI|なし|できる？（一応動く）|あり|
|一時ディレクトリ|同じ場所|同じ場所|セッション毎に作成|
|シークレット管理|ローカルファイル (~/.config/digdag内)|サーバ上？（うまく動かない？）|サーバ上|

*1 バグあり
*2 プラグインは開発中

引用：[Digdagモード比較](https://docs.google.com/spreadsheets/d/1vRasKHyInrhRIlmY0WoxD8kaAUgiZO1dPsGGCSSS3aM/edit#gid=0)
gitで2つのコミットが別のブランチのものかどうか判定する方法

# 背景
gitリポジトリ上で、リポジトリの最初のコミット(root-commit)からあるコミット(commit-A)までの間で、別のコミット(commit-B)があるかないかを調べたい。

# 概要
`git merge-base` を使う。
本来の使い方はマージをするためにコミット間、ブランチ間の共通の祖先(ancestor)を探すコマンド。

# 探しかた
`git merge-base <commit-A> <commit-B>` で共通の祖先(ancestor)を検索する
ancestorが `<commit-B>` と一致すれば、 `<commit-B>` は `<root-commit>` から `<commit-A>` までの中に含まれている。

## イメージ図
* ancestorが `<commit-B>` に一致する場合

```
    <commit-B>
        |
o---o---o---o---o---o---X
|                   |
|               <commit-A>
L<root-commit>
```

## その他の場合のイメージ図

* ancestorがどちらのコミットにも一致しない場合(1のコミットが表示される場合)

```
              <commit-B>
                  |
          o---o---o---Y
         /
o---o---1---o---o---o---X
|                   |
|               <commit-A>
L<root-commit>
```

* ancestorが `<commit-A>` に一致する場合

```
                       <commit-B>
                            |
o---o---o---o---o---o---o---o---o---X
|                   |
|               <commit-A>
L<root-commit>
```

# 最後に
もっと複雑なブランチ構造もあるので、全部が全部これで説明できるかは不明。
buildToolsVersion 省略時の挙動

新規プロジェクト作成時に `buildToolsVersion` の記載がありませんでした。
（必須だと思ってました）
なので、 `buildToolsVersion` を記述しない時のデフォルトの動作について調べてみました。

# 結果
* Gradle Plugin のデフォルトのバージョンが使用される
* 書かなくても良いが、書いた方が新しいバージョンを使うことができる

# デフォルトのバージョンはいくつ？
## 調査方法１：print する
 
```
task printBuildToolsVersion {
    println android.buildToolsVersion
}
```

* ↑を `app/build.gradle` に追加して `./gradlew printBuildToolsVersion` を実行する
* 実行結果（Gradle Plugin Version : 3.0.1）

```
> Configure project :app
26.0.2
```

## 調査方法２：実装を見る
* `app/build.gradle` の `compileSdkVersion` を command キーを押下しながらクリックして、 `BaseExtension.class` を開く

![スクリーンショット 2018-01-19 13.01.09（2）.png](https://qiita-image-store.s3.amazonaws.com/0/9695/b87c044a-151b-3dd1-e853-b5252bcef544.png)

* `private Revision buildToolsRevision;` 変数に初期値を代入している箇所を探すと、 `AndroidBuilder.DEFAULT_BUILD_TOOLS_REVISION` を代入していることがわかります。
<img width="645" alt="スクリーンショット 2018-01-19 12.52.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/9695/871caa20-f5c8-082b-3548-5b3e9dfcd801.png">　


* `DEFAULT_BUILD_TOOLS_REVISION` の定義にジャンプ
<img width="829" alt="スクリーンショット 2018-01-19 12.52.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/9695/468664ab-8e61-257c-d6ed-54ff97ea8b12.png">

デフォルトで `26.0.2` が設定されていることがわかります。

## Q&A
### Q : 書いた方が良いの？
* A : デフォルトで良いのなら、書かなくても良い
 
### Q : 書くメリットは？
* A : 最新の BuildTools の存在を知ることができ、最新の BuildTools を使うことができる
* （書かないと、新しいバージョンの存在にさえ気づけない…）

### Q : 更新し忘れそう
* A  : 新しいバージョンがあると IDE 警告が出ます<img width="563" alt="スクリーンショット 2018-01-19 13.17.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/9695/a675b1a4-12a4-7f8d-b786-f4e2bc97d9b3.png">
* A : Gradle Plugin でサポートされているバージョンよりも古い値を書いていても IDE 警告が出ます
<img width="557" alt="スクリーンショット 2018-01-19 13.20.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/9695/4ec75b31-0ea4-310a-8c1c-14066ff3dd0c.png">
* A : ビルド時にも警告が出ます

```
WARNING: The specified Android SDK Build Tools version (26.0.0) is ignored, as it is below the minimum supported version (26.0.2) for Android Gradle Plugin 3.0.1.
Android SDK Build Tools 26.0.2 will be used.
To suppress this warning, remove "buildToolsVersion '26.0.0'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
```

# まとめ
* Gradle Plugin のデフォルトのバージョンが使用される
* 書かなくても良いが、書いた方が新しいバージョンを使うことができる
【UnityEditor】クラス名からTypeを取得する

# はじめに
クラス名のstringからSystem.Typeを取得するクラスの作り方をよく忘れてしまうので、備忘録として記事にしてみました。

# 使用例
以下のようにして使用します。

```csharp:使用例
System.Type classType = TypeGetter.GetType("Hoge");
```

# ソースコード
TypeGetterの実装は以下の通り。
コードが若干汚いですが、ご容赦ください

```TypeGetter.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;

/// <summary>
/// タイプの取得を行う
/// </summary>
public static class TypeGetter
{
    static private Dictionary<string, List<Type>> typeDict;
    static MonoScript[] monoScripts;

    /// <summary>
    /// プロジェクト内に存在する全スクリプトファイル
    /// </summary>
    static MonoScript[] MonoScripts { get { return monoScripts ?? (monoScripts = Resources.FindObjectsOfTypeAll<MonoScript>().ToArray()); } }

    /// <summary>
    /// クラス名からタイプを取得する
    /// </summary>
    public static Type GetType(string className)
    {
        if (typeDict == null)
        {
            // Dictionary作成
            typeDict = new Dictionary<string, List<Type>>();
            foreach (var type in GetAllTypes())
            {
                if (!typeDict.ContainsKey(type.Name))
                {
                    typeDict.Add(type.Name, new List<Type>());
                }
                typeDict[type.Name].Add(type);
            }
        }
                
        if (typeDict.ContainsKey(className)) // クラスが存在
        {
            return typeDict[className][0];
        }
        else
        {
            // クラスが存在しない場合
            return null;
        }
    }

    /// <summary>
    /// 全てのクラスタイプを取得
    /// </summary>
    private static IEnumerable<Type> GetAllTypes()
    {
        // Unity標準のクラスタイプ
        var buitinTypes = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(asm => asm.GetTypes())
        .Where(type => type != null && !string.IsNullOrEmpty(type.Namespace))
        .Where(type => type.Namespace.Contains("UnityEngine"));

        // 自作のクラスタイプ
        var myTypes = MonoScripts
        .Where(script => script != null)
        .Select(script => script.GetClass())
        .Where(classType => classType != null)
        .Where(classType => classType.Module.Name == "Assembly-CSharp.dll");

        return buitinTypes.Concat(myTypes)
        .Distinct();
    }
}
```

# 使ってみる
### 手順1. 以下の2つのクラスを追加します

```Hoge.cs
namespace Fuga
{
    public class Hoge
    {
    }
}
```

```TestTypeGetter.cs
using UnityEngine;
using UnityEditor;

public class TestTypeGetter
{
    [MenuItem("Test/Type Get Hoge")]
    static void Test()
    {
        System.Type classType = TypeGetter.GetType("Hoge");
        Debug.Log(classType);
    }
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/ee26bc37-f379-aea2-b96a-c4e6f4d94a19.png)


### 手順2. メニューを選んで実行します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/1994e213-2fa0-1382-b6ff-ac594c2968ce.png)


### 手順3. 結果
System.Typeの取得ができていることが確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/8fb218d8-d7fd-b6c3-84de-c2463eadf7ac.png)
Office365　アプリケーション

PowerAPP

PowerApps の概要
https://docs.microsoft.com/ja-jp/powerapps/guided-learning/get-started#step-0

チームに適したプランを選ぶ
https://powerapps.microsoft.com/ja-jp/pricing/

欲しいアプリは自分で作る！Microsoft PowerAppsとは？
http://memo.tyoshida.me/powerapps/what-is-powerapps/

アプリ作成例
http://special.nikkeibp.co.jp/atclh/ITP/16/microsoft1228/

OracleDBとの接続
https://docs.microsoft.com/ja-jp/powerapps/connections/connection-oracledb
Rubyでジャバandノットジャバを真にする

# 何しようか

[Can (a ==1 && a== 2 && a==3) ever evaluate to true?](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)
[JavaScriptで「(a ==1 && a== 2 && a==3)」の結果を真にする手法が議論される | スラド デベロッパー](https://developers.srad.jp/story/18/01/18/0648254/)
というのがちょっとした話題らしい。

ならば、ジャバorノットジャバも真にできるのでは！と思って作ってみまし
た。

なぜか手近にあったrubyです。


# あなたとジャバ、今すぐ実<br />　　　　　装

```ruby:jaba.rb
module Jaba
end

module NotJaba
end

class JabaClass
  include Jaba
  include NotJaba
  def ジャバ?
    true
  end
  def ノットジャバ?
    true
  end
  def ==(jaba)
    true
  end
end

and_you = JabaClass.new
ジャバ = Jaba
ノットジャバ = NotJaba

# check ジャバ and ノットジャバ
p and_you.is_a?(ジャバ) && and_you.is_a?(ノットジャバ)
p and_you.ジャバ? && and_you.ノットジャバ?
p and_you == 'ジャバ' && and_you == 'ノットジャバ'
```

無料jaba.rbのス

```console
$ ruby jaba.rb 
true
true
true
```
Rubyのhashに関する処理あれこれ

よく忘れるので。

- keyとvalueを`string`から`integer`にしたい

```ruby
hash = { '1' => '2', '3' => '4' }
Hash[*(hash.to_a.flatten.map(&:to_i))]
```

- `ActiveRecord_Relation`を`{ id: somthing, id: something }`みたいにしたい。

```ruby
users = User.limit(10)
Hash[*users.map { |u| [u.id, u.point] }.flatten]
```

- hash間の差分を出したい

```ruby
hash_a = { 1 => 2, 3 => 5, 4 => 6 }
hash_b = { 1 => 2, 3 => 4 }
diff = (hash_a.to_a - hash_b.to_a).to_h
```
MemoryEnhancer | EPS8266 > UI > Link: ESP8266 DIY Smartwatch: Minetest controller with MPU-9250

プロジェクト開始記事: [MemoryEnhancer > UDPの受信処理を行い、"***"と"+++"を交互にbanner表示する | banner:指定の文字すべてを表示してくれない | banner:改行付きの表示](https://qiita.com/7of9/items/4077c92b9a773e054193)

### Link

英語復習ツールMemoryEnhancerを検討中。

[電子工作 > 磁石検知装置 > 555 Timer + 74HC04 + 振動モーター | ウェアラブル](https://qiita.com/7of9/items/4c2690973459bbd8a69c)
に記載のグローブを使った操作を検討している。

加速度の取得について[MPU-9250](https://qiita.com/7of9/items/59c052f1044ff7ad50ba)を使う予定ではある。

以下のYouTube動画を見つけた。
[ESP8266 DIY Smartwatch: Minetest controller with MPU-9250](https://www.youtube.com/watch?v=W3ALEUs_7kA)

https://github.com/Jeija/esp8266-smartwatch
に画像とともに詳細がある。

- OLED付き
- バッテリ: 250mAh
    - CR2032の容量に似ている
    - 二次電池かも
- 加速度の取得精度は高さそう
- 指のクリックをUIの一つとして認識 (YouTube動画)
- GitHubから関連動画(３つ)へのリンクもある
ファイル変更監視してコマンド実行するやつ

元ネタ
[ファイルの変更を定期的に監視して、特定のコマンドを実行するシェルスクリプト](https://qiita.com/tamanobi/items/74b62e25506af394eae5)

Eclipse で war 監視してたら書き込み中も判定されてしまったので少し直した。

```
#!/bin/sh
# see also http://mizti.hatenablog.com/entry/2013/01/27/204343
usage() {
  echo "実行するには2個の引数が必要です。
  第一引数: 監視対象ファイル名
  第二引数: 監視対象ファイルが更新された際に実行されるコマンド
  例： ./autoexec.sh a.cpp 'g++ a.cpp && ./a.cpp'"
}
update() {
  echo `openssl sha256 -r $1 | awk '{print $1}'`
}
if [ $# -ne 2 ];
then
  usage
  exit 1
fi

INTERVAL=1 #監視間隔, 秒で指定
last=`update $1`
echo "Watching... file: $1"
while true;
do
  sleep $INTERVAL
  current=`update $1`
  lsof=`lsof -f -- $1`
  if [ "$last" != "$current" ]; then
    nowdate=`date '+%Y/%m/%d'`
    nowtime=`date '+%H:%M:%S'`
    echo "$nowdate $nowtime : detected update of file: $1"
    if [ -n "$lsof" ]; then
      echo "=> Skipping, $1 is opened by other process..."
    else
      echo "=> Executing Command : $2"
      eval $2
      echo "\nWatching... file: $1"
    fi
    last=$current
  fi
done
```
応用情報技術者試験　合格体験記

#はじめに
2017年秋季試験で合格しました。
2年連続で一か月間新人研修の担当をしており、
その際に、応用情報の話もするのですが、
もっていないのに、あんまり話したくないなーと思っていました。

ですが、これでやっと自身をもって説明できます！笑

もし、今年度も新人研修の担当になった時のためと
誰かのためになればと思い、色々書いてみます。
ちなみに受かるまでに３回落ちています！！！

#応用情報処理技術者試験とは
さらっと説明すると、基本情報の一個上のやつですね。
午前のレベル感はそんなに変わらないです。
午後が記述になるため、その分難易度が高くなります。

#勉強方法
事前知識によって変わります。
まず、テキストは一冊あったほうが良いです。
本屋で自分に合うものを調べて、中古で買うとかで大丈夫です。
古い本でもほとんど変わりはないです。

何も分からない状態から応用に挑戦する場合は、一通りテキストを読みましょう。
たぶんかなりきついと思います。眠くなります。でも受かるためには一番近道です。

基本情報、または同様な知識がある場合は
テキストは辞書代わりに使うと良いです。
私はわからない時に、辞書として使っていました。

##午前編
とにかく過去問をやります。出来るだけ多くやります。
私の場合は、次の三つの教材を使用しました。
1. アプリ　[応用情報技術者 午前 一問一答問題集](https://itunes.apple.com/jp/app/%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%89%8D-%E4%B8%80%E5%95%8F%E4%B8%80%E7%AD%94%E5%95%8F%E9%A1%8C%E9%9B%86/id398338957?mt=8) 
2. Web　[応用情報ドットコム](http://www.ap-siken.com/)
3. 本　[応用情報技術者 パーフェクトラーニング過去問題集](http://gihyo.jp/book/2016/978-4-7741-8215-5)

試験が近づくと、土日は本で、通勤時間にアプリで、アプリが解き終わったらWebで
といった感じでした。
有料ですがアプリだと間違えたところが記録に残るため、おすすめです。
ただし問題数が物足りないです。

解答を読んでもわからないところは、テキストを見て理解します。
それでもわからない時は、メモっておいて前日に暗記してしまいましょう。

実は、午前は2、3日かけて本気で暗記すれば、6割とれるレベルです。
それほど過去問から類似問題が多く出題されます。
ですが、ここで暗記だけにすると、午後で苦戦することになることと
資格だけの勉強になってしまうので
できるだけ、理解して解けるようにしておいたほうが良いです。

また、午前を余裕で解けておいたほうが、
午前の結果をきにしないで、午後に全力で挑戦できます。
これは大きなメリットです！

##午後編
午前の勉強をちゃんとやっていれば、よく考えたら解ける問題です。
ただし、初見では難しいです。
私は午後の問題を解かないで受けたら、44点で撃沈しました。
その後も、午後は過去問を解かずに受け続けまして、4回目で受かりました！
一回受けるごとに5点ほど上がっていってたので、
最初から過去問解いておけば良かったなと思います。

なので、最低でも過去問は3回分はやりましょう。笑

解き終わったら、解答をしっかり読んで
問題の傾向や、解答の仕方などに慣れておく必要があります。
3回分ほど解けば、自分の得意、不得意な分野がみえてきます。

不安な方は、午後対策のテキストを購入しても良いと思います。

#勉強時間
基本情報レベルの知識がある場合で、
時間を十分に取れる方は、１か月でも十分に間に合うと思います。
仕事で勉強時間が取れない方、または基本情報もお手上げの方は
３か月ぐらいの余裕をもったスケジュールを立てると良いでしょう。

私の場合は4回分含めて2か月ほど勉強しました。

#午後を突破するために伝えたいこと
午前は過去問を解くほど、正解率は上がってきます。
しかし午後は、**ただ解くだけ**では、正解率はあがりません。
10回以上も午後で落ちた人もいるようです。

大切なことは、過去問を解いた後、解答を時間をかけて読むことです。
すると、解答の仕方がだんだんと分かってきます。
私の場合は試験後にじっくり答え合わせをしました。

私が午後の解き方で、個人的に気になった点をいくつかピックアップします。

##「4文字以下で記載しなさい」は、2文字でも良い
最初は4文字以内のときは4文字を探して、無駄に時間を浪費していました。
ここで考え込んでしまい、時間内に全て解ききれないなんてことにも繋がります。
4文字に限らず、単語レベルの文字数の時は、
半分以下でも正解の解答だったりします。

##ふわっとした解答が意外と正解だったりする
記述なので、明確な解答を決まった文字内で書こうとしてきましたが、
答えをみると意外とふわっとしています。
これでいいの？？って毎回思っていましたが、
公式の解答が全てなので、問題を解いて慣れるしかないです。

##時間配分はかなり大事
午後の問題は問1が必須で残りの4問は選択問題です。
選択問題については、過去問を解いて、予め解く問題を6問ほどに絞っておきます。

試験開始後、絞った問題をさらっと読みます。
問１を解いたら、簡単そうなのから順次解いていき、
難しかったら、飛ばして別の問題を解きます。

ここで大事なのが最大でも一問解くのに何分までにするか、
あらかじめ決めておくことです。
その時間を超えたら、解けてなくてもきりがいいところで次の問題へいく。
意外なところでドツボにはまって、時間がかかってしまうことがあったので
詰まったら別の問題を先に解いたほうが良いです。
全て解ける必要はありません。6割とれれば合格なので！

#まとめ
問題を見て自分じゃあ受からないと思った方
そんなことはありません。

何度か過去問を解いていくうちに必ず解けるようになります。
試験を受けたら意外といい結果だったりします！

まずはチェレンジしてみてください！
atomでソフトラップをキーバインド

設定するのに良い記事がなかったのでメモ

1. file>setting>keybindings>your keymap file
2. 下記の内容を最後の行にコピペ
3. 
`'.editor':'alt-ctrl-s': 'editor:toggle-soft-wrap'`

*ショートカットコマンドはお好みで。

![2018-01-19_12h14_47.png](https://qiita-image-store.s3.amazonaws.com/0/63060/3a91acdf-99d5-63e4-32a8-1d26660776cb.png)
【php】文字列に含まれるスラッシュを削除する


`str_replace` を使う。
スラッシュを正規表現にする必要はない。

## 例

`2018/01/19` => `20180119` にする場合

```php
$date = "2018/01/19";
$date = str_replace('/', '', $date);

echo $date; // 20180119
```
[バッドノウハウ]webプログラミング初学者がCloud9にPython3×djangoを使う

バッドノウハウというタイトルをつけましたが内容自体は使えなくもないと思います。
筆者にとって不要な手順を省略して後日記事を書き直す予定です。

#この記事を書こうと思ったきっかけ
ローカルに環境を用意しなくても開発が始められるという統合開発環境(IDE)Cloud9を始めてみようと思いましたが、ネットで調べてもAWS版のcloud9がリリースされる前の情報が多く、いろいろと戸惑ったこともありましたので記事を書くことにしました。

#これまでのあらすじ
Cloud9でpython3を標準で使えるまでできました。
[webプログラミング初学者がAWS Cloud9でPython3を使う](https://qiita.com/h008/items/f3e3faeab9271ed0a1df)
[webプログラミング初学者がAWS Cloud9を使い始める](https://qiita.com/h008/items/b3ed1b27820bc117dcd9)

#pipでdjangoをインストールする→エラー

```bash:
ec2-user:~/environment $ sudo pip install django
Collecting django
  Downloading Django-2.0.tar.gz (8.0MB)
    100% |████████████████████████████████| 8.0MB 140kB/s 
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-IzDxWp/django/setup.py", line 32, in <module>
        version = __import__('django').get_version()
      File "django/__init__.py", line 1, in <module>
        from django.utils.version import get_version
      File "django/utils/version.py", line 61, in <module>
        @functools.lru_cache()
    AttributeError: 'module' object has no attribute 'lru_cache'
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-IzDxWp/django/

```
前回python -m pip -v　の結果がこうだったのでいけるかなと思ったのですが。

```bash:
ec2-user:~/environment $ python -m pip -V
pip 9.0.1 from /usr/lib/python3.6/dist-packages (python 3.6)
```
#pip3を探す
pip3のありかを確認


```bash:
ec2-user:~/environment $ ls -l /usr/bin |grep pip
-rwxr-xr-x   1 root root       2804 Sep 10  2014 lesspipe.sh
lrwxrwxrwx   1 root root         21 Jan  4 02:19 pip -> /etc/alternatives/pip
-rwxr-xr-x   1 root root        370 Aug 25 18:59 pip-2.7
-rwxr-xr-x   1 root root        370 Aug 25 18:59 pip-3.6
```

#pip3.6にリンクを張る
alternativesとかよくわからないのでとりあえず

```bash:
ec2-user:~/environment $ sudo ln -s /usr/bin/pip-3.6 /usr/bin/pip3
```


#preferenceにPYTHONPATHの項目を発見

よく見るとpreferenceのPYTHONPATHに3.6が入っていないようなので先頭に追加

PYTHONPATH
/usr/local/lib/python3.6/dist-packages:/usr/local/lib/python2.7/dist-packages:/usr/local/lib/python3.4/dist-packages:/usr/local/lib/python3.5/dist-packages

#pip3でdjangoインストール
pip3でdjangoをインストール

```bash:
ec2-user:~/environment $ sudo pip3 install django                                                            
Collecting django
  Downloading Django-2.0.1-py3-none-any.whl (7.1MB)
    100% |████████████████████████████████| 7.1MB 200kB/s 
Collecting pytz (from django)
  Downloading pytz-2017.3-py2.py3-none-any.whl (511kB)
    100% |████████████████████████████████| 512kB 2.5MB/s 
Installing collected packages: pytz, django
Successfully installed django-2.0.1 pytz-2017.3
```
インストールできた！

#ここまできて
"pip3"でやるんだったら、"python3"でいいじゃん。
[前回の記事](https://qiita.com/h008/items/f3e3faeab9271ed0a1df)、べつにいらなくね？

なのでもう一回下記の手順でやり直して記事を書き直します。

- cloud9でenvironment作成
- cloud9の設定でPythonバージョン、PYTHONPATH設定
- pip3のリンク作成
- djangoインストール
nodejs-typescript-template (WIP forever)

自身の勉強と後輩エンジニアの生産性改善を願って、nodejsのテンプレートを共有します:rocket:
先輩エンジニアからのissueも大いに歓迎しています:heart:

https://github.com/takaki-ishibashi2/node-typescript-template

NOTE: このテンプレートは、常に更新していくものなので、永遠に完成することはありません:warning:
Mitel Speed numberの対応電話番号　ITサポート

# **はじめに**
現在、オーストラリアにてITサポートインターンを経験中
新たな知識を記事にまとめたいと思います。
今回はビジネス向けIP電話サービス**Mitel**を使ったIP電話の仕組みについて

# **必要なもの**
・電話機
・パソコン(Mitel操作用)
・ケーブル
・電話サーバー

# **IP電話作成手順**
1.**電話とケーブルを繋げる**
ケーブルは電源の役割も持っており、PoE（Power over Ethernet）と呼ばれるケーブル上で電力供給する技術を使って電話を充電をします。PoEはIP電話、Webカメラでよく使われるそうです。

2.**ケーブルと電話サーバーを繋げる**
インターン先の電話サーバーはMitel3300という機種を使ってIP電話サービスの管理を行います。

# **Mitelでの操作**
ブラウザーはIEが推奨らしいです。９０年代からの代物なので昔のブラウザに合わせたほうがいいよって言われました。

Mitelでできること
・電話所持者の情報管理
・電話機能の追加
が主な機能です。


# **インターンでの例**
社内のITリクエストで特定のSpeed numberが間違った番号にかかってしまうとのことで直して欲しいとのことでした。

Speed numberとは社外にかける電話番号を少ない桁数でかけられる番号のことを指します。
例えば123 456 789という番号にかける際に000をダイヤルすればかけられるということです。
今回の例は000をダイヤルしたら123 456 788にかかってしまうため番号を直してほしいとのこと。

|                  |      Speed Number |    Dial            |
|:-----------------|:------------------:|:------------------:|
|正|      000       | 123 456 789|
|誤|      000       | 123 456 788|


**手順**
1.パソコンを使ってMitelの電話システムにログインしたらSystem→Phone Related→System Speed Dialまで移動します。

2.Speed callの番号と対応する電話番号が羅列してあるので検索機能を使って000を探し出して123 456 788から123 456 789に変えます。

3.手元にあるIP電話で000を押して123 456 789にかかれば成功です。

# **おわりに**
IP電話での仕組みが少しでも知れてよかったです。ITサポート部にいるとpc関係の知識が増えるのでパソコン興味あってそこそこ知ってるけどがっつり勉強したいって人はインターンおすすめです。
attiny85 fuse セッティング

#概要
attiny85 fuse セッティングを記す。
low fuseのみ。

#1Mhzの場合

```
CKDIV8=0	check		
CKOUT=0		none		
SUT1=0		none		
SUT0=0		check		
CKSEL3=0	check		
CKSEL2=0	check		
CKSEL1=0	none		
CKSEL0=0	check		
```

#8Mhzの場合

```
CKDIV8=0	none		
CKOUT=0		none		
SUT1=0		none		
SUT0=0		check		
CKSEL3=0	check		
CKSEL2=0	check		
CKSEL1=0	none		
CKSEL0=0	check		
```

#16Mhzの場合

```
CKDIV8=0	none
CKOUT=0		none
SUT1=0		none
SUT0=0		check
CKSEL3=0	check
CKSEL2=0	check
CKSEL1=0	check
CKSEL0=0	none
```

以上。
Laravel Homestead + Visual Studio Code + Xdebugでデバッグ環境構築

Windows 10での環境構築手順となっているので、Macなどでは変わる可能性があるのであしからず。

2018/3/19 現時点の最新バージョンではXdebugがはじめから入ってました。なのでインストールのところは飛ばしてください。

# 開発環境
OS: Windows 10
Laravel Homestead v7.0.1

# 手順
## Homestead側の設定
### Xdebugのインストール
Homestead v7.0.1は、デフォルトではPHP 7.2を使用することになっています。
ただ、Homesteadに入っているPHP 7.2はなぜかXdebugが用意されていないので（それ以前のバージョンでは用意されている）自前で用意する必要があります。

[https://xdebug.org/wizard.php](https://xdebug.org/wizard.php)を開き、以下のコマンドの実行結果をすべて貼り付けると、推奨されるXdebugと、そのインストール手順を教えてくれるのでこれを利用します。

```bash:command
php-fpm7.2 -i
```

自分の環境で貼り付けた結果です。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/75063/b7ec87c4-9e9c-1bb0-3aad-0f399504fb6f.png)

インストール後、再びphp-fpm7.2 -iを実行し、以下のようなXdebugに関する情報が出力されればインストール成功です。

> xdebug
> 
> xdebug support => enabled
> Version => 2.6.0beta1
> IDE Key => vagrant
> 
> Supported protocols => Revision
> DBGp - Common DeBuGger Protocol => \$Revision: 1.145 \$
> 
> Directive => Local Value => Master Value
> xdebug.auto_trace => Off => Off
> xdebug.cli_color => 0 => 0
> xdebug.collect_assignments => Off => Off
> ～

### Xdebugの設定
次にXdebugの設定を行います。
php.iniに書いてもいいですが、今回は別ファイルに分けて書きます。

```bash:command
sudo vi /etc/php/7.2/fpm/conf.d/20-xdebug.ini
```

```ini:20-xdebug.ini
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9001
```

remote_portはデフォルトでは9000ですが、なぜか9000では繋がらないため9001に変更しています。
設定を反映させるためにvagrant reloadで再起動してください。

以上でHomestead側の設定は完了です。

## Visual Studio Codeの設定
続いてVSCodeの設定に入ります。
まず拡張機能である「[PHP Debug](https://github.com/felixfbecker/vscode-php-debug)」をインストールします。

![phpdebug.PNG](https://qiita-image-store.s3.amazonaws.com/0/75063/0eaea961-6d4e-9c02-c2cc-4058f74c1fb6.png)

次にデバッグしたいプロジェクトをVSCodeで開き、F5キーを押します。
すると環境を選択するように言われるので、PHPを選択します。
![f5.PNG](https://qiita-image-store.s3.amazonaws.com/0/75063/e714bdad-4c83-9b47-cb71-da4400feeca0.png)

PHPを選択すると、launch.jsonが自動的に生成されるので、ポート番号をHomesteadと合わせたりします。
pathMappingsのところは適宜読み替えてください。

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9001,
            "pathMappings": {
                "/home/vagrant/code": "${workspaceRoot}"
            }
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9001
        }
    ]
}
```

以上ですべての設定完了です！

F5でリモートデバッグを開始し、適当なところにブレークポイントを貼るとちゃんと止まってくれます。変数の中身もみれます。

![break.PNG](https://qiita-image-store.s3.amazonaws.com/0/75063/ecd36893-13dd-24de-fa68-c049e902443e.png)
Pythonの__init__なんて読むの問題

Pythonの`__init__`これなんて読むのかと思ってたら、"dunder init"と読むらしいです。

[python wiki](https://wiki.python.org/moin/DunderAlias)に書いてあることを抜粋すると、

とあるインターネット上の[フォーラム](https://mail.python.org/pipermail/python-list/2002-September/155836.html)にてMark Jacksonと言う人が以下のように提案したのが発端らしいです。

> An awkward thing about programming in Python: there are lots of double underscores. My problem with the double underscore is that it's hard to say. How do you pronounce `__init__`? "underscore underscore init underscore underscore"? "under under init under under"? Just plain "init" seems to leave out something important. I have a solution: double underscore should be pronounced "dunder". So `__init__ ` is "dunder init dunder", or just "dunder init".

(要約)

>みんな`__init__ `ってなんて読む？すごく読みづらいよね…
> "underscore underscore init underscore underscore"も "under under init under under"も長すぎるし、ただ"init"だと大事な意味が抜けちゃうよね。

>そこで"double underscore"を縮めて"dunder"って呼ぶのはどうだろう？
> `__init__ `はdunder init dunder"、もしくは単に "dunder init"とするのは。

というpostがあり、それが広まったとのことです。

実際これ使われてるの？というところなのですが、私は英語のpython入門の動画教材を見ていてそこで普通に使われていたので、そこそこ普及してるのかもです。
【Jenkins：Mac】Jenkinsインストール

# 概要
Jenkinsの環境って整ってしまうとあまり触ることがないので
結果、職場で軽い設定とかはするけど、一からやるってなったらよくわからん！
なので一からやることにしてみた
多分ほどよい区切りごとに記事書く
環境はiMacでやってます
気が向いたらwinodwsでもやるかも

# 1. Javaインストール

Javaバージョン確認

```:コマンド
$ java -version
```

```:成功
java version "x.x.x"
```

```:失敗
java: command not found
```

失敗したらJavaがインストールされていないので下記からダウンロード/インストールする
http://www.oracle.com/technetwork/java/javase/downloads/index.html
JDKのダウンロードボタンからmacOSのdmg

※最新のJDKだとJenkinsが対応してない可能性がある
（記事書いてる時点ではJDK9系は対応してなかったのでJDK8系を入れた）

# 2. Homebrewインストール

読み方は「ホームブルー」らしい（英語苦手）

```:コマンド
$ brew -v
```

```:成功
Homebrew "x.x.x"
```

```:失敗
brew: command not found
```

失敗したらHomebrewがインストールされていないので下記コマンドでインストールする

```:コマンド
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

# 3. Jenkinsインストール

```:コマンド
$ brew install jenkins
```

```:成功
==> Summary
/usr/local/Cellar/jenkins/2.101: 7 files, 74.0MB, built in 43 seconds
```

```:失敗
jenkins: Java 1.8 is required to install this formula.
```

JenkinsがインストールしてるJavaに対応してなかったらこれインストールして的なメッセージがでるので
対応してるJDKインストールする

# 4. Jenkins起動

```:コマンド
$ brew services start jenkins
```

アクセスしてみる
http://localhost:8080/

初回はセットアップ画面が出るはず

# 5. Jenkinsセットアップ

![jenkins01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/dd716e42-28e7-44a6-7ec0-2ab982707a59.png)
アクセスするとパスワードを聞かれるので下記コマンドで確認
cat以降のパスはパスワードを聞いてくるページに記載されている赤文字のやつを入力
（/Users/[ユーザー名]/.jenkins/secrets/initialAdminPassword）こんな感じのやつ
コマンド入力して問題なければパスワードが出るのでAdministrator passwordにコピペ

```:コマンド
$ sudo cat [password]
```

![jenkins02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/8e8e20a5-c403-429d-5e92-8011170275c7.png)
プラグインのインストール画面になるので
無難に推奨のプラグイン（Install suggested plugins）をインストールする

![jenkins03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/09ee75a1-270f-15f4-cd79-795cac4a4955.png)
結構時間かかるので気長に待ちます

![jenkins04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/a56b5bad-8f12-b488-d40f-0c298d8aacdc.png)
あとはユーザーを作成して完了

![jenkins05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/871ecf39-7d3a-4293-24d8-437fb4822c43.png)
ここまでくるとよく見る管理画面がでるはず！
JenkinsでGitHubログインできるようにする

# GitHubログイン

1.  Jenkins UIでプラグインをインストール
  1. Jenkinsの管理→プラグインの管理→「利用可能」タブ
  2. `GitHub Authentication plugin` をチェックしインストール
1.  認証の有効化
  1. Jenkinsの管理→グローバルセキュリティの設定
  2. 「セキュリティを有効化」にチェックが入っていることを確認
  3. 「Github Authentication Plugin」を選択
  4. WebURI、APIURI、Scopeに下記値を入力し、ClientIDとClientSecretは各自の値を入力（※後述）
![github.png](https://qiita-image-store.s3.amazonaws.com/0/232087/3870ca93-3dc4-2fe4-5fd7-174531fadacd.png)
  5. 保存
1. ログインができるか確認する
  * 別ブラウザを起動し、GitHub認証でログインできるかチェックする（"Authorize application"を押下）  
※「権限管理」を「ログイン済みユーザーに許可」にしておくと、仮にGitHubログイン設定がうまくいっていない場合でも別ブラウザで試せば締め出されず安全です

詳しいドキュメントは[こちら](https://plugins.jenkins.io/github-oauth)を参照

### ※ClientIDとClientSecretの発行

1. GitHubログインさせたいアプリケーションを[Register a new OAuth application](https://github.com/settings/applications/new)に登録する
<img src="https://qiita-image-store.s3.amazonaws.com/0/232087/5c1a4954-f11d-8ec9-d1f3-f29dab8098c2.png" width=70%>
    * Application Name, Application Descriptionは任意
    * Homepage URL は JenkinsURLを記載
    * Authorization callback(<font color="Red">赤矢印←</font>)の URLの値に注意
        * Authorization callback URLにはJenkinsURLのあとに <font color="Red">/securityRealm/finishLogin</font> をつけるのを忘れずに！
2. ClientIDとClientSecretが発行されるのでJenkinsに設定する


# まとめ

* Basic認証でなくなるため、ユーザーはログインが楽になる
* アカウント発行の手間が減り、管理者も楽になる (Roleの設定に関する記事はまたどこかに書きたいと思います)
* win-win
rootユーザでftp(パッシブモード)

###インストール

```
# vsftpdとftpのインストール
yum install vsftpd ftp -y

# Enforce だったら setenforce 0 で変更
[root@localhost vsftpd]# getenforce
Permissive   

# ポート開放
firewall-cmd --zone=public --add-service=ftp --permanent

# サービス開始と自動起動
systemctl start vsftpd.service
systemctl enable vsftpd.service
```

###rootユーザーを許可するための編集箇所

- rootユーザーの許可

/etc/vsftpd/user_list

```
#rootユーザをコメントアウト
#root
```

/etc/vsftpd/ftpusers

```
#rootユーザをコメントアウト
#root
```

- パッシブモードで使用するポートを追記

``` /etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=50020
pasv_max_port=50025
```

- vsftpd.confに合わせてポート開放

```
firewall-cmd --zone=public --add-port=50020-50025/tcp --permanent
firewall-cmd --reload
```

- 設定反映のためサービス再起動

```
systemctl restart vsftpd.service
```
最新版nginxのインストールメモ

公式だとLinuxやUbuntuがごちゃごちゃに書いてあったので、まとめ。
root権限で実行する。

```
wget https://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key

cp /etc/apt/sources.list /etc/apt/sources.list.org

cat << EOF >> /etc/apt/sources.list
deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx
EOF

apt update
apt install nginx
```

sources.listに書き出すxenialを書き換えればtrustyやzestyでもつかえるみたいです。

「公式サイト」
http://nginx.org/en/linux_packages.html
IBM Cloud Docs への追記・修正依頼

IBM Cloud Docs に追記・修正を依頼したい場合は、Edit in GitHub から Issue をあげると修正してもらえました！
なので、気になることがあれば、どんどんIssueをあげていきましょう！
![Kobito.hSYi6F.png](https://qiita-image-store.s3.amazonaws.com/0/101361/7aa94fc9-49f9-5f49-f904-e68c4f7dd665.png "Kobito.hSYi6F.png")

>例：
https://github.com/IBM-Bluemix-Docs/image-templates/issues/1#issuecomment-358787124
![Kobito.gr0Cas.png](https://qiita-image-store.s3.amazonaws.com/0/101361/3c4030c0-cb49-7f25-9076-4a941383206f.png "Kobito.gr0Cas.png")
コードのコメントには何を書くのか

## コメントとはなんなのか
コメントは「読みやすいコードを書くための手段の一つ」です。
「適切な変数名をつける」とか「一連の処理ごとにコードブロックを分ける」とかはやるのが当たり前で、それだけでは表現できないものを、コメントに書きます。

## 悪いコメントとは「書くと二重管理になるもの」
[二重管理は悪](http://d.hatena.ne.jp/idesaku/20050826/1124993137)です。
逆に「他のなにかで管理できないものをコメントで書く」ということができていれば及第点だと思います。

## コメントに書いてはいけないものの例
書いてはいけないものとは何かを挙げ、なぜ書いてはいけないのか（=なにを見ればわかるのか）をあげます。

### コードの再翻訳
「書いてはいけないコメント」の例として、最もよく見るものです。
当然、**コードを見ればわかる**ので、書いてはいけません。

```
// $aと$bが同一だったら
if ($a === $b) {
}

// idの配列
$ids = [1,2,4,5];
```

### 「誰が、そのコードを書いたか」
**コミットログを見ればわかる**ので、書いてはいけません。
バージョン管理システムの blame とかを見ましょう。

### 「いつ、そのコードを書いたか」
**コミットログを見ればわかる**ので、書いてはいけません。
バージョン管理システムの blame とかを見ましょう。

超絶レガシーなコードだと、「 `// 2018-01-19 09:05 DBに保存する処理を追加` 」とかいうのも見ますね。

### そのクラスや関数の「使い方」
~~README.md やドキュメントに書いたほうが便利なので、そっちを使いましょう。~~
そのクラスや関数の Doc コメントに書きましょう。（``/**`` ``*/`` で書くアレ）
IDE では関数を使うときに表示されますし、ドキュメントを自動生成するときにも拾われるので、使う側から参照しやすい。

### 入力に対して、期待する具体的な出力
単体テストとかに書きましょう。

ただし、「例えば ``ID123456`` のような文字列」みたいなものは、書くだけでわかりやすくなるので、Doc コメントには書いたほうが良いです。

## コメントに書くべきもの
**「コメントに書くべきもの」とは、他のなにかで管理できない情報**です。

### 「1行もコードがない・なにもしない ということ」
例えば、[以下の様なやつ](https://github.com/Seldaek/monolog/blob/07b6c1c4171a030787f2bc961272b1887032304e/src/Monolog/Handler/Handler.php#L43)。そもそもコードにできないので、コメントに書くしかありません。

```php
try {
    $this->close();
} catch (\Throwable $e) {
    // do nothing
}
```

bash スクリプトとかだと [`:` っていう「（事実上）なにもしない」命令があったりします](https://qiita.com/xtetsuji/items/381dc17241bda548045d)ので、そういうときはそっちを使いましょう。

### 「なぜ、～ないのか」
「普通に考えたら、ここあるべきだと考えられる（かもしれない）処理」を、あえて書いていないんだということは、明記しましょう。

```php
class Database {
  public __constructor() {
    // 「コネクションを張る」ことの成否は外部要因なので、
    //   コンストラクタ内ではコネクションを張らない
    // コンストラクタの処理で、成功したり失敗したりしてほしくない。
  }
  public connect() {}
}
```

### コードブロックの目的
数行に渡っている一連の処理の目的は、コメントに書きましょう。コードをを読む人の手助けになります。

```php
// ゲームのタイトル一覧を取得
$rawData = $client->get('/games');
$gameTitles = array_column($rawData, 'title');
```

### 難しい前提知識の説明
普通は知らないであろう知識を要求する場合は、その知識を得られる場所をコメントで明記しましょう。
例えば、以下のコードをコメントなしで理解するのは、とても難しいはずです。

```php
define('GOLDEN_RATIO', (1 + sqrt(5)) / 2);

/** @var int 第n項 */
$n = input()[1];

// フィボナッチ数列の一般項の式を用いて求める
// see https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0#%E4%B8%80%E8%88%AC%E9%A0%85
$lucasNumber = (GOLDEN_RATIO ** $n) - ((-GOLDEN_RATIO) ** (-$n)); 
$resultRaw = $lucasNumber / sqrt(5);

return floor($resultRaw);
```