OmniAICreator/Qiita-1.07M huggingface dataset:
仮想通貨NEMアプリをスピード開発する小技・Tips

仮想通貨NEMがIT技術者の周りでにわかに注目を集めています。
NEMは柔軟なAPIが提供されているため、送金や情報管理などのアプリケーションを手軽に構築できる可能性を秘めています。

今回は仮想通貨NEMのAPIを利用してWebアプリをスピード開発するためのノウハウを紹介します。

後日整理するかもしれませんが、突貫エントリーのため、解説なしです。

###金額を3ケタカンマ、小数点表記に変換する
```javascript:sample.js
var dispAmount2 = function(amount,divisibility){
	if(divisibility > 0){

		if(amount < Math.pow(10, divisibility)){

			return "0." + paddingright(amount.toString(),0,divisibility);
		}else{
			var str_amount = amount.toString();
			var r = str_amount.slice(-divisibility);
			var l = str_amount.substring(0,str_amount.length - divisibility);
			l = l.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
		}
		return l + "." + r;

	}else{
		l = amount.toString().replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
		return l
	}

}
function paddingright(val,char,n){
	for(; val.length < n; val= char + val);
	return val;
}

```

###チェーンに刻まれたHEX文字を日本語メッセージに変換する
```javascript:sample.js
var hex2a = function hex2a(hexx) {
	var hex = hexx.toString();
	var str = '';
	for (var i = 0; i < hex.length; i += 2) {
		str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
	}
	return str;
};
```

###ハイフン無し、小文字アドレスを大文字に統一する
```javascript:sample.js
address = address.replace( /-/g , "" ).toUpperCase();
```
###Google先生にウォレット対応QRコードを出力してもらう
```javascript:sample.js
var bill = '{"v":2,"type":2,"data":{"addr":"' + ADDRESS + '","amount":1000000,"msg":"' + msg + '"}}';
$("#qr").attr("src","http://chart.apis.google.com/chart?chs=180x180&cht=qr&chl=" + bill);
```

###poloniexとblockchain.infoからxemの現在価格を日本円で計算する
```javascript:sample.js
$.when(
	sendAjax("https://poloniex.com/public?command=returnTicker"),
	sendAjax("https://blockchain.info/ticker?cors=true")
)
.done(function(res1, res2) {

	POLO_JPY_XEM = res1[0].BTC_XEM.last * res2[0].JPY.last;
	POLO_JPY_XEM = Math.round(POLO_JPY_XEM * 1000) / 1000;
})
.fail(function(xhr, textStatus, errorThrown) {
	alert("時価の取得に失敗しました。");
});

```

###URL部分に指定されたアドレスをスクリプト内で利用する。
```javascript:sample.js
var address ="";
if (1 < document.location.search.length) {

	var query = document.location.search.substring(1);
	var prms = query.split('&');
	var item = new Object();
	for (var i = 0; i < prms.length; i++) {
		var elm   = prms[i].split('=');
		var idx   = decodeURIComponent(elm[0]);
		var val   = decodeURIComponent(elm[1]);
		item[idx] = decodeURIComponent(val);
	}
	address = item["address"];
}

if( address == ""){
	var address = prompt('NEMアドレスを入力してください',address);
}
```
###モザイク、マルチシグなどで構成された複雑なトランザクションからXEMだけを抽出する。
```javascript:sample.js

var tran = val.transaction;

var tran_amount = 0;
var tran_fee = tran.fee;

if(tran.type == 4100){

	tran_fee    = tran.otherTrans.fee + tran.fee ;
	tran = tran.otherTrans;
}

if (tran.type == 257 || tran.type == 8193 ){

	//モザイクが存在した場合
	var has_mosaic = false;
	if(tran.mosaics){

		for(key  in tran.mosaics){
			has_mosaic = true;
			var mosaic = tran.mosaics[key];
			if(mosaic.mosaicId.name == "xem" && mosaic.mosaicId.namespaceId == "nem"){
				tran_amount = mosaic.quantity;
			}
		}
	}
	//通常送金
	if(!has_mosaic){
		if (tran.type == 8193 ){
			tran_amount = tran.rentalFee;

		}else{
			tran_amount = tran.amount;
		}
	}
}

```
簡単なJSPで Watson Weather Company Data から天気予報を取得する

```jsp

<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="java.io.InputStream"%>
<%@page import="java.util.Base64"%>
<%@page import="java.net.URLConnection"%>
<%@page import="java.net.URL"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<script>
	
<%
String json = "{}";
try {

				String username = "xxx";
				String password = "xxx";
				URL url = new URL(
						"https://twcservice.mybluemix.net/api/weather/v1/geocode/35.681167/139.76705/forecast/daily/3day.json?language=ja-JP");
				URLConnection conn = url.openConnection();
				conn.setRequestProperty(
						"Authorization",
						"Basic "
								+ Base64.getEncoder().encodeToString(
										(username + ":" + password).getBytes()));
				InputStream is = conn.getInputStream();
				BufferedReader br = new BufferedReader(new InputStreamReader(
						is, "UTF-8"));
				StringBuilder sb = new StringBuilder();
				String line;
				while ((line = br.readLine()) != null) {
					sb.append(line);
				}

				System.out.println(sb.toString());
				json = sb.toString();

				br.close();
			} catch (Throwable th) {
			}
%>

var json = <%=json%>;

</script>


</head>



<body>

<script>
for(var i=0;i<json.forecasts.length;i++){
document.write(json.forecasts[i].narrative);
document.write("<br>");
}
</script>

</body>
</html>

```
Cognos で「詳細なエラー情報は CAF により記録されました」メッセージを完全に表示させる

#内容
単純に、へ～、知らんかった、と自分が思ったちょいネタです。

Cognos BI & Analyticsで、画面上に以下のエラーメッセージが表示される事、良くありますね。
**DPR-ERR-2082 　詳細なエラー情報は CAF により次の SecureErrorID で記録されました**

なんでこんな見てもわからん、意味のないメッセージ出すのやら、結局cogserver.log見ないと何もわからんわ、という経験をした方は多いと思います。
http://www-01.ibm.com/support/docview.wss?uid=swg21958091

しかしながら、これ実は権限の問題で、「詳細なエラー」という機能の権限を付与すると、ちゃんとしたメッセージが画面上に出力されるのですね。

「詳細なエラー」の機能とはこれですね。
この機能に、「実行」権限を付与すると、上記のような「CAFにより記録されました」ではなく、完全なメッセージが出るそうです。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ba18bebf-b0ae-9b20-9b74-9760958c25e5.png)

こちらのTechnote見て、へ～、今度使ってみよ、と思いました。
**How to make Cognos Analytics 11 return the complete message instead of a CAF error.**
http://www-01.ibm.com/support/docview.wss?uid=swg22001767
Nexus7のRoot化

Nexus7 2012のタブレットとiPhone8を
持っています。Nexus7のバージョンアップしたら妙に動きが重たいし、ゲームすら出来ません。なので、パソコンも買ったのでRoot化してみようと思いました！
（メーカー保証対象外になるため自己責任で）

実際にRoot化してみました。
良い点
①かなりサクサク動く
②新しいバージョンにアップデートできる

悪い点
①めんどくさい
②かなりの時間がかかる

このような感じです！(ﾟ∀ﾟﾉﾉ"☆ﾊﾟﾁﾊﾟﾁﾊﾟﾁ★
正直、新しく買ったほうが良きだと思います。
ASUSタブレット、NECタブレットがかなり
スペック高いしコスパも凄くイイのでAndroidタブレットはやっぱりその2社がいいかな？笑

みなさんは店員さんに騙されて家電製品を買ったらダメですよ！
簡単なJavaで Watson Weather Company Data から天気予報を取得する


```java

	public static void main(String[] args) throws Exception {

		String username = "xxx";
		String password = "xxx";

		URL url = new URL(
				"https://twcservice.mybluemix.net/api/weather/v1/geocode/35.681167/139.76705/forecast/daily/3day.json?language=ja-JP");
		
		URLConnection conn = url.openConnection();
		conn.setRequestProperty(
				"Authorization",
				"Basic "
						+ Base64.getEncoder().encodeToString(
								(username + ":" + password).getBytes()));

Base64.getEncoder().encodeToString("username:password".getBytes()));
		InputStream is = conn.getInputStream();

		BufferedReader br = new BufferedReader(new InputStreamReader(is,
				"UTF-8"));

		StringBuilder sb = new StringBuilder();

		String line;

		while ((line = br.readLine()) != null) {
			sb.append(line);
		}

		System.out.println(sb.toString());

		br.close();

	}


```
Translator > MS Translator API


参考
[Microsoft Translator テキスト API で、日本語を英語に翻訳するサンプル - Qiita](https://qiita.com/TakeshiNickOsanai/items/a8039ba8d558f7c8a05e)


# Translator

## getstartedにアクセスする。

[Getting Started with Microsoft Translator](https://www.microsoft.com/ja-jp/translator/getstarted.aspx)

2017/12/11現在は以下のような画面です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/730ceee5-2fea-0e5a-7650-ee85d7c21fe1.png" width=500 />

Azureアカウントは取得済みとして続けます。

サインインした状態でCognitive Services セクションに進みます。
[CognitiveServicesの作成 - Microsoft Azure](https://portal.azure.com/#create/Microsoft.CognitiveServices)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/45ca5351-e272-9d8a-4cb6-469edeaa5c23.png)

* Name
　名称を付けます。
* サブスクリプション
　登録しているサブスクリプションを選択する。

* API Type
    Translator Text APIを選択する。
  
* 価格レベル
　無料のF0～S4まであり。
 　2017/12/11現在は以下
  ![image](https://qiita-image-store.s3.amazonaws.com/0/49910/9e476d45-9290-1ba6-2c0e-6ef0a6d07904.png)

* Resource Group
    リソースグループを選択する。
    自分が管理したいグループを選択か、新規作成する。
* Resource Group Location
    地域を選択。どこでも良いとおもうが、テストならば住んでいるところに近い方がいいかも。

必要項目の入力が終われば作成ボタンを押す。
しばらく待つとダッシュボードに追加されます。

ダッシュボードからTrasnへアクセスするとTrans1 - Quick startの画面になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/e9041445-ff5c-5975-e306-c4748a9eed4e.png)

## 1 キーの取得
Grab your keysをクリックするとキー情報にアクセスできます。
メモしときます。

## 2 Make an API call

* [APIリファレンス](http://docs.microsofttranslator.com/text-translate.html)

## 3 Enjoy coding


* [API キュメント](https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-info-overview)
* [コードサンプル](https://github.com/MicrosoftTranslator)
ASP.NET > CSharp > AngleSharp > タグ全消去



<a href="https://github.com/AngleSharp/AngleSharp/issues/6">Extract only Text · Issue #6 · AngleSharp/AngleSharp</a>



```
[TestMethod]
public void StripHtmlTagsTest2()
{
var input = "<div><span>Hello, world! Some <a href=\"#\">link.</a></span></div>";
var nodeList = new HtmlParser().ParseFragment(input, null);
Assert.AreEqual("Hello, world! Some link.", string.Concat(nodeList.Select(x => x.Text())));
}

```
hardware maintenance 

In order to handle the day to day traffics and complexities, having a high quality hardware infrastructure is a must in every co operate office. For the work force to function well it is very important to have a well established as well as efficient hardware as well as networking infrastructure. Various elements such as network systems, servers, hardware , power systems should function hand in hand to get a better result.  <a href="http://www.digitechqatar.com/hardware-network-solutions/"> Network Maintenance  Provider  qatar</a>

  So it is the duty of the authorities to ensure this .Computer hardware maintenance means the maintenance of its physical parts like keyboard ,mouse, ram etc. Maintenance of computer is important because it helps to improve computers lifespan and helps in functioning smoothly. <a href="http://www.digitechqatar.com/it-support-services/"> computer repair service provider qatar
</a>
LocalizedStringの設定忘れ防止手順


# はじめに
アプリの国際化対応をする時、StringについてはNSLocalizedStringを使いますが、使い忘れて英文がそのまま出てしまうことがちょくちょくあります。（私の場合、特にエラーメッセージ）
Xcodeの静的解析機能（Analyze）の設定をちょっといじって、NSLocalizedStringを使用し忘れているところを見つけていきましょう。

（ちなみにXcode9.1で実行しましたがObjective-Cでしか動作しないようです。）


# 手順
* ナビゲータウィンドウ（左の画面）からProjectを選択する。
* PROJECTを選択し、Build SettingsのStatic Analyzer Issues AppleAPIsを表示する。
![localizedString1.png](https://qiita-image-store.s3.amazonaws.com/0/41552/204cbcea-ab7c-c8cc-93dd-9df7ed42ba88.png "localizedString1.png")

* Missing LocalizabilityをYesにする。
* Analyzeを実施する。（実行ボタンを長押ししてAnalyzeを選択）

しばらく待つと、SourceCodeでNSLocalizedStringを使用してない箇所を教えてくれます。
discount vouchers 

Giving discounts and offers are now a trend among retailers now to increase their sales. Now  a days internet shopping is a normal trend. Discount coupons gives the same item at a very discounted rate  this is the main reason why such discount vouchers are gaining popularity.  <a href="https://www.vouchermedia.com/vouchers/miss-selfridge-codes/">miss selfridge vouchers code</a> So using    Discount vouchers   is a good idea. Discount vouchers are issued by retailers as a method to increase their business. A person will get discount for any item he needs. In order to get discount vouchers you only  need   search the net   for the offer you need.   <a href="https://www.vouchermedia.com/vouchers/waitrose-codes/">waitrose voucher codes</a>
xtrabackupの定期バックアップスクリプトを日本語化した。

Cronでバックアップを取得することになったので、autoxtrabackup（のコンフィグだけ）を日本語化した。
定期実行用のスクリプトを探していて見つけたので、日本語化した。
割と便利。

https://github.com/Yuutakasan/autoxtrabackup
Microsoft OneNote にソースコードを貼り付ける

## VS Code からコピペする

[Visual Studio Code](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx) からコピペするとシンタックスハイライトが効いた状態でペーストできます。

検索したところ、OneNote のプラグインなどがあるようなのですが、Visual Studio Code は対応言語がどんどん増えていってますので、これでいいような気がします。

## 2018/01/29 書き直し
最近またソースコードを貼り付ける機会があったので使用してみたところ、あまり諸手を挙げてお勧めできるようなものではないことがわかりました。

**インデントが削除されてしまう** ためです。

この挙動は 1.11.2 からであることも確認しました。

また初出時に書いた「背景色まで反映されてしまう」という不都合さは、確認した全てのバージョンで再現できませんでした（私はなにか幻を見たのでしょうか...）。

### 次善の策

#### Word を経由

かなり敗北感が強いのですが、一旦 Word に貼り付けて、Word から再度コピーし、OneNote にペーストすればインデントが有効、文字色も有効であることを確認しました。ただしこの場合は背景色も一緒に反映されてしまいます。

#### 1.10.2 を使う

バージョンを 1.10.2 まで戻せば文字色が有効でインデントも有効であることを確認しました。しかしながら相当古いバージョンなので、いまさらこれを使うというのは現実的ではないかもしれません。

過去のバージョン
https://vscode-update.azurewebsites.net/1.10.2/win32/stable

リンクの「1.10.2」の部分を変更すればその他の旧版もダウンロード可能です。

参考：
[Visual Studio Code のバージョン一覧と入手先について (2017/07/12) - Qiita](https://qiita.com/satokaz/items/02f596b96c377e40ce8f)

ついでに、1.9.1 以前では文字色も反映されませんでした。

## 注意

背景色が効いた状態で Word 経由のコピペをすると悲しいことになります。Light(Visual Studio) のように背景色が白のカラーテーマで作業するのが良いと思います。

また、Visual Studio Code -> OneNote 直接でコピぺする場合も、Dark テーマ系の文字色は薄いことが多いので注意が必要です。

以下、ライト系のテーマを少し集めてみました。

- [Visual Studio Light Theme - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=SimoneOlivieri.visual-studio-light-theme)
- [Visual Studio for Mac Light Theme - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=jamiewest.theme-light-vs-mac)
- [earthsong-light Theme - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=gerane.Theme-earthsong-light)
- [Squirrelsong Light Theme - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=sapegin.Theme-SquirrelsongLight)
- [bluloco-light - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=uloco.theme-bluloco-light)
- [Light+ Tweaked - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=perragnaredin.light-plus-tweaked)
- [BBEdit Light Theme - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=jonbeebe.theme-bbeditlight)
- [snappy-light Theme - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=gerane.Theme-snappy-light)

## 免責

~~Mac 版では試していません。ごめんなさい。~~

Visual Studio Code -> OneNote 直接でコピぺでは Mac 版でも動作することを、コメント欄にて @tokusyu 様が確認してくださいました。ありがとうございました。
tensorflow の tf.Session() がやたら重いとき

身近な環境で tf.Session() を実行するのがやたら時間がかかる事象があり、それに対応したメモです。

# おそい
例えば ipython で以下のように Session を作ろうとすると

```py3
In [1]: import tensorflow as tf

In [2]: session = tf.Session()
2017-12-12 15:41:48.870629: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
```

ここで異常に待たされます。1分くらい。

# 環境
GeForce GTX 1080 が刺さった Linux マシンです。
OS は Ubuntu 16 です。
**以前適当に CUDA 等入れてしまい、 CUDA9, cuDNN7 がインストールされた状態で、更に tensorflow1.4 用に CUDA8, cuDNN6 を追加で入れた環境です。**
（2017/12 現在最新の pip で入る tensorflow1.4 は CUDA9, cuDNN7 には対応していない）

```
% nvidia-smi
Tue Dec 12 17:51:05 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.26                 Driver Version: 387.26                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 00000000:01:00.0  On |                  N/A |
| 27%   27C    P8     6W / 180W |     61MiB /  8112MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       992      G   /usr/lib/xorg/Xorg                            59MiB |
+-----------------------------------------------------------------------------+
```

# 対応
上の環境にある通り、 CUDA/cuDNN のバージョンが複数（しかも必要なバージョンより新しいものが入っている）状態なのが悪いんじゃないの？とあたりを付けて CUDA/cuDNN をそれぞれ CUDA8, cuDNN6 のみを入れ直したら治った次第です。

## 既存の CUDA/cuDNN の削除
### CUDA の削除
```zsh
# パッケージ一覧から cuda 系を取得
dpkg -l | grep cuda
# cuda-***-8 と cuda-***-9 が混在しているのを確認

# cuda を削除・再インストール
sudo apt-get remove cuda

# cuda 等を入れるために自動的に入った依存ライブラリ（もう使われてない）を削除
sudo apt-get autoremove

# 消えたか確認
dpkg -l
```

### cuDNN の削除
```zsh
ls /usr/local/ | grep cuda

# cuda-*** を削除
sudo rm -fr /usr/local/cuda-9.0/
```

### 再インストール
```zsh
# cuda 関係のライブラリ一覧を探す
# 多分 cuda-8-0 とか cuda-9-0 とかがあるはず。
apt-cache search cuda

# お好みのバージョンを入れる
sudo apt-get install cuda-8-0

# cuDNN を入れなおす
# https://developer.nvidia.com/rdp/cudnn-download からダウンロードして cudnn.tgz で保存しておく
tar xvzf  cudnn.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
```

何が原因かというのははっきりわかりませんが、私の環境ではこれで tf.Session() が普通の速度で動くようになりました。
PHPの日付処理の落とし穴(+1 month)

私が過去何度も落ちた穴です(今後も落ちないとは限らない)。
その穴とは、「ある日の次の月の末日」
これを書いている12月12日だったら来年1月の末日1月31日のことである。
どう穴に落ちるのか。
date()とCarbonで素直に書いてみる。

```php
require 'vendor/autoload.php';

use Carbon\Carbon;

$d = date('Y-m-t', strtotime('2017-01-31 +1 month'));
echo 'date => '.$d.PHP_EOL;

$c = Carbon::parse('2017-01-31')->addMonth(1)->endOfMonth();
echo 'Carbon => '.$c->format('Y-m-d').PHP_EOL;

// 実行結果
// date => 2017-03-31
// Carbon => 2017-03-31
```

素直に穴に落ちた。
ここで正解として求められているのは`2017-02-28`である。
修正案としては以下コード。

```php
require 'vendor/autoload.php';

use Carbon\Carbon;

$d = date('Y-m-d', strtotime('2017-01-31 last day of +1 month'));
echo 'date => '.$d.PHP_EOL;

$c = Carbon::parse('2017-01-31')->firstOfMonth()->addMonth(1)->endOfMonth();
echo 'Carbon => '.$c->format('Y-m-d').PHP_EOL;

// 実行結果
// date => 2017-02-28
// Carbon => 2017-02-28
```

date()のほうが記述がシンプルですね。
Carbonはもっといい方法があったりするのでしょうか。。
ブランチ間の差分を含むプルリクエストを検索する

# ブランチ間の差分を含むプルリクエストを検索する

# やりたいこと
Branch A と Branch B が存在する場合に Branch A のみに含まれるコミットを抽出して、それらを含むプルリクエストを明らかにしたい。

# シェルスクリプト
[find_pull_requests.sh](https://gist.github.com/42milez/8179683638be13cffc4e5f3b84737c6f)

# 補足
- 12行目の `git log --no-merges --right-only $src_branch..$dest_branch | grep -Eo ' [a-f0-9]+$'` では `$dest_branch` にのみ存在するコミットのハッシュ値を抽出しています。
- 15行目の `git log --merges --oneline --reverse --ancestry-path $commit_hash...$dest_branch` は `--ancestry-path` で抽出するコミットを絞り込み、さらに `--reverse` することで続く17行目の `head -n 1` で直近のマージコミットのみを取り出せるようにしています。
- `git cherry-pick` を行って一部のコミットを A から B に取り込んでいる場合は当該コミットのハッシュ値が変わってしまう（新しいコミットオブジェクトとして扱われる）ので、上記スクリプトでは差分として扱われます。

# 参考資料
- [ブランチ間の差分をコミット単位で知る・見る](https://qiita.com/ikenji/items/fecd39966bbf463da3f4)
- [Commit Hash から、該当 Pull Request を見つける方法](https://qiita.com/awakia/items/f14dc6310e469964a8f7)
- [Linuxコマンドで重複している行（だけ）を見つけたいとき （sortとuniqコマンド）](https://qiita.com/smile_kme/items/d33f9b1f925a61483281)
- [配列のデータを整列させる(bash)](http://d.hatena.ne.jp/anmino/20091020/1255988531)
- [Gitのコミットオブジェクトの概念](https://qiita.com/bigwheel/items/41dffe51cf49767b66af)
Macに機械学習の開発環境を構築する (Python)

いろんな方法があるので、自分なりにこれがベストと思った方法をまとめておく。

とはいえ[pyenv v1.2.0のREADME](https://github.com/pyenv/pyenv/blob/v1.2.0/README.md)の通りに設定し、pyenvを使ってAnaconda3をインストールしているだけ。

# 前提

- macOS Sierra 10.12.6（16G1036）
- Homebrew 1.4.0
- numpy, matplotlibを使いたい
- なるべく楽をしたい

# 初回にやること (これだけやれば構築完了)

## pyenvインストール

```bash
brew update # 必要に応じて
brew install pyenv
```

## pyenv設定

```bash
echo 'export PYENV_ROOT=$HOME/.pyenv' >> ~/.bash_profile
echo 'export PATH=$PYENV_ROOT/bin:$PATH' >> ~/.bash_profile
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
source ~/.bash_profile
```

zshの人は~/bash_profileの代わりに~/.zshenvへ追記する。

Ubuntu/Fedoraの人は~/bash_profileの代わりに~/.bashrcへ追記する。

## python (Anaconda3) インストール＆設定

```bash
pyenv install --list | grep anaconda3
pyenv install anaconda3-5.0.1 # 最新のAnaconda3を入れる
pyenv global anaconda3-5.0.1 # インストールしたAnaconda3を選ぶ
```

もしpyenv installでエラーがあれば[Common build problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems)を参照する。

## バージョン確認
```bash
python -V
```

# 将来やること

## pyenvのアップデート

```bash
brew update # 必要に応じて
brew upgrade pyenv
```

# 参考情報

- [pyenv](https://github.com/pyenv/pyenv)
- [What is Anaconda?](https://www.anaconda.com/what-is-anaconda/)
Google STEPインターンに参加するまで

2017年の夏に2ヶ月ほど, GoogleのSTEPインターンに参加してきました.
今回はこのインターンに参加するまでのことについて書いてみたいと思います. 
すでにたくさんの人が書いてくれているけれども..(^^;)

## そもそもSTEPインターンとは...
まず少し, STEPの宣伝をば. 他の方々も大量に書かれていると思いますが, STEPインターンとはなんぞやについて少し書いてみます.  
公式サイトになんて書いてあるか探して見ましたが、STEPについて書いてある公式のページが見つからない.  
というわけで, 頑張って説明してみると, 
このSTEプログラムは女性や障がいのある方のテクノロジー分野における活躍を支援するという理念のもと、教育コースとインターンシップの二部構成で実施されています.  
前半部分の教育コースはGoogleの社員さんが講師として色々教えてくれます. この教えてくださる方がほんっとうにすごくて, とにかくすっごい方々です. 何回でも言いますがとにかく優秀な方々です. 教えてくださることも, エンジニアとしてやっていこうかなぁ~と考えている人にとってはとってもためになることばかりです. そのほかにも, 授業後に夜ご飯を食べるときに社員さん方とお話しすることができ, いろんな話を聞くことができます. 夜ご飯もおいしいよ!! この前半部分だけでもとってもためになります.   
後半部分は, インターンそのままです. ご飯も3食食べれるし, マッサージも受けれるし, とにかく最高. 私はChromeチームへと配属されたのですが, イベントがたくさんあって美味しいものがたくさん食べれました.  
~~さっきからご飯のことにたくさん言及している気がするー~~


でもって, このSTEPプログラム, 天下のGoogleが実施しているプログラムだけあってなかなかに応募するにもハードルが高いと思います. どーせもともとプログラミングができないとダメなんでしょ~と思われるかもしれませんが,全くもってそんなことありません. 私も当たって砕けろの精神で応募したにすぎません. 私のレベル的には大学の授業でプログラミングをしたレベルです. 正直参加できるとは思うてなかった...特に前半の教育コースに参加するために必要なプログラミング技術は基本的なことだけだと思います. ~~おそらく, ハードルが高くてなかなか皆さん応募しないから競争率が低いと思われる.~~  
というわけで今回はハードルを下げるために, 私が後半のインターンに参加するまでにやってきたことについて書いて見たいと思います.やっと本題!!

## 教育開発コースに参加するまで
私がプログラミングを始めたのは大学に入ってからです。最初は, プログラミングってどうやってやるの? プログラミング言語ってなにがあるの?? ターミナル? なにそれおいしいの? って状態から始めてます. そこから大学の授業でC言語を学んでいきました. その一年の後期にあった授業がとっても厳しく, 毎日毎日血を吐きそうになりながらプログラミングすることになります.
そこでプログラミングの基礎を手に入れたのでした.   STEPの教育開発コースに応募したのは二年生の時なので, 私が応募した時に持ってた知識は, Cの知識だけ. C++じゃなくてただのC! がんばった!! PythonとかJavaとかやっとけばもっと楽だった... あとgitの知識があったらもっとよかったかなぁ.  
とりあえず、応募するだけならCだけの知識しか持たない人でもだいじょうぶ!  
やっぱり勉強はやり続けないといけないけど。 教育開発コースが終わった頃には, かなーり成長できていたと思います.

## 後半のインターンに参加するまで
私がインターンに参加したのが三年生の夏休み. 教育開発コースに参加してから一年間のタイムラグ. そこの間で何をしていたかっていうのを書きたいと思います. **(ちなみに私は次の年のインターンに参加したけど, 次の年のに参加できるかとかは毎年かわるみたいなので要確認です)**  

- ハッカソンに参加
[yahooさんの Girls Hack U 2016](https://hacku.yahoo.co.jp/girlshacku2016/)という初心者でも参加しやすい, 社員さんがメンターとしてやさーしく教えてくれるハッカソン. 実際に働く女性の方からお話を聞けるし, 初めてハッカソンに参加してドキドキしてたけどとっても楽しむことが出来た. それと同時に, こういうスキルが自分にあったらなぁと思うことが多々あり, モチベーションアップ! そして何より, こういうの作ったよ!ということが出来るようになったのが大きかった. プロジェクト参加経験として~~言い張ることで~~様々な履歴書にかけた.


- 情報系のアルバイトを始める
ロボット系の少しだけPythonを扱うアルバイトを始める. いっつもバリバリコーディングするバイトというわけではないけど, お客さんから有意義なお話を聞ける. 

- 情報分析のインターン
データ分析するインターン. 二ヶ月間ほど御世話になる. 

- 学校の授業とか独学で
    Cだけだった知識をJavaとかPythonとかある程度使えるようにする. プログラミングコンテストの問題を解いてみたり.

## まとめ
とりあえず, 私はSTEP夏のインターンに参加するまでにこんな感じのことを経験しました. 参考になれば幸いです.  
でもってさらにまとめると, ダメはもともとでもいろいろ挑戦してみると色々なことが体験できるよっていうおはなしでした.
あと, 情報系のインターンは, Googleに限らず参加経験のあるプロジェクトについて説明してください~~ なんて言われることがあるからできるだけはやくハッカソンなんかで作品を作っておくとよい. どんなクオリティでも, なになにをつくったよって言えるのは便利.

学校の授業をしっかり受けることはもちろん, 独学でも気になったらとりあえず手を出してみるのが良いかも.

やろうか悩んだらとりあえずやってみる!!

以上, 駄文にお付き合いありがとうございました.
Oracle LinuxやCENT OSでansibleインストールしようと思ったらEPELからみつからない

twitterで教えていただいたのでメモ。


#ansibleインストールしようと思ったらEPELからみつからない

Oracle LinuxやCentOSからyumでansibleを入れるためには、EPEL（Extra Package for Enterprise Linux）レポジトリを利用してインストールすることになると思いますが、2017/12現在EPELにansibleはありません。

https://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/epel/epel-release-latest-7.noarch.rpm

これはRHELのextrasパッケージにansibleが含まれたために、
Enterprese Linuxのパッケージに干渉しないというEPELのポリシーに従いEPEL側から削除されたようです。



#どこにあるのか

現在は以下に存在しているようです。

- Oracle Linux　
    - developer_EPEL
http://yum.oracle.com/repo/OracleLinux/OL7/developer_EPEL/x86_64
    - openstack30
　http://public-yum.oracle.com/repo/OracleLinux/OL7/openstack30/x86_64
- CENT OS
    - extras
  http://mirror.centos.org/centos/7/extras/x86_64/Packages/


#実行例

```
# vi /etc/yum.repos.d/public-yum-ol7.repo
　…　
[ol7_openstack30]
name=Oracle Linux 7 (x86_64) UEK Release 3
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL7/openstack30/x86_64
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=0

# yum list  ansible --enablerepo=ol7_openstack30
Available Packages
ansible.noarch    2.1.0.0-1.el7   ol7_openstack30
```

#参考
Ansible package moved from EPEL to extras
https://liquidat.wordpress.com/2017/10/27/ansible-package-moved-from-epel-to-extras/amp/
(Swift4)UITableViewにてCellを並び替える方法


Swift4構文で書かれている記事を見掛けなかったので書かせて頂きました
間違いなどありましたら教えて下さると助かります

```
//テスト配列
var todoList:[String] = ["todo01","todo02","todo01","todo03","todo04"]
    
//並び替えが終わったタイミングで呼ばれるメソッド
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    //sourceIndexPath にデータの元の位置、destinationIndexPath に移動先の位置
    //CellValueを取得
    if let targetTitle = todoList?[sourceIndexPath.row]{
        //元の位置のデータを配列から削除
        todoList?.remove(at:sourceIndexPath.row)
        //移動先の位置にデータを配列に挿入
        todoList?.insert(targetTitle, at: destinationIndexPath.row)
    }
}
```

参考URL
 [UITableView の編集モードを利用してデータの削除や並び替えを行う](http://himaratsu.hatenablog.com/entry/tableview/editmode)
UnityでiTextSharpを使ってPDFを作成する

UnityでPDFを生成する必要があったので、それに用いたiTextSharpというライブラリの導入方法を説明します。

# iTextSharpのダウンロード

iTextSharpはAGPL-3.0 Licenseの元、無料で使えるC#用のPDF生成に使えるライブラリです。Unity 5.6.4（Mac版）で試したところ、こちら問題なく使えるようでした。

下記のNuGetのページからManual downloadリンクをクリックして、.nupkgファイルをダウンロードします。

[iTextSharp](https://www.nuget.org/packages/iTextSharp/)
[itextsharp.xmlworker](https://www.nuget.org/packages/itextsharp.xmlworker/)
[itextsharp.pdfa](https://www.nuget.org/packages/itextsharp.pdfa/)
[itextsharp.xtra](https://www.nuget.org/packages/itextsharp.xtra/)

ダウンロードした.nupkgの拡張子を.zipに変更し、解凍し、それぞれのパッケージからdllを取り出します。

# Unityにインポートする

Pluginsフォルダを作り、そこに取り出した4つのdll (itextsharp.dll, itextsharp.pdfa.dll, itextsharp.xmlworker.dll, itextsharp.xtra.dll)をいれます。

# スクリーンショットをPDFに保存してみる

```c#:PDFTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System;

public class PDFTest : MonoBehaviour {

    public Camera mainCam;
    private Texture2D capturedTex;


	public void Start(){
		GeneratePDF();
	}


    public void GeneratePDF () {
		string path = Application.persistentDataPath + "/screenshot-"+System.DateTime.Now.ToString("yyy-MM-dd_HH-mm-ss")+".pdf";
		StartCoroutine(CreatePDF(path));
	}

	// create pdf to specific path
    public IEnumerator CreatePDF (string path) {
		Document doc = new Document(PageSize.A4.Rotate()); 

        var writer = PdfWriter.GetInstance(doc, new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None));


        doc.Open();
        doc.NewPage();

		yield return StartCoroutine(TakeScreenshot(mainCam, Screen.width, Screen.height));


		AddImageToPDF(writer, capturedTex, 0, 0);


        doc.Close();

	}

	// coroutine to take screenshot
    public IEnumerator TakeScreenshot (Camera cam, int width, int height) {

        RenderTexture rt = new RenderTexture(width, height, 24, RenderTextureFormat.ARGB32);
        rt.antiAliasing = 8; 
        cam.targetTexture = rt;
        cam.Render();

		yield return new WaitForEndOfFrame();

        RenderTexture.active = rt;

        capturedTex = new Texture2D(width, height, TextureFormat.RGB24, false);
        capturedTex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        capturedTex.Apply();

        cam.targetTexture = null;
	}

	// add image to pdf
	public void AddImageToPDF(PdfWriter pdfWriter, Texture2D img, float posX, float posY){
		byte[] imageBytes = img.EncodeToPNG();
		iTextSharp.text.Image finalImage = iTextSharp.text.Image.GetInstance(imageBytes);
		finalImage.ScaleAbsolute(PageSize.A4.Rotate());
		finalImage.SetAbsolutePosition(posX, posY);
		
		var pdfContentByte = pdfWriter.DirectContent;
		pdfContentByte.AddImage(finalImage);
	}


}

```


PDFはpersistentDataPath下にこのように保存されます。

![Screen Shot 2017-12-12 at 17.30.00.png](https://qiita-image-store.s3.amazonaws.com/0/42909/57843a7a-b25f-91e1-17a3-0395ab0a79ff.png)

# まとめ

ゲームでPDFの書き出しはあまりやらないかもしれないですが、Unityをゲーム以外の目的で用いている人にとっては便利なライブラリかと思います。
jobs コマンド

# jobs

この記事は [Linux コマンド 全部オレ Advent Calendar 2017](https://adventar.org/calendars/2630) の11日目の記事です。


## プロセスとジョブの違い

プロセス ・・・ OS が管理するプログラムの実行単位
ジョブ ・・・ シェル（bash など）が管理するプログラムの実行単位

ジョブは同じユーザがログインしていても、制御端末が別であれば見れない。

## 使い方

```
## 端末 A
[sinsengumi ~]$ sleep 60 &
[1] 135874
[sinsengumi ~]$ sleep 60 &
[2] 135875
[sinsengumi ~]$ jobs -l
[1]- 135874 Running                 sleep 60 &
[2]+ 135875 Running                 sleep 60 &

## 端末 B
[sinsengumi ~]$ jobs -l ## 別端末のは見れない
[sinsengumi ~]$ ps auxf | grep sleep | grep -v grep
sinsengumi 135874  0.0  0.0 107904   612 pts/0    S    17:27   0:00  |           \_ sleep 60
sinsengumi 135875  0.0  0.0 107904   612 pts/0    S    17:27   0:00  |           \_ sleep 60
```

## 参考

- http://hikotaro.hatenablog.jp/entry/2012/08/05/060038
手軽にScala言語を使ってみる

さてさて、今日は12月12日です。
ご存知の方も多いと思いますが、「**バッテリーの日**」です。

> 日本蓄電池工業会(現在の電池工業会)が1985(昭和60)年に「カーバッテリーの日」として制定。1991(平成3)年に「バッテリーの日」と名称を変更した。
野球のバッテリーの守備位置が数字で1，2とあらわされることから。

ということで？ Javaと仲良さそうなScala言語を。。。

Scala言語（[Wikipediaより](https://ja.wikipedia.org/wiki/Scala)）
> オブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。名前の「Scala」は英語の「scalable language」に由来するものである。

ぶっちゃけ全然よくわかってませんが、Javaいれて、ScalaインストールしたらOKです笑
[公式サイト](https://www.scala-lang.org/)

``` scala
$ scala -version
Scala code runner version 2.12.3 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.
```

LL言語のようにワンライナーも使えるらしい。。
ワンライナーの書式は

```scala
$ scala -e 'プログラム' 引数1 引数2 ...
```


####1. まずはHelloから
```scala
$ slaca -e 'println("Hello")'
```

####2. 引数からもHello
```scala
$ scala -e 'println(args(0))' "Hello"
```

####3. パイプで受ける場合 scala.io.Source.stdin を使うっぽい
```scala
$ ps aux | scala -e 'scala.io.Source.stdin.getLines.foreach(println(_))'
```

####4. リダイレクトもいけた
```scala
$ ps aux | scala -e 'scala.io.Source.stdin.getLines.foreach(println(_))' > ps.txt
```

####5.ファイル読み込みには scala.io.Source.fromFile() らしい
```scala
$ scala -e 'scala.io.Source.fromFile(args(0)).getLines.foreach(println(_))' ps.txt
```

### まとめ
５つほど書きましたが、表示が若干遅いのでScalaでワンライナーやる人いないんじゃないかと思ったり。。

そんなこんなで [2017年下半期注目・将来性が高いプログラミング言語６選](https://tech-camp.in/note/programming/15992/#2017) の中にもしれっと入ってるScalaをよろしく。
Photoshopをエンジニアらしく使う方法

# はじめに

[mixiグループ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/mixi) の13日目の記事です。
「[家族アルバム みてね](https://mitene.us)」というサービスの開発を行っている、@gembafです。
仕事として、Photoshopを使う機会があったので、記事にしてみました。
ちなみに、今回初めて使いました。

## みてね とは

**子どもの成長をいつでも、どこでも、いつまでも**
というテーマの元、スマホで撮った子どもの写真や動画を、簡単に共有・整理できることにより、家族で楽しく会話したり、成長をふりかえることができるアプリです。

# やりたいこと

**大量の画像に対して、Photoshopで色々加工して、いい感じの画像を量産したい** (意訳)

# 問題点

- １つ１つ手でポチポチやっていくの辛すぎ問題
- デザイナさんのリソースを専有できない
  - デザイナさんにはもっと高尚な作業をしてほしい

ということで、こんな仕事はコンピュータにやってもらいました

# 本題

流れとしては以下の通りです。

1. Photoshopでアクションを定義
2. Photoshopでアクションをドロップレット化
3. ドロップレットをスクリプトで実行

今回は、例として`72x72`の画像ファイルを、`24x24`にリサイズしたいと思います。

## Photoshopでアクションを定義

### アクションとは

[アクションの作成および再生方法](https://helpx.adobe.com/jp/photoshop/kb/39.html)(公式)

> アクションとは、Photoshop での一連の作業を記憶しておいて、必要な時に再利用できるようにする機能です。いくつもの作業をその都度メニューから選択して実行する手順を、アクション機能を使用することにより、2、3 のステップで自動的に実行することができます。

### 使い方

詳細については上記の公式ドキュメントを参照してください。

基本的な流れは以下のとおりです。

1. 画像開く
2. アクションの録画開始
3. リサイズ
4. 別ファイルとして保存
5. 画像閉じる(**超重要!!!**)
6. アクションの録画終了

![3662d1f5-6216-4e2f-bd2e-a24c0dbaaf0d-1920x1512r.png](https://qiita-image-store.s3.amazonaws.com/0/152449/e973ef7f-dad7-d34f-837e-bf58b9227e89.png)

これでアクションを定義できました。

ファイルを開いてから、作成したアクションを再生すると、3〜５が実行されます。
ちなみに、5をやっておくと、リサイズが終わった画像は自動でタブが閉じられるので便利です。

ここまではデザイナの方に教えていただきました。

## Photoshopでアクションをドロップレット化

### ドロップレットとは

[ドロップレットの作成方法](https://helpx.adobe.com/jp/photoshop/kb/5772.html)(公式)

> ドロップレットでは、ドロップレットアイコンに画像ファイルやフォルダーをドラッグ＆ドロップすると 1 つのアクションを適用することができます。ドロップレットはデスクトップなどのディスク上に作成でき、実行するアクションの内容は自由に設定することができます。

### 使い方

詳細については(ry

先程作成したアクションをドロップレット化することで、画像をドラッグ&ドロップすると`24x24`にリサイズしてくれるデスクトップアプリ(?)が出来上がります。

<img width="105" alt="スクリーンショット 2017-12-11 18.49.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/152449/4f4a5bf1-8e1b-ae73-a21c-1902a3d49e08.png">

数十枚ぐらいの画像なら、フォルダごとドラッグ&ドロップするだけでリサイズできます。
ただ、大量の画像を一気に与えると、Macが死んでしまうので、もう少し工夫が必要です。

## ドロップレットをスクリプトで実行

最後に、先程作成したドロップレットをスクリプトで実行します。
自分はShell力が足りなかったのでRubyで書きましたが、外部コマンドを実行できればなんでもいいです。

```rb
APP = 'resize24x24.app' # ドロップレットのパス
DIR = 'path/to/72x72' # 対象のパス

# ドロップレットに引数として渡すときは、絶対パスでないと動かないので注意
files = `find \`pwd\`/#{DIR} -type f | grep -v '.DS_Store'`.split(/\n/)

files.each do |file|
  p file
  `open #{APP} --args #{file}` # ドロップレットの実行
  sleep 1 # 優しさ
end
```

コマンドラインからアプリケーションを開くために、`open`を使用しました。

引数として与える画像ファイルのパスは、絶対パスでないとダメらしいので、そこだけ注意が必要です。

後は、ループ毎にPhotoshopへの気遣いを忘れなければ完璧です。
アクションを１回実行して、少し休憩するぐらいの時間を与えてあげましょう。

## 注意点

ちなみに、上記のスクリプトを実行すると、Mac上でフォーカスが取られ続けます。

このスクリプトは、１回のループで、「Terminal」→「Photoshop」というようにフォーカスが遷移します。
そのため、ループの度に(今回なら１秒に１回)フォーカスが移動し続けます。

![12月-12-2017 16-58-41.gif](https://qiita-image-store.s3.amazonaws.com/0/152449/bde05cfe-2965-c815-07db-c9ce66cf5d1f.gif)

めっちゃチカチカします。

帰り際に実行してから退社することをおすすめします。
もちろん、スリープの設定は切っておきましょう。

# おわりに

初めて使いましたが、自動化しようと思えば結構できる部分もあって、意外とPhotoshop便利だなと思いました。

ちなみに、今回みたいな記事をチーム内ドキュメントにまとめてたら、ドロップレット機能の便利さに気づいたデザイナさんが覚醒して、Photoshopマスターになってました。

**デザイナさん「画像ですか？いくらでも量産しますよ」**
pythonで絵文字を駆逐する

データ分析の前処理とかMysqlデータベースとかに入れるときに３時間くらい戦ったので記録を残しておきます。

### 邪魔な奴らのご紹介

🤗
⭕
🤓
🤔
🤘
🦁
⭐
🆗
🆖
🈲
🤐
🤗
🤖
🤑
🆙
⏩

本当に邪魔です。消えてください！🤔 最後のこいつとかなんなんですか！！


### 消す方法１正規表現をつかう

まず最初以下のGithubを参考にして正規表現で試しました。

https://gist.github.com/silverskyvicto/73bc1fb870e0c36b4ab6e1fca7cccd24

大体の奴らは消えたのですが、🤔 こいつとか🤓 こいつとか複数生き残ってました。

### 消す方法2

[emoji](https://pypi.python.org/pypi/emoji/)を使う

```
pip install emoji --upgrade
```

'🤗⭕🤓🤔🤘🦁⭐🆗🆖🈲🤐🤗🤖🤑🆙⏩'こいつらを駆逐しようと思います。

それでは僕が書いたクソコードとご一緒にどぞ(@LouiS0616 さんからアドバイスを頂きました。)

```py
import emoji

def remove_emoji(src_str):
    return ''.join(c for c in src_str if c not in emoji.UNICODE_EMOJI)

emojis = '(｀ヘ´) 🤗⭕🤓🤔🤘🦁⭐🆗🆖🈲🤐🤗🤖🤑🆙⏩'
print(remove_emoji(emojis))

#出力
(｀ヘ´)
```
[ReactNavigation] Tabのタップ時の挙動をカスタマイズする

ReactNavigationを使ってアプリを開発していて、規模がそれなりに大きくなってくると
TabNavigatorやStackNavigatorを組み合わせていくケースがよく出てきます。

組み合わせはいくらでも効くので便利なのですが、
幾つかカスタマイズしていかないといけない部分もあるので、そのあたりを拾ってみんとてします。

  
### 環境
react: v16.0.0,
react-native: v0.50.4,
react-navigation: v1.0.0-beta.21


# タブをタップしたときにinitialScreenに戻る

例えば次のような、2つのStackNavigatorがTabNavigatorの中に入っている画面構成があったとします。

>  MainTabNavigator
　- StackNavigatorA
　　- Screen1
　　- Screen2
 　- StackNavigatorB
 　　- Screen3
　　- Screen4


タブをタップして左右のタブが切り替わるのはもちろんですが、
さらにScreen2にいるときににStackAのタブをタップしたらScreen1に戻るのが期待する挙動でした。
StackBの場合も同様に。
この動作はデフォルトでは備わっていないので、自分で設定する必要があります。

## TabNavigatorConfigの設定

タブをタップしたときの挙動はTabNavigatorConfigのtabBarComponentで設定できるので、
もしタップしたタブが現在のタブと同じで、かつinitialScreenじゃなければ画面を戻るような処理を
jumpToIndex関数内に追加します。

画面をinitialScreenに戻す処理はNavigationActionsによって操作します。
docsは[コチラ](https://reactnavigation.org/docs/navigators/navigation-actions)。

今回の場合はResetActionを行ってから、initialScreenに遷移するような書き方をすれば良いでしょう。

```tabBarComponent.js
 tabBarComponent: (props) => {
  return (
    <TabBarBottom
      {...props}
      jumpToIndex={(nextIndex) => {
        const prevIndex = props.navigation.state.index;
        const prevTab = props.navigation.state.routes[prevIndex];
        const nextTab = props.navigation.state.routes[nextIndex];

        if (prevIndex === nextIndex && prevTab.routes.length > 1) {
          const firstScreenName = nextTab.routes[0].routeName;
          props.navigation.dispatch(NavigationActions.reset({
            index: 0,
            actions: [
              NavigationActions.navigate({ routeName: firstScreenName })
            ]
          }));
        } else {
          props.navigation.navigate(nextTab.routeName); // 通常遷移
        }
      }}/>
  );
}
```

NavigationActionsは覚えていると便利かと思います。


### 開発中に困った部分

上記のように設定すれば良いということはすぐに分かったのですが、
しばらくはなかなかうまく動いてくれないケースがありました。

それはStackNavigatorをReact.Componentに包んで、そのComponentをTabNavigatorの
要素に設定していたとき。Navigatorをそのまま設定しておかないと、
TabNavigatorからStackNavigator内のスクリーンが参照されなくなる（タブのroutes以下にStackNavigatorのスクリーンが存在しなくなる）ためです。

ReactNavigationのdocsに倣って、React.Component内にnavigationOptionsをstaticで宣言しようとして包んでいましたが、Componentを引っ剥がすとちゃんと動いてくれました。


# 他の挙動も同様に

タブをタップしたときの挙動はだいたいjumpToIndex内をいじれば大丈夫なはず。
例えばタップしたときに画面内のFlatListを一番上までスクロールしたい場合は、
FlatListの参照をとって`ref.scrollToOffset({offset: 0, animated: true})` などと書いてあげれば良いです。

これらの挙動はユーザ体験的には行われて欲しいと感じるものだと思うので、
あらかじめ設定しておくと良いかもしれません。
LaravelでSQLをデータベースクエリービルダーを書く時に便利なサイト

#LaravelでSQLを書く時困った

通常のSQL文は書けるが、そのSQLをLaravelのクエリービルダーのコードにした時に、
合ってるのかわからず、とりあえず動かして確認したりしていた。

#Laravel Newsに良さげな記事があった

[Convert Your SQL to Laravel Builder with Orator](https://laravel-news.com/convert-sql-laravel-builder-orator)

どうやら、SQL文をLaravelのクエリービルダーのコードに変換してくれるサイトが出来たらしい。
上記の記事では以下の様な変換される例が載っていた。

```sql:test.sql
select posts.id, posts.title, posts.body from posts
where posts.author_id = 1
order by posts.published_at DESC
limit 10;
```
変換結果がこちら。

```php:result.php
DB::select('posts.id','posts.title','posts.body')
    ->from('posts')
    ->where('posts.author_id', '=', 1)
    ->orderBy('posts.published_at', 'DESC')
    ->limit(10)
    ->get();
```

#実際に使ってみた
実際の変換サイトはこちら
[Convert Your Legacy SQL to Laravel Builder](https://sql2builder.github.io/)

例えばこんなSQL文をLaravelのクエリービルダーに変換してみる

```sql:test.sql
SELECT name, no
FROM   users
WHERE  no = (SELECT no 
                 FROM   users
                 WHERE  name='test');
```
変換結果がこちら。なるほど。

```php:result.php
DB::table('users')
->select('name', 'no')
->where('no','=',function($query) {
	$query->from('users')
		->select('no')
		->where('name','=','test');
})
->get();
```

複雑なSQLの場合の参考に使ったり出来るかも。
Mongoose OSでJavaScript IoT入門 #IoTLT

IoTLT Advent Calendar 12日目です。

## JavaScript IoT
IoT機器に用いられるマイコンは、一般的にはC言語をベースに開発すると思います。これをJavaScriptを使って同等の操作を実現するアプローチを「JavaScript IoT」と呼びます。

「JavaScript IoT」のメリットは、Webエンジニアが手軽にIoTプロトタイピングを始められることです。「組み込みやC言語の知識はないけど、JavaScriptだったらわかる...!」という人にオススメです。

有名どころだと、Johnny-Fiveというロボティクスフレームワークがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/6915f7cb-bbc0-d593-f6f9-0b5334799cff.png)

## Mongoose OSとは
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/6d714fdc-5d7c-2362-2213-e95eeefa7402.png)

簡単に言うと、<b>「IoT開発ボード用のOS」</b>です。
Mongoose OSを使ったIoT開発では、

1. IoT開発ボードにOSイメージを書き込む。
2. Webエディタでコードを書く。
3. ソースコードをIoT開発ボードに書き込む。

の大きく3つのステップがあり、一度OSイメージを書き込んだ後はWebエディタ上でコーディング→コンパイル→IoT開発ボードへのバイナリ書き込みが可能になります。
<b>JavaScriptを使ってコーディングできることが最大の特徴です。</b>

## Mongoose OSが使えるIoT開発ボード
ESP8266, ESP32が載った開発ボードが一般的です。
スイッチサイエンスさんで販売されている「ESPr Developer」が使いやすいのでオススメです。
https://www.switch-science.com/catalog/3210/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/8e3c5e84-f696-ec5a-5bdf-4fdd5fde7da3.png)

## 開発の始め方
### `mos` のinstall
CLIツール `mos` をインストールします。
https://mongoose-os.com/software.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/7707efcb-39e6-c758-97a4-7632d5db7243.png)

### Webエディタの起動
`mos` がインストールできたら、Terminalで `mos` と入力します。すると、ブラウザ上でエディタが起動します。

![4c4ccea3aa9d5fb59e9a78184c8ab516.gif](https://qiita-image-store.s3.amazonaws.com/0/38442/bfb97dbe-7e3c-ec85-3eba-8f802a0c2294.gif)

### デバイスのセットアップ
エディタ起動時に、

- デバイスの接続
- OSイメージの書き込み（初回のみ）
- WiFiへの接続

を行います。すべてブラウザ上でセットアップできるので順番に進めていきましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/13e48425-4b30-b1b3-c6d9-f976c1432b97.png)

### コーディング
セットアップが成功したら `Device Status` が `online` に変わり、コーディングが可能な状態になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/7d4a0a4d-036e-ae2c-14be-da8582157654.png)

基本的に `init.js` を編集します。
例えば「タッチセンサーをタップしたら、Touched!!とコンソール出力する」というだけの単純なプログラムは、以下のようになります。（不要なloadがあるので、実際はもう少し短いコードになります。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/91bba5b0-46db-d357-0ad4-1d40ad1544e9.png)

## AWS IoTとの連携
Mongoose OSは、AWS IoTとの連携を公式にサポートしています。
https://mongoose-os.com/docs/cloud_integrations/aws.html

これに関しては @1ft-seabass さんの https://www.1ft-seabass.jp/memo/2017/07/30/mongoose-os-espr-developer-32-aws-iot-connect/ が詳しかったのですが、最近Mongoose OS側の仕様が変わったようです...。
新しい方法について検証中なので、また後日このエントリをアップデートしたいと思います。

## 資料
先日、<a href="https://javascript-fes.doorkeeper.jp/events/66335">JavaScript祭り</a>でMongoose OSについてLTしました。こちらもぜひご覧ください。
発表スライド: https://speakerdeck.com/shanonim/iot-with-mongoose-os-and-ifttt

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/1f988106-06d8-ad50-5e9c-eff7b57b65fa.png)

## 参考リンク
- Mongoose OSでESPr Developer 32をAWS IoTにつなげるメモ  
https://www.1ft-seabass.jp/memo/2017/07/30/mongoose-os-espr-developer-32-aws-iot-connect/
- Mongoose OSをESP32で使ってみた  
https://www.lancard.com/blog/2017/09/29/mongoose-os%E3%82%92esp32%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/
- Mongoose OSを使ってESP8266モジュールでIoTボタンを自作してみた  
https://dev.classmethod.jp/cloud/aws/mongooseos-my-iotbuttom/
PeekPopの3DTouchを実装する方法

##はじめに
Peek、Popを実装した時のメモです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/89206/c237c495-bf6d-c8ca-2da5-0e0174cfbe0b.gif" width="200">

##PeekとPop

###Peekとは？

弱く押し込んだ時のイベントです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/89206/d21052f9-0e76-a508-886b-671cf1936a52.gif" width="200">

###Popとは？

Peekからさらに強く押し込んだ時のイベントです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/89206/d7bdcc66-cf03-4d81-89c7-5bbbe6f53162.gif" width="200">

### 実装方法

#### 1、registerForPreviewing

PeekとPopするviewを`registerForPreviewing `で有効にします。

```ruby:Swift
registerForPreviewing(with: self, sourceView: tableView)
```

### 2、UIViewControllerPreviewingDelegate

Peekした時に`previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint)`が呼ばれます。
Peekで表示するViewControllerをここで返します。

Popした時に`previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController)`が呼ばれます。
Peekしていた時のViewControllerが`viewControllerToCommit`になります。

```ruby:Swift
extension ViewController: UIViewControllerPreviewingDelegate {
    // Peek
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        guard let indexPath = tableView.indexPathForRow(at: location) else {
            return nil
        }

        return SecondViewController(indexPath: indexPath)
    }
    
    // Pop
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        self.navigationController?.pushViewController(viewControllerToCommit, animated: true)
    }
}
```

##Peek quick actions

###Peek quick actionsとは？

Peekして上にスワイプすると出てくるショートカットメニューです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/89206/a10386de-2cf8-70c8-512b-62ce3df4a289.gif" width="200">

### 実装方法

遷移後のViewControllerの`previewActionItems`をoverrideして実装します。

```ruby:Swift
    override var previewActionItems: [UIPreviewActionItem] {
        let edit = UIPreviewAction(title: "編集", style: .default) { _, _ in
            print("編集をタップ")
        }

        let delete = UIPreviewAction(title: "削除", style: .destructive) { _, _ in
            print("削除をタップ")
        }

        return [edit, delete]
    }
```

##GitHub
https://github.com/hideyukitone/PeekPopSample

##参考
https://qiita.com/takashings/items/ead3e9d935c2108d55a7
Julia Examples を作りたい 

[Julia Advent Calendar 2017](https://qiita.com/advent-calendar/2017/julialang) 13日目です。
Juliaの例題を集めたデータベース Julia Examplesを作りつつある件を記します。
Julia言語そのものには、あまり関係ない話題で、スミマセン。

# TEXample のようなものを作りたい

Julia と Jupyter notebookは、ほぼ毎日のように書いていて、たくさんの Notebookが溜まっていきます。これらを整理して、見たいNotebookをすぐに探し当てられると嬉しいです。
私がイメージしているのは、[TEXexample.net](http://texample.net/tikz/examples/feature/plotting/) です。TeX/LaTeXのタイプセット結果がサムネールで表示されて、タグ (feature)で分類されています。TeXソースや実行結果PDFも、各ページに集約されています。

[![Screenshot from Gyazo](https://gyazo.com/e3a6fd58177922e1a421ffecd1dac8cd/raw)](https://gyazo.com/e3a6fd58177922e1a421ffecd1dac8cd)

# Scrapboxを使おう

[昨日紹介した　Scrapbox](https://qiita.com/tenfu2tea/items/b35f0363988819674540#scrapbox%E3%81%AB%E8%BC%B8%E5%87%BA%E3%81%97%E3%81%9F%E3%81%84)は、複数人でリアルタイムに編集できるWikiです。

例として、classical Thunderbirds の型式分類データベースを下に載せます。( 元ネタ 
[＠kishimen_ksmn](https://twitter.com/kishimen_ksmn)さんに感謝です。)

https://scrapbox.io/ModelsOfThunderbirds
<img width="349" alt="スクリーンショット 2017-12-10 11.43.20.png" src="https://gyazo.com/d6ca38ce4ce6ad64f3d7cfb0d78375af/raw">

Scrapboxでは、各ページ中のタグやリンクを手がかりに、関連する複数のページが整理されて表示されます。
例えば、↓ こんな風にすると、Thunderbird 2の関連ページが列挙されます。
https://scrapbox.io/ModelsOfThunderbirds/The_Models_of_Thunderbird_2

自分で TeXampleを作らなくても、Scrapboxが使えそうです。

# JupyterToScrapbox を用意した

Scrapboxへの入力ファイルとして、Jupyter notebookを元にできると嬉しいです。
Jupyter Notebookから Scrapbox輸入用のJSONを生成するツール JupyterToScrapbox を、[昨日の Jupyter Advent Calendar 2017](https://qiita.com/tenfu2tea/items/b35f0363988819674540#jupytertoscrapbox%E3%81%AE%E7%B4%B9%E4%BB%8B)で紹介しました。 Notebook内の画像も取り込むことができます。

# Julia Examples は、作り始めたばかりです。

https://scrapbox.io/JuliaExamples

自分の関心があっても、一般性を持たせるのは難しいですね。
少しづつネタを増やして行きたいと思っています。
pythonで自分のtweet/埋め込みコードを取得する

#はじめに
Twitterで自分がつぶやいているtweet/その埋め込みコードを取得するスクリプトを記載したいと思います。
自分のTweetやシェアした情報を外部アプリに載せたい時に使えます。

#Python Twitter Tools
[こちらの記事](https://qiita.com/hirohuntexp/items/f07fd27aa36c6ceab1e6)に、python twitter toolsの使い方を記載しています。同じように

```python

t = Twitter(auth=OAuth(
        <access token>,
        <access token secret>,
        <consumer key>,
        <consumer secret>
    ))
```

でTwitterクラスを作ります。
このクラスを使って色々とTwitterのデータを取ることができるようになります。

#自分のtweetを取得
Twitter APIの　`GET statuses/user_timeline`で自分のtweetを取得することができます。Python Twitter Toolsでは以下のように書くことができます。

```python
tweets = t.statuses.user_timeline(count= 200,exclude_replies = True, include_rts = False)
```
GETの際のパラメータ指定は[こちら](https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline)を参照してください。
ここでは、tweetを200個取得・リプライ/リツイートを除外しています。

#埋め込みコードの取得
tweetの埋め込みコードを取得するためには`GET statuses/oembed`を叩きます。
しかしこれを叩く際には`tweetのurl`が必要となります。
なので上のコードを使って`tweetのurl`を取得して、それを`GET statuses/oembed`に貼り付けましょう。
コードは以下のようになります。

今回は"fizzbuzz"という文字列を含むtweet、本日tweetされた、という２つの条件を満たしてるtweetのurlを取得しています。
ちなみにtweetのurlは`https://twitter.com/<your twitter id>/<tweetのid>`で構成されます。

```python

def get_today_ids(t):
    target_ids = []
    for card in t.statuses.user_timeline(count= 200,exclude_replies = True, include_rts = False):
        if is_today_tweet(card) and ("fizzbuzz" in card['text']):
            target_ids.append(card['id'])

    return target_ids

def get_today_embed():
    my_url = "https://twitter.com/<twitter id>/status/";
    embed_list = []
    for id in get_today_picks_ids(t):
        embed_list.append(t.statuses.oembed(url=my_url + str(id))['html'])

    return embed_list
```

これで条件を満たしたtweetの埋め込みコードが取得できました。

#終わりに
今回取得できたデータを元に、tweetの管理を別のアプリで実装できるようにしたいと思います。

#参照
[Twitter API: Get Tweet timelines](https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline)
[Twitter API: retrieve and engage with Tweets](https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/get-statuses-oembed)
Expressを使ってローカルでのAPIテスト環境をサクッと作るための備忘録

JSONを返してくれるだけのREST APIを想定して何か作る時によくやるので、備忘録程度に書いておきます。
(「サクッと」には個人差・routing設定の複雑さによって誤差が生じます。ご了承ください。)

## こんな人ならさくっと書きやすい

- JSはわかるけど、APIの設定とかルーティングとかはRailsのをみたことあるなーくらいの人
- Node.jsを知っている人


## Expressとは

[Express](http://expressjs.com/)
Node.js上で動作するフレームワークです。
HTTPサーバーとして使ったりAPIのルーティング設定したりなど、使われる用途は幅広(印象)です。


## API仕様

```
## END_POINT
http://localhost:4000/api/v1

## GET: /members
全メンバーデータを取得

## GET: /members/:id
idに対応したメンバーを取得
```

## ディレクトリ作成+npm init

まずは

```
mkdir api-test
cd api-test
```

```
yarn init
```

Enter押しまくり(`-y`とかで全部yesでできたかも)


## npm modulesを追加

元のJSONデータから整形したものを渡す想定で、 `lodash` と `read-config` を入れています。

```
yarn add express lodash read-config -D
```


## index.js作成

```js
const express = require("express")
const lodash = require("lodash")
const readConfig = require("read-config")

const router = express()

const rawData = readConfig("./data/members.json")

const END_POINT = '/api/v1'

router.use(setJSON)

// responseのcontentTypeは全部JSONでいいのでmiddlewareで設定しておく
function setJSON(req, res, next) {
  res.contentType("application/json")
  next()
}

// idに対応したメンバーを取得
router.get(`${END_POINT}/members/:id`, (req, res, next) => {
  console.log(`get id ${req.params.id} data`)
  const data = _.filter(rawData, (i, elm) => Number(elm.id) === req.params.id)
  res.send(data)
})

// 全メンバーデータを取得
router.get(`${END_POINT}/members`, (req, res, next) => {
  console.log("get all data")
  const data = rawData
  res.send(data)
})
```

## よくやるルーティング設定の方法


### URLの文字列を値として使う

ルーティングパスに `:id` のようにコロンをつけると、 `req.params` に `{id: 数字}` が格納されます。

```js
router.get(`${END_POINT}/members/:id`, (req, res, next) => {
  console.log(req.params) // {id: '1'}
})
```


### GETなどのクエリパラメーターを使う

`req.query` に入ってます。

```js
router.get(`${END_POINT}/members`, (req, res, next) => {
  console.log(req.query) // {name: 'taro'}
})
```

### 同階層でも、数値のときと文字列のときでルーティングを変える

各 `req.params` で設定されてる変数は、正規表現によって範囲が制限できます。

```js
// 数字
router.get(`${END_POINT}/members/:id(//d+)`, (req, res, next) => {
  console.log(req.params) // {id: '1'}
})

// 任意の文字列
router.get(`${END_POINT}/members/:name([a-zA-Z]+[a-zA-Z0-9])`, (req, res, next) => {
  console.log(req.params) // {name: 'taro'}
})
```

また、ルーティングの設定は書いたものが早いほど優先される(要確認)ので、404などを表示したい場合は一番下に書くとよさそうです。