OmniAICreator/Qiita-1.07M huggingface dataset:
Markdownに関するメモ書き

「この記事の概要」
いろいろ調べたことのメモ書き、後半はいろいろな記法のお試し。
主な記法などはヘルプを見たほうが詳しいでしょうね。

##Markdownを一言で言うと？
軽量マークアップ言語の一種。
軽量の意味合いとしては、
人間がテキストエディタなどで簡単に書けるレベルということ。

##これを使うと何が便利なの？
プレーンテキストを書く感覚でHTMLのように装飾ができる。
短時間でわかりやすい文書の作成が可能ということ。

##1.主な記法（レイアウト）

\#見出し
下線を引いた見出しのように装飾できる、#の数を増やすことで色々変わるみたい。

\- リスト
箇条書きのように装飾できる、スペースを入れれば階層表現も可能

-　こんな感じ
　-　階層

\- [ ] チェックボックス
下記のようなチェックボックスも可能、
Qiitaに投稿するような記事ではどのような使い方をするのだろうか。。。

- [x] チェックボックス
- [ ] チェックボックス

##2.主な記法（装飾）
\**太字**
こんな感じ→**強い**

\*斜体*
*シャレオツに斜めもできる*

\~~取り消し~~
~~取り消し線もできる、すごいね~~

\`インライン、つまりは背景色をつけるってことね`

`こゆことね`

##3.その他
\Markdownの無効化
\バックスラッシュで無効化できる。macではoptionと¥の同時押しで入力できる。
※mac使い始めて１週間目で初めて知りました。
webpack.configをTypeScriptで書く

[参考記事](https://medium.com/webpack/unambiguous-webpack-config-with-typescript-8519def2cac7)

TypeScriptでフロント書く機会もちょっとずつ増えてきている感があります。きっとWebpackでバンドル、というのが一般的なのではないでしょうか。

上記参考記事にもありますが、Webpapckの設定ファイルを書いていると、バージョン1と2の両方の書き方を混在させることができて混乱の元です。いちいちここのセクションはどんなキー名だったっけ？ 配列だっけ？ハッシュだっけ？となってドキュメントを行ったり来たりすることが多いかと思います。

このWebpackの設定ファイルもTypeScriptならコード補完やエラーがあればすぐに指摘してくれてもっと快適なんだけどなぁ、と感じたことのある人はきっと少なくないと思います。

これが実は特に面倒なことをせずともできる、というのでやってみました。

ファイル構成はこんな感じです。

```
.
├── dist
├── node_modules
├── package.json
├── package-lock.json
├── src
│   └── app.ts
├── tsconfig.json
└── webpack.config.ts
```

## npmパッケージのインストール

```shell-session
$ npm i -D webpack typescript ts-node ts-loader @types/webpack
```

ts-nodeがポイントです。これはTypeScriptコードを直接nodeで実行したりREPLできるツールです。
[https://github.com/TypeStrong/ts-node](https://github.com/TypeStrong/ts-node)

## webpack.config.ts を用意

通常であれば、webpack.config.jsを用意するところですが、TypeScriptなので拡張子を.tsにします。
とりあえずシンプルにこんな感じにしてみました。

```ts:webpack.config.ts
import * as webpack from "webpack";
import * as path from "path";

const rules: webpack.NewUseRule[] = [
    {
        test: /\.ts$/,
        use: "ts-loader",
    }
]

const module: webpack.NewModule = {
    rules: rules
};

const config: webpack.Configuration = {
    entry: "./src/app.ts",
    output: {
        filename: "bundle.js",
        path: path.resolve(process.cwd() + "/dist")
    },
    module: module
};

export default config;
```

rulesやmoduleを切り出しているのは、Webpack2のフォーマットで書くことを明示するためです。試してみるとわかりますが、殆どの型がバージョン1の型にも対応させるためにユニオン型になっています。コード補完の恩恵を受けるためにも変数に切り出して宣言の際に型を明示させている、という次第です。

## Hello World（TypeScript)

```ts:src/app.ts
class HelloWorld {
    say(): void {
        console.log(`Hello World!!`);
    }
}

let hw = new HelloWorld();
hw.say();
```

## webpack実行

```shell-session
$ webpack
```

## 生成されたJSを実行

```shell-session
$ node dist/bundle.js

# => Hello World!!
```

ts-nodeを入れるのと、拡張子をTypeScriptにするだけです。あ、あとwebpackの定義ファイルも。

特にトリッキーなことをせずとも簡単にできてしまいます。

次にTypeScript案件をやるときはこうしよう、と思いました。
ま、一度完成させてしまえば、あとはそんなに手間ではないのでどうしてもTypeScriptじゃなきゃだめってことはないんですけど。
Cloud SDKを対話型コンソール or バージョン管理アーカイブでfishにインストールする

# ターゲットと目的
gcloudコマンドをfishから操作したいけど、どう設定したら良いのかわからない！ってなった自分向け。

# 前提条件
- fishがインストール済み


# 手順

## gcloudを対話型コンソールでインストール
[公式ドキュメント](https://cloud.google.com/sdk/downloads)に従って対話型コンソールでインストール。

```
$ curl https://sdk.cloud.google.com | bash
```

実行するとインストール先のパスの確認などが入るが適宜自分好みに入力していく。
今回はホームディレクトリ直下に配置する。

デフォルトのshellをみてくれているのか、最後に`config.fish`へ設定を追記するかの確認が出るのでそのままエンターを押すことでパスを通してくれた。

```
> [/Users/{ホームディレクトリ}/.config/fish/config.fish]:
```

実行結果

```
Backing up [/Users/{ホームディレクトリ}/.config/fish/config.fish] to [/Users/{ホームディレクトリ}/.config/fish/config.fish.backup].
[/Users/{ホームディレクトリ}/.config/fish/config.fish] has been updated.
```

config.fishに以下の内容が追記される

```
# The next line updates PATH for the Google Cloud SDK.
if [ -f '/Users/{ホームディレクトリ}/google-cloud-sdk/path.fish.inc' ]; if type source > /dev/null; source '/Users/{ホームディレクトリ}/google-cloud-sdk/path.fish.inc'; else; . '/Users/{ホームディレクトリ}/google-cloud-sdk/path.fish.inc'; end; end
```

## バージョン管理アーカイブでインストール
もう一つのインストール手段としてバージョン管理アーカイブがある。こちらは特定のバージョンでCloud SDKを使いたい場合のインストール手段。
こちらでは記述時点のバージョン（145.0.0）ではpath.fish.incが無い。なのでedc/bassを使ってpath.bash.incを使って解決する方法を記述する。

### バージョン管理アーカイブでインストールする手順書の前提条件
- fisherman、fundleで[edc/bass](https://github.com/edc/bass)をインストール済みである（リンク先にインストール手順があります）
- 使用バージョンは145.0.0
- インストール対象ディレクトリは同様にホームディレクトリ直下(慣れてる人は適宜好きなディレクトリに置いて、手順を読み替えて下さい)
- wgetがインストール済み
- 今回は`.config/fish/config.fish`に設定を追記します。

### バージョン管理アーカイブインストール手順
[公式サイトリンク](https://cloud.google.com/sdk/downloads?hl=ja#versioned)から対象バージョンをダウンロードしてホームディレクトリ直下に解凍する。

#### ダウンロード
例としてMac版145.0.0を使用します。

```
$ wget 'https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-145.0.0-darwin-x86_64.tar.gz'
```

#### 解凍
```
$ tar -xzf google-cloud-sdk-145.0.0-darwin-x86_64.tar.gz
```

#### インストーラーを起動
```
$ cd google-cloud-sdk
$ ./install.sh
```

対話型コンソールと同様に色々確認が入るが適宜エンターを押していく。

最後に.bash_profileへパスの追記確認が入るのでエンターを押す。

#### fishにパスを通す
上記までの手順でbashにパスが通ったが、fishにはまだパスが通っていない。
fishのコンフィグに追記する

```
vi ~/.config/fish/config.fish
```

.bash_profileに通されているパスの記述を参考にしつつ以下のように`.config/fish/config.fish`に追記する

```
bass source '/Users/{ホームディレクトリ}/google-cloud-sdk/path.bash.inc'
bass source '/Users/{ホームディレクトリ}/google-cloud-sdk/completion.bash.inc'
```

edc/bassのおかげでbashの設定を使うことができる。

これで設定を読み直せばgcloudコマンドが使えます。

```
$ gcloud
```
APIについてのお勉強1


## OAI

Swagger が OpenAPI にリネームされて Open API Initiative が誕生してた
https://r2.ag/swagger-to-openapi/

https://github.com/yvasiyarov/swagger

RESTful APIの記述標準化を目指す「Open API Initiative」をマイクロソフト、Google、IBMらが立ち上げ。Swaggerをベースに － Publickey
http://www.publickey1.jp/blog/15/open_api_initiative.html

Tony Tam氏に聞く- Open API InitiativeとSwaggerの最新情報
https://www.infoq.com/jp/news/2016/02/tony-tam-oai-initiative-swagger

> OAI仕様は既存のSwagger仕様と差別化するために大きな変更を導入する予定である，とお答えします。Swagger仕様とは違うものになるでしょう。
> ツールとオープンソースソフトウェアのSwaggerエコシステムは今後もSwaqgerという名称で，これまでどおりオープンで中立であり続けます。準備ができれば，OAI仕様もサポートする予定です。

OpenAPI Specification 3.0での変更点について | NTT Communications Developer Portal
https://developer.ntt.com/ja/blog/fbb1636b-b3f8-47b9-ac7c-9080a5d9e7ae

> 基本的には構造が変わるとのことで、これに合わせてSwagger用のツールも変更が求められるでしょう。構造的には分かりづらい部分も多かったので、3.0によって全体の見通しが良くなったように感じられます。

おー、すごい。いろいろぱっと見でわかる改良。swaggerにも影響か。。
まだまだ変化が激しいってことかな。。嬉しいような面倒なような。

オープンAPIとOpen APIととWeb APIとREST APIの違い。 - 自分の仕事を憎むには人生は余りにも短い
http://garapon.hatenablog.com/entry/2016/10/25/_%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3API%E3%81%A8Open_API%E3%81%A8%E3%81%A8Web_API%E3%81%A8REST_API%E3%81%AE%E9%81%95%E3%81%84%E3%80%82

呼称の紛らわしさ。

## アプリインフラ

APIの手前にAPI Gatewayを挟むのね。綺麗だなあ。
swaggerファイルを吐き出すパッケージにも言及。

マイクロサービスのための綺麗なAPI設計 | Wantedly Engineer Blog
https://www.wantedly.com/companies/wantedly/post_articles/32977
Javaで素数を計算


何の工夫もないシンプルな方法ですが、１時間ほど回すだけで7978889という素数が得られるなど、なかなか面白いです。

```java
package sosuu;

public class ListSosuuMain {

	public static void main(String[] args) {
		for (int n = 0; n < Integer.MAX_VALUE; n++) {
			if (isSosuu(n) == true) {
				System.err.println(n);
			}
		}
	}

	public static boolean isSosuu(int n) {
		for (int m = 2; m < n; m++) {
			if (n % m == 0) {
				return false;
			}
		}
		return true;
	}
}

```
golangのお勉強8


言語の思想を学ぶことを頭の片隅に置いてみるのもいいか。

## 継承がないことについて

Goに入門してRedis+PostgresなアプリをHerokuにデプロイするまで | WEB EGG
http://leko.jp/archives/763

C++プログラマ向けGo講座 - golang.jp
http://golang.jp/go_for_cpp_programmers


Go言語(Golang) はまりどころと解決策
http://www.yunabe.jp/docs/golang_pitfall.html

> そもそも継承はプログラミング言語にあまり必要ない機能だと思います。 
> リスコフの置換原則のような基本的な原則が守られておらず(そもそも多くの人は名前すら知らない)、
> 単に一部のコードをクラス間で共有するために継承が使われていて可読性が著しく低いコードもよく目にします。 

Goのアンチパターン - GolangRdyJp
http://golang.rdy.jp/2016/07/26/antiptn/

	言語の設計思想などと説明したりしてて分かりやすい。

FAQ - golang.jp
http://golang.jp/go_faq

	公式の翻訳。この辺をちゃんと調べつつ読み込むと勉強にはなりそう。

仕事の言語に飽きてきた人はGoを使ってみてほしい――『スターティングGo言語』著者が語るGoのパワー：CodeZine（コードジン）
https://codezine.jp/article/detail/9359

> 迷いつつですが、たとえば序盤のほうでGoの型や演算子の挙動について、かなり細かく書いてみました。PHPやRubyといったスクリプト言語を主に使っている若い方だと、このあたりの知識が抜け落ちていると経験的に感じたからです。せっかく新しい言語を学ぶのですから、型や演算子についてのプログラミングの基礎を復習してもらいたいと思います。

### JSでの継承なしのプログラミング

PACアーキテクチャーをつかうパターンを試行してる。
なるほど。でも、具体的にはまだよくわからない。
綺麗に役割分担すればPACの単位で大抵は重複なく実装可能ということなのかどうなのか。
IDEの支援を想定するということは静的解析により依存したコーディングということかしら。
この辺のことをgolangは解決する面があるということか。。

JavaScriptで継承を使わないプログラミングスタイル | Engineer Log
https://engineer-log.net/index.php/2017/05/01/post-1570/

JavaScriptはプロトタイプベースのオブジェクト指向プログラミング言語ではない！？ | Engineer Log
https://engineer-log.net/index.php/2017/05/01/post-1569/

## Goのオブジェクト指向

なるほど、DDDで聞いたような、細かい粒度のオブジェクトと同じようなことが構造体で実装されるということかな。
それは綺麗だけど大変さはないのか。。
（オブジェクトのリレーションを概念的にどう考えるのか。）
（エンティティとか値オブジェクト的なものを構造体に表現できるのか。）
これは「継承をやめてtraitばっかりにしたよ」とは違うことかしら。

Goはオブジェクト指向言語だろうか？ | プログラミング | POSTD
http://postd.cc/is-go-object-oriented/

> Goはあえて継承の機能を持たない設計になっています。しかしオブジェクト（構造体の値）が関係を持たないということではありません。Goの開発者は、継承ではなく、関係を表現する別の仕組みを用いるという選択をしたのです。初めてGoを使う場合などは、このせいでGoが使いにくくなっていると思う人も多いかもしれません。しかし実際には、これはGoの最も優れた特性の1つであり、十数年も前から続いている継承に関する問題や議論を解決するものなのです。

オブジェクト指向言語としてGolangをやろうとするとハマること - Qiita
http://qiita.com/shibukawa/items/16acb36e94cfe3b02aa1

> Golangも基本的にそのような思想のようです。相手が決まっている場合は、インタフェースとか関係ありません。埋め込みはあくまでも「名前なしでアクセスできるメンバー変数」というシンタックスシュガーと考えるべきです。

## 実際の実装の形で良さそうだなと思ったやつ

Goに入門してRedis+PostgresなアプリをHerokuにデプロイするまで | WEB EGG
http://leko.jp/archives/763

gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin.
https://github.com/gin-gonic/gin

## swaggerとの連携

docbookからドキュメントファイルを吐き出すパッケージがあるみたい

golangの開発で使っている色々 - Qiita
http://qiita.com/katsutomu/items/c72d0a7f9d95b7697ef8

yvasiyarov/swagger: Swagger client generator
https://github.com/yvasiyarov/swagger

wantedly/apig: Golang RESTful API Server Generator
https://github.com/wantedly/apig

## 所感

やっぱり速さが売りで、複雑な継承はLLとはちょっと違って、
丁寧にコストをかければ、たぶん固く組めるけど大変なところもあるかも。
genericは実装しようかなとは思われてる。
くらいか。
コンパイラ(gcc)の最適化による無限ループの罠と回避

# はじめに
Linux カーネルのモジュール作成時に、コンパイラの最適化が影響して while が意図せず無限ループになってしまったことの現象と対処の紹介

# 現象

以下のコードは、void *p に 0 以外の数字が書かれるとループを抜けることが期待値です。
(説明上の都合で noinline を書いています)

``` c:
static void noinline wait_for_update(void *p)
{
        volatile unsigned long number;

        do {
                number = *(unsigned long *)p;
        } while (number == 0);
}
```

このコードを含むカーネルモジュールを作成して、いざモジュールを動かすとシステムがハングしちゃいました。メモリダンプを見てみると、上記のループを抜けないことが原因のようです。*p を更新する別のカーネルスレッドが動いていないことを考えましたがどうも動いているようです。

そこで、上記のコードをディスアセンブルしてみると、衝撃の事態が・・・

```
0000000000000000 <wait_for_update>:
   0:   e8 00 00 00 00          callq  5 <wait_for_update+0x5>
   5:   55                      push   %rbp
   6:   48 89 e5                mov    %rsp,%rbp
   9:   48 83 ec 08             sub    $0x8,%rsp
   d:   48 8b 17                mov    (%rdi),%rdx
  10:   48 89 55 f8             mov    %rdx,-0x8(%rbp) ★ ここから
  14:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  18:   48 85 c0                test   %rax,%rax
  1b:   74 f3                   je     10 <wait_for_update+0x10> ★ ここ
  1d:   c9                      leaveq 
  1e:   c3                      retq   
  1f:   90                      nop
```

なんということでしょう！オフセット 0x10 から 0x1b のループになっているではありませんか！これでは *p を更新したことを気がつけず、無限ループしちゃいます。
オフセット 0xd で *p の更新を確認しているので、ループの期待値は 0xd から 0x1b です。

``` :pの更新確認
   d:   48 8b 17                mov    (%rdi),%rdx
```

# 原因

コンパイラ(gcc)が最適化したことが原因です。p はローカルスコープで、更新するコードは無いから最初に一回だけ参照すればいいよね、とコンパイラさんは判断したんですね。
カーネルモジュールをコンパイルする時はデフォルトで最適化オプション(-O2)が付きます。

# 対処

最適化をしないようにするため、volatile をつけてみます。

``` c:volatileあり
static void noinline wait_for_update(void *p)
{
        volatile unsigned long number;

        do {
                number = *(volatile unsigned long *)p;
        } while (number == 0);
}
```

そうすると、期待通りのループになりました。

``` volatileあり
   d:   48 8b 07                mov    (%rdi),%rax ★ここから
  10:   48 89 45 f8             mov    %rax,-0x8(%rbp)
  14:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  18:   48 85 c0                test   %rax,%rax
  1b:   74 f0                   je     d <wait_for_update+0xd> ★ここ
  1d:   c9                      leaveq 
```

# 補足 無限 jmp 地獄

ちなみに、以下のように number 変数にすら volatile をつけないと、

``` c:volatile無し
static void noinline wait_for_update(void *p)
{
        unsigned long number;

        do {
                number = *(unsigned long *)p;
        } while (number == 0);
}
```

以下のように無限 jmp 地獄に落ちることになります。これであなたも A 級ジャンパー

``` :無限jmp地獄
0000000000000000 <wait_for_update>:
   0:   e8 00 00 00 00          callq  5 <wait_for_update+0x5>
   5:   48 83 3f 00             cmpq   $0x0,(%rdi)
   9:   55                      push   %rbp
   a:   48 89 e5                mov    %rsp,%rbp
   d:   75 02                   jne    11 <wait_for_update+0x11>
   f:   eb fe                   jmp    f <wait_for_update+0xf> ★ここ！
  11:   5d                      pop    %rbp
  12:   c3                      retq   
```
Rでpolygon（図形）のみのplot

# Rで描く図形
通常、Rでは`plot`を行うと以下のように目盛りや基準数値が付属する。
![Rplotsyoukai01.png](https://qiita-image-store.s3.amazonaws.com/0/188393/76b834af-1043-0ac2-3462-fce236e97bce.png)


通常の使い方で、グラフなどを描画する際は欠かせない表示だ。
しかし、これでは「単なる図形」を出力したい時、美しくないと思う方も居るかもしれない。少なくとも私はそうだ。
この問題は`plot`関数に以下の引数を与える事により解消される。

```r:plot
plot(x, y, xlab=" ", ylab=" ", xaxt="n",yaxt="n")
```
![Rplotsyoukai02.png](https://qiita-image-store.s3.amazonaws.com/0/188393/c7c6d85f-8a95-2dcd-db7a-8b121921cc24.png)

### まっさらな描画
`xlab=" "`，`ylab=" "`はそれぞれ「x 座標名， y 座標名を与える文字列を指定する」引数に空白を与えたものである。
x 座標名， y 座標名とは一つ目の画像でいえば「０」だ。ここに`" "`を与える事で、外見上消した。

`xaxt="n"`，`yaxt="n"`はそれぞれ「軸を描くか否かを指定する」引数に書かないという指示を与えたものである。
両方に"n"を入れた時と似たような動きをするという引数`axes = F`も試す事にする。
![Rplotsyoukai03.png](https://qiita-image-store.s3.amazonaws.com/0/188393/0f7614eb-33c8-78f2-587d-79bfc503b24a.png)
……枠すら、消えた。何事も実験してみるものである。

## タイトルと描画
図形だけ出力された`plot`も美しいが、少し物足りない。
よってタイトルを表示させようと思う。

```r:plot
plot(x, y, main = "Sierpinski gasket", xlab=" ", ylab=" ", xaxt="n",yaxt="n")
```
![Rplotsyoukai04.png](https://qiita-image-store.s3.amazonaws.com/0/188393/04420b6e-ad25-78e9-aa18-540a3b8a50c4.png)
`main = ""`で表示させる文章を指定している。
今回表示させた文章は、先ほどから表示している図形「シェルピンスキーのギャスケット」だ。
個人的に好きなフラクタル図形なので、サンプルに表示した。

#### おわりに
いかがだっただろうか。Rの本来の使い方、統計解析ではまず使わないだろうこの機能。
しかし、Rの幅広い可能性を垣間見る事ができたと思う。
SlackのRTMをClojureで利用する

ClojureではRTMを利用した便利なSlackBotフレームワークがありません(あったら教えてください)。そこで、ClojureでRTMを利用するために[clj-slack-client](https://github.com/tonyvanriet/clj-slack-client)を利用しました。本家サイトには使い方がのっていないので、ちょっと動かしてみたので紹介します。

# SlackのRTMとは
RTMとは[Real Time Messaging API](https://api.slack.com/rtm)のことで、SlackのWebSocketベースAPIです。RTMを使うことでSlackのイベントを監視し、メッセージの受信や送信をリアルタイムで行うことができます。

# ClojureでRTMを利用
## 準備
### Slack側
[ここ](https://api.slack.com/bot-users)を参考に以下のリンクからslackBotを作成し、トークンそ取得します。
https://my.slack.com/services/new/bot

### Clojure側
まず、プロジェクトを作ります。

```
lein new project_name
```

次に、project.cljを変更します。

```project.clj
:dependencies [[org.clojure/clojure "1.8.0"]
               [aleph "0.4.1"]
               [clj-slack-client "0.1.6-SNAPSHOT"]]
:main project_name.core
```

`:dependencies`に`aleph`と`clj-slack-client`を追加します。`aleph`は`clj-slack-client`の中で利用されていますが、`clj-slack-client`でのバージョンにバグがあるので、追加しています。
また、エントリーポイントを設定するために`:main`を追加します。

## RTMの利用
以下のコードでRTMを試すことができます。

```src/project/core.clj
(ns project_name.core
  (:require
    [clj-slack-client.core :as slack]))

(defn handle-slack-event
  [event]
    (println "event:" event))

(defn -main
  [& args]
  (slack/connect "API Token" handle-slack-event)
  (println "bot running...")
  (loop []
    (println "...")
    (Thread/sleep 5000)
    (recur)))
```

`(slack/connect "API Token" handle-slack-event)`とすことでslackでイベントが起きたとき`handle-slack-event`を呼び出すようになります。また、引数にはslackでのイベント内容が入力されます。


## 実行

```
$ lein run
```

で実行します。
botがいるチャンネルに'test'と入力すると以下のよう':text test'が含まれた出力がされます。

```
bot running...
...
{:type user_typing, :channel xxxxxx, :user xxxxxx}
event: {:type user_typing, :channel xxxxxx, :user xxxxxx}
{:type message, :channel xxxxxx, :user xxxxxx, :text test, :ts 1498385185.596441, :source_team xxxxxx, :team xxxxxx}
event: {:type message, :channel xxxxxx, :user xxxxxx, :text test, :ts 1498385185.596441, :source_team xxxxxx, :team xxxxxx}
```

# まとめ
[clj-slack-client](https://github.com/tonyvanriet/clj-slack-client)を利用することでRTMが簡単に利用できました。今回は動かすことが目的なのでトークンをハードコーディングしていますが、ちゃんと作るときはちゃんと隠蔽してください。
便利なRTMが使えるClojureの便利なSlackBotフレームワークが欲しいですね。あったら教えて下さい。作る？？？

# 参考
- https://github.com/tonyvanriet/clj-slack-client
- https://github.com/tonyvanriet/lunch-bot
- https://api.slack.com/rtm
- https://api.slack.com/bot-users
Githubのリポジトリのコラボレータを確認する

Github のリポジトリのコラボレータを確認する方法です。

他者のリポジトリで、だれがコラボレータになっているかを確認する際に利用します。（GithubのWebページ上では確認できなかったので。）

基本的には下記のapiを叩くだけです。 

```
GET /repos/:owner/:repo/collaborators
```

簡単にapiを叩くために、[Postman](https://www.getpostman.com/) を使います。

![hit-github-api.PNG](https://qiita-image-store.s3.amazonaws.com/0/2163/505748bd-f068-cf21-1e29-74d30bb597db.png)

apiの実行には認証が必要です。 ベーシック認証が利用できるので、Authentication の Type から Basic Auth を選択し、Githubのユーザ名とパスワードを入力します。

Request URL を入力して、Send ボタンをクリックします。（:repo、:owner は確認対象のリポジトリ名とユーザ名に置き換えます）

レスポンスは下記のようにJSON形式で確認できます。

![responce-github-api.PNG](https://qiita-image-store.s3.amazonaws.com/0/2163/05478767-ac33-631d-b009-1e60391735fe.png)

参考
[Collaborators | GitHub Developer Guide](https://developer.github.com/v3/repos/collaborators/)
HoloLensアプリ開発記事一覧

記事がとっ散らかりそうなのでここでまとめときます


#Unity

##StreamingAssets

|Number|Title|Data|
|:--:|:---:|:--:|
|1-1|HoloLens上でスクリプトを用いて外部ファイルの読み込みをしたい(http://qiita.com/gshirato/items/dbefd28b570d98cb4da9)|2017.06.09|
|1-2|[Unity] ドラッグ&ドロップ一切使わずスクリプトのみでいろいろ取り込み(http://qiita.com/gshirato/items/b823a0a4ea7baff102f2)|2017.06.21|
|2|[Unity] StreamingAssets内に直接インポートすると(不具合)(http://qiita.com/gshirato/items/4cff37a3d467cf0dc5ac)|2017.06.23|

##VideoPlayer

|Number|Title|Date|
|:--:|:---:|:--:|
|1-1|Unity 5.6からの動画再生機能 VideoPlayerで動画再生(http://qiita.com/gshirato/items/1500f61b408e7af69453)|2017.06.22|
|1-2|VideoPlayerにスクリプトで音をつけたい(http://qiita.com/gshirato/items/88096b0b350f5921f8d4)|2017.06.23|

##Azure & WWW
|Number|Title|Date|
|:--:|:---:|:--:|
|0-1|Microsoft Azureでファイル管理をしたい(App Service Editor)(http://qiita.com/gshirato/items/d62e915da6ea1ea94bd6)|2017.07.04|
|0-2|web.configをいじってAzureのウェブサイト上の表示可能項目を設定(http://qiita.com/gshirato/items/7f783784cd5e6827fa0f)|2017.07.06|
|1-1|UnityでWWWを使ってファイルを読み込む(http://qiita.com/gshirato/items/8fb10f768d0ba2c2e365)|2017.07.06|
|1-2|AssetBundlesを使って.fbxモデルをネット上から回収(http://qiita.com/gshirato/items/b58dd8545dc215e41b34)|2017.07.13|
|2|[実践編]HoloLens上でクラウド上のデータを使いたい(http://qiita.com/gshirato/items/12ed4f5f3e458051afe0)|2017.07.07|


#VR/ARツール

##Vuforia

|Number|Title|Data|
|:--:|:---:|:--:|
|1-1|今更ながらVuforiaでAR 入門編(http://qiita.com/gshirato/items/98ae33b126f0b8f8a89b)|2017.06.28|
#3Dモデル
##FBX解読
|Number|Title|Date|
|:--:|:---:|:--:|
|1|FBXを解読したい(http://qiita.com/gshirato/items/87586421de0ec37e46a6)|2017.07.17|
|2|FBX解読②(http://qiita.com/gshirato/items/3d3041b8abbca13b769c)|2017.07.19|
|3|FBX解読③ 配列型〜配列展開まで(http://qiita.com/gshirato/items/87a14ffd9844dd474b72)|2017.07.31|
|4|FBX解読④ Mesh描画編(http://qiita.com/gshirato/items/4aa85fe31e8d48574d8c)|2017.07.31|

#開発ツール
##Visual Studio

|Number|Title|
|:--:|:---:|
|1|Visual Studioで正規表現を使ってラクラク検索・置換(http://qiita.com/gshirato/items/2eade79a1fdd040ac7b2)|2017.07.28|
Bluemix の flask で、ビットコインと円のレートを取得

Bluemix で、Hello World のプログラムは簡単にかけますが、その先に進むのは大変です。一歩進んだだけのサンプルを作成しました。
Bluemix で作成したサンプルプログラムをダウンロードして、それを改造し、アップロードします。

改造するファイルは、
manifest.yml
requirements.txt
welcome.py
static/index.html の４つです。

```text:manifest.yml
applications:
- path: .
  memory: 128M
  instances: 1
  domain: mybluemix.net
  name: get_rate
  host: getrate
  disk_quota: 1024M
  buildpack: python_buildpack
```

```text:requirements.txt
Flask==0.10.1
requests==2.7.0
```

```py:welcome.py
# -*- coding: utf-8 -*-
#
#	get_rate/welcome.py
#
#					Jun/25/2017
# ----------------------------------------------------------------------
import os
from flask import Flask, jsonify
import requests

# ----------------------------------------------------------------------
app = Flask(__name__)

@app.route('/')
def Welcome():
    return app.send_static_file('index.html')

@app.route('/myapp')
def WelcomeToMyapp():
    return 'Welcome again to my app running on Bluemix!'

# ----------------------------------------------------------------------
@app.route('/get_rate')
def WelcomeToGet_rate():
    url='https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY'
    rr=requests.get (url)
    dict=rr.json()
    return jsonify(results=dict)
#
# ----------------------------------------------------------------------
@app.route('/api/people')
def GetPeople():
    list = [
        {'name': 'John', 'age': 28},
        {'name': 'Bill', 'val': 26}
    ]
    return jsonify(results=list)

@app.route('/api/people/<name>')
def SayHello(name):
    message = {
        'message': 'Hello ' + name
    }
    return jsonify(results=message)

port = os.getenv('PORT', '5000')
if __name__ == "__main__":
	app.run(host='0.0.0.0', port=int(port))
```

```html:static/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="static/stylesheets/style.css">
<title>get_rate Jun/25/2017</title>
</head>
<body>
<h1>get_rate</h1>
<blockquote>
<a href="/get_rate">/get_rate</a><br />
</blockquote>
Jun/25/2017 PM 18:42<p />
</body>
</html>
```

cf push をかけた結果

![bluemix_jun2501.png](https://qiita-image-store.s3.amazonaws.com/0/179446/d75a806d-39c7-a920-3e93-b9542226ce23.png)

https://getrate.mybluemix.net/　にアクセス

![bluemix_jun2502.png](https://qiita-image-store.s3.amazonaws.com/0/179446/569bee06-2be2-4b22-29b3-089a0fb1e92d.png)

https://getrate.mybluemix.net/get_rate　にアクセス

![bluemix_jun2503.png](https://qiita-image-store.s3.amazonaws.com/0/179446/c16892a3-2ea3-1c91-bb4a-abda7197375c.png)
growisofsコマンドでOSのインストールメディアを作成する

ブートメディア(ISOイメージ)をネットからダウンロードしてきた後、DVDに書き込み、OSのインストールメディアを作成するときのコマンド。

```
growisofs -dvd-compat -Z /dev/dvd=/path/to/myiso.iso
```

/dev/dvd と ISOファイルへのパスは適宜修正する。
Typescript環境構築

# Typescriptってなんなん
javascriptに型を加えた言語です。
typescriptをトランスパイルするとjavascriptになります。

# 環境
node.js v8.1.2

# パッケージインストール

以下のパッケージをインストール、グローバルを汚染したくないので`-g`オプションは使用しません。

+ [Typescript](https://www.typescriptlang.org)
+ [gulp](http://gulpjs.com)
+ [gulp-typescript](https://github.com/ivogabe/gulp-typescript)

```
npm install --save-dev typescript gulp gulp-typescript

```

# gulpタスク作成

`gulpfile.js`を以下の様に記載します。

``` gulpfile.js
'use strict';

const gulp = require('gulp');
const ts = require('gulp-typescript');
const tsProject = ts.createProject('tsconfig.json');

gulp.task('ts-build', () => {
    return tsProject.src()
        .pipe(tsProject())
        .js.pipe(gulp.dest('dist'));
});
```

# スクリプト追加

`package.json`にスクリプト追加する。

``` package.json
  - 省略 -
  "scripts": {
    "ts-build": "gulp ts-build"
  },
  - 省略 -
```

# Typescriptの設定ファイル作成

`tsconfig.json`を作成し以下の様に記載する。

``` tsconfig.json
{
    "compilerOptions": {
        "target": "ES2017",
        "sourceMap": true
    },
    "include": [
        "src/**/*.ts"
    ]
}
```

# お試し

`src`ディレクトリ以下に`greeter.ts`を作成し以下を記載する。

``` greeter.ts
class Student {
    fullName: string;
    constructor(public firstName, public middleInitial, public lastName) {
        this.fullName = firstName + " " + middleInitial + " " + lastName;
    }
}

interface Person {
    firstName: string;
    lastName: string;
}

function greeter(person : Person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}

var user = new Student("Jane", "M.", "User");

console.log(greeter(user));
```

以下のコマンドを実行し、typescriptがjavascriptになることを確認する。

```
npm run ts-build
```


``` ./dist/greeter.js
class Student {
    constructor(firstName, middleInitial, lastName) {
        this.firstName = firstName;
        this.middleInitial = middleInitial;
        this.lastName = lastName;
        this.fullName = firstName + " " + middleInitial + " " + lastName;
    }
}
function greeter(person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}
var user = new Student("Jane", "M.", "User");
console.log(greeter(user));

```
Go言語でWebサイトを作ってみる：目次

表題の記事がたまってきましたので目次ページを作ってみました。

## 概要

WebサイトのサーバーサイドをGoで一通り作っていっている記事になります。
フレームワークは Echo https://echo.labstack.com/ を使用しています。

### Go言語でWebサイトを作ってみる：

1. [Hello World的な] (http://qiita.com/y_ussie/items/ca8dc5e423eec318a436)
2. [リクエストパラメータの扱い] (http://qiita.com/y_ussie/items/2d397e70bfc38f75ca51)
3. [セッションデータストアを作る] (http://qiita.com/y_ussie/items/b1db86b0b54ec69bb928)
4. [Cookieを使用したセッション管理] (http://qiita.com/y_ussie/items/00e542cb3531b48fd21a)
5. [ひとまずコード整理] (http://qiita.com/y_ussie/items/12bb4fd8cefb740581f8)
6. [ユーザー情報をJSONから読み込んで参照してみる] (http://qiita.com/y_ussie/items/8704ce209704bf191e63)
7. [ログインしたユーザーしか見られないページを作ってみる] (http://qiita.com/y_ussie/items/45d916f741e12c4ec9b7)
8. [管理者のみ見られるページを作ってみる](http://qiita.com/y_ussie/items/0052c83c9ec75b06bb6c)

## 本記事で使用しているコードについて

以下のGitHubに全コードを置いています。
「master」ブランチが最新になります。
各記事の時点に対応したコードについては「chapter-xx」のブランチを参照してください。

https://github.com/yoshinoyaussie/golang-website-sample
JIRAでREST APIを利用する(例としてユーザ登録)


業務の絡みで調べたので記載。


# 目的
JIRAでREST APIの利用方法の例として、
ユーザ登録するための手順について説明します。

# 前提

- jiraのバージョンは7.1.8
- jiraはhttpsで公開

HTTPで公開しているとうまくいかないかも。 (未確認)

あと、Pythonを使っているので以下の条件も必要です。
- Python 3.5.2
- Requestsモジュールを利用

# 概要

特定のユーザをPythonコードからJIRAのREST APIを叩いて登録する。

## 簡単な説明

基本的には[ドキュメント記載](https://docs.atlassian.com/jira/REST/7.1.8/)のパスに対して、指定されたHTTPメソッドと認証情報を渡すことで操作は可能です。今回はサンプルとしてユーザの登録APIを叩いています。

なお、以下のREST APIを叩くには以下の条件を満たす必要があります。

- ユーザはBasic認証で認証する
- 上記ユーザが実施できる操作のみREST APIを実行できます。
	- つまり、JIRAのREST APIでユーザ登録を実行するにはjira-administratorグループに所属している必要があります。

## ユーザ登録APIの使用

### リクエスト先パス

```text
/rest/api/2/user
```
メソッドにはPOSTを利用します。

### リクエストボディ



|パラメータ|説明|
|---|---|
|name|ユーザID|
|emailAddress|(有効な)メールアドレス|
|password| 初期パスワード。未指定時はランダム **(今回は使用なし)**|
|displayName|画面上に表示する名前|
|applicationKeys|所属させるアプリケーション(リストで記述)|

```json:リクエストボディサンプル
{
    "name": "test_taro",
    "emailAddress": "test_taro@example.com",
    "displayName": "テスト太郎",
    "applicationKeys": 
            "jira-software",
    ],
}

```


## サンプルコード

```python:サンプルコード
import requests
from requests import RequestException

# リクエスト先ホスト
TARGET_HOST = "atlassian.example.com"
CONTEXT = "/jira"
USER_CREATE_PATH="/rest/api/2/user"

request_body = {
    "name": "test_taro",
    "emailAddress": "test_taro@example.com",
    "displayName": "テスト太郎",
    "applicationKeys": 
            "jira-software",
    ],
}

request_path = "https://"+TARGET_HOST+CONTEXT+USER_CREATE_PATH
try:
    response = requests.post(request_path, auth=('jira_admin_user','hogehoge'),json=request_body)
except RequestException as err:
    print(str(err))
print(str(response))

```

# 参考資料
- Requestモジュールドキュメント
	- http://docs.python-requests.org/en/master/
- 公式ドキュメント
	- https://docs.atlassian.com/jira/REST/7.1.8/
Cloudant NoSQL DBのコピー

本番用、開発用にアプリケーションを分けたり、リージョン間でお引っ越しをしたり、DBの災対用バックアップを持ったりするとき、同じ内容のCloudantDBを複数持ちたいと言うことはないだろうか？
コピーする方法を紹介する。

---

CloudantDBをコピーしたいと思った。データや設計をもう一度し直すのは面倒くさい。
コピーする方法はないだろうか？
CloudantDashboardで「Replicate」機能を使うとコピーは出来る。

簡単な手順はこんな感じだ。

1. コピー先のCloudantサービスに予めDBを作成しておく。
2. Cloudantサービスの資格情報を調べる。
3. コピー元のCloudantサービスで「Replicate」ボタンを押す。
4. 資格情報を入力し、「StartReplication」ボタンを押す。
5. 結果を確認する。

#コピー先のCloudantサービスに予めDBを作成
コピー先のCloudant NoSQL DB サービスのダッシュボードで予めDBを作成しよう。DB名は何でもよい。コピー元のDB名と同じでも違ってもよい。

#Cloudantサービスの資格情報を調べる
Cloudant NoSQL DB サービスの資格情報を調べよう。
方法はいろいろあるが、DBの管理画面から調べる方法を書いておく。
ダッシュボードから、該当DBの管理画面を開き、「サービス資格情報」を選ぶ。資格情報がひとつもなければ、「新規資格情報」をクリックして作成しよう。
任意の資格情報の「資格情報の表示」をクリックすると資格情報が表示される。
表示された資格情報よりコピー先およびコピー元DBの「username」と「password」と「apikey」、コピー先DBの「url」を覚えておこう。
なお、上記項目はCloudantがIAMサービスかCloudFoundryサービスかで、存在しないものもある。
<img width="768" alt="2019-02-13_13h38_22.png" src="https://qiita-image-store.s3.amazonaws.com/0/89689/5c41185e-9975-63e4-ad30-ed6d15950fa4.png">

#コピー元のCloudantサービスで「Replicate」ボタンを押す
コピー元のDBがあるCloudant NoSQL DB サービス管理画面を開き、Databasesのコピー元DBのActions項目にある、「Replicate」ボタンを押す。

![cloudant2.png](https://qiita-image-store.s3.amazonaws.com/0/89689/29779340-eaba-8829-88df-62bb72982398.png)

#資格情報を入力する
Job Configuration画面に遷移する。ここで資格情報を入力していく。

##Source　セクション

- Type と Name : すでに入力済。
- Authentication :　DBがIAMサービスなら「IAM Authentication」 CloudFoundryサービスなら「CloudantUsername or API Key」を選ぶ。それぞれ入力項目の違うボックスが出てくる。
    - IAM API Key欄に、資格情報の「apikey」を入力。
    - Username or API key欄には、資格情報の「username」を入力。
    - ㎩ssword欄には、資格情報の「password」を入力。
    
<img width="650" alt="2019-02-13_14h59_45.png" src="https://qiita-image-store.s3.amazonaws.com/0/89689/d9fbecfc-d88a-4e82-f59d-fa2e946af25e.png">

## Target　セクション
- Type : 適当なものを選ぶ。
- Name : 適当なものを選ぶか、入力。TypeでExisting remote database」にした場合は、コピー先のURL+「/[DB名]」を入力。

**TargetName入力例**
`https://aaaa:bbbb@cccc-bluemix.cloudant.com/csvtest2`

- Authentication :　SourceのAuthenticationと同じで、DBがIAMサービスなら「IAM Authentication」 CloudFoundryサービスなら「CloudantUsername or API Key」を選ぶ。それぞれ入力項目の違うボックスが出てくる。
    - IAM API Key欄に、資格情報の「apikey」を入力。
    - Username or API key欄には、資格情報の「username」を入力。
    - ㎩ssword欄には、資格情報の「password」を入力。
入力したら「StartReplication」ボタンを押す。

<img width="362" alt="2019-02-13_15h38_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/89689/88bc69fd-bc69-2117-50a8-f2c6aa3463f5.png">




# 結果を確認する
結果はCloudantDashboardのRaplication画面で見ることができる。

![cloudant4.png](https://qiita-image-store.s3.amazonaws.com/0/89689/44ab42b5-4e1d-90ae-93c3-dc73e436f215.png)
geth on Dockerをprivatenetで動かす

[合同会社kumanote](http://kumano-te.com/)のTanakaです。

今回は、ethereum上のtokenを開発するにあたってのtipsを紹介したいと思います。

gethをdocker上で動かし、host上からrpcで接続できるようにしたので、その紹介になります。


## Dockerfile

```
FROM ubuntu:16.04        # <- 容量重いので適時かえてください
MAINTAINER kumanote,LLC. # <- 適時かえてください

RUN mkdir -p /root/.ethereum

VOLUME ["/root/.ethereum"]

# install geth
RUN \
  apt-get update -y && \
  apt-get install -y software-properties-common && \
  add-apt-repository -y ppa:ethereum/ethereum && \
  apt-get update -y && \
  apt-get install -y ethereum solc

EXPOSE 8545

CMD ["/bin/sh"]
```

***solcはgethを起動するだけなら不要です***

## genesis.json

```
{
  "config": {
        "chainId": 15, // ここはnetworkidに合わせておきます。
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x200", // ここが大きいと開発にならない（マイニングできなくなる）ので、このくらいがちょうどよかったです
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}
```

## ビルド

```
docker build -t kumanote/geth:v1.0.0 .
```

## 実行

### init

```
docker run \
  -v `pwd`/.ethereum:/root/.ethereum \
  -p 8545:8545 \
  kumanote/geth:v1.0.0 \ # <- 適時変えてください
  geth --datadir /root/.ethereum --networkid 15 init /root/.ethereum/genesis.json
```

### console立ち上げ

```
docker run \
  -it \
  -v `pwd`/.ethereum:/root/.ethereum \
  -p 8545:8545 \
  kumanote/geth:v1.0.0 \ # <- 適時変えてください
  geth --datadir /root/.ethereum --networkid 15 --nodiscover --ipcpath /root/.ethereum/geth.ipc --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpccorsdomain "*" console
```

#### 確認

host OS上で `curl` を rpcサーバーに投げ込むことで、動作を確認できます。

```
$curl -X POST http://localhost:8545/  --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}'
{"jsonrpc":"2.0","id":1,"result":"Geth/v1.6.6-stable-10a45cb5/linux-amd64/go1.8.1"}
```
mergeしたものを戻す。

###git resetを使う

まず、

```$ git log --oneline --graph --decorate```

と入力して、現在のcommit状況とハッシュを確認する。

次に

```git reset --hard xxxxxx```

と入力すると、commitが取り消される。
一安心。

本内用は

【git】git mergeを取り消す
【http://tweeeety.hateblo.jp/entry/2015/06/13/183036】(http://tweeeety.hateblo.jp/entry/2015/06/13/183036)
-- tweeeetyのぶろぐ的めも

を参考に自分の備忘録のために書きました。
PHP Manual 読書会(8回目)(制御構造2)

PHPに慣れる為に週1ぐらいで更新していきます。PHP Manualを読んで実験して行きます。

前回:[PHP Manual 読書会(7回目)(制御構造1)](http://qiita.com/amesho/items/297c78cfba7998c28a94)


## [include](http://php.net/manual/ja/function.include.php)

> include 文は指定されたファイルを読み込み、評価します。

+ 直接pathを指定しない場合は`include_path`に書かれたpathからファイルを探します。
  + include_pathが影響を及ぼす関数
    + require
    + include
    + fopen()
    + file()
    + readfile()
    + filet_get_content()
  + `set_include_path()` を使用すると実行時に変更することができる

重要なポイントとして、ファイルが見つけられない場合はwariningsを発行する。

> include は、ファイルを見つけられない場合に warning を発行

```php
<?php

include('./hoge.php'); // 存在しないファイルを読み込む
```

```sh
PHP Warning:  include(./hoge.php): failed to open stream: No such file or directory
```

### set_include_pathを使用する

```sh
tree dir
dir
└── hoge.php
```

このようなディレクトリにhoge.phpを置く。

```php
// hoge.php
<?php

function say() {
    echo "hello\n";
}
```

set_include_pathを使用して読み込む。

```php
<?php

set_include_path('./dir');

include('hoge.php');

say();
```

### 読み込まれたファイルの扱い

> ファイルが読み込まれるとそのファイルに含まれるコードは、 includeもしくはrequireが実行された 行の変数スコープを継承します。 呼び出し側の行で利用可能である全ての変数は、読み込まれたファイル内で利用可能です。 しかし、読み込まれたファイル内で定義されている関数やクラスはすべて グローバルスコープとなります。

つまり、どこか実行時の関数内とかで呼び出した場合はそのスコープへアクセスできるのか。出来なかった。なかで関数返した場合に可能とかそういう感じかなこれ。

## [require](http://php.net/manual/ja/function.require.php)

> require は include とほぼ同じですが、失敗した場合に E_COMPILE_ERROR レベルの致命的なエラーも発生するという点が異なります。

```php
<?php

require('./hoge.php');
```

```
PHP Warning:  require(./hoge.php): failed to open stream: No such file or directory

PHP Fatal error:  require(): Failed opening required './hoge.php'
```

warningsと一緒に致命的なエラーも出た。requireの方は出来なかったら止まったほうがいいけーすで使えそうだ。内部的に同じロジックを使用しているのか、warningsまで出ている。あとでコードを確認したい。


## require_once

> include_once は、スクリプトの実行時に同じファイ ルが複数回読み込まれ、評価される可能性がある場合に、関数の再定義や 変数値の再代入といった問題を回避するために一回だけ読み込ませるため に使用します。

例えば、cakephpだと以下の様に使われていたりする。

```php
public function bootstrap()
{
    require_once $this->configDir . '/bootstrap.php';
}
```

+ https://github.com/cakephp/cakephp/blob/b27ebbd6a4e9b6062bd45e13a439b7ab7f29d0af/src/Http/BaseApplication.php#L59

1回しか読み込みたくないconfig系で使われているようだ。
Swift4で変更されたStringAPIをいくつか試してみた

##はじめに
Swift4になり、String APIにいくつかの変更があったようなので、実際にPlaygroundで試してみました。

##検証環境
以下の環境を使用しています。

* macOS Sierra Version 10.12.4
* Xcode Version 9.0.0 β1

##Multi-line string literals
複数行の表示がより直感的に簡潔になりました。
以前では複数行表示する際にescaping sequenceを使用し、`\n`で改行するか、`print`を複数行使用する必要がありましたが、Swift4では、「"""」で文字列を囲むことで、複数行の文字列の表示が可能です。
###具体例

```swift:Swift3
print("あいうえお　かきくけこ")
print("さしすせそ　たちつてと\nなにぬねの　はひふへほ")
print("まみむめも や　ゆ　よ\nらりるれろ　わ　を　ん")
```

```swift:Swift4
　print("""
あいうえお　かきくけこ
さしすせそ　たちつてと
なにぬねの　はひふへほ
まみむめも　や　ゆ　よ
らりるれろ　わ　を　ん
""")
```

##stringが再びCollectionTypeに
StringがCollectionTypeになったことにより、filterやmapを使用した直感的な記法が使えるようになりました。

###具体例：文字列から ！ を除外する
```swift:Swift3
var string = "Don’t ask for permission!, beg for forgiveness!"
let filtered = String(string.characters.filter{ !"!".contains($0) })
```

```swift:Swift4
var string = "Don’t ask for permission!, beg for forgiveness!"
let filtered = string.filter{ $0 != "!" }
```

###具体例2:文字列の先頭6文字のみ残す

```swift:Swift3
let string = "we can't"
let prefixed = String(string.characters.prefix(6))
```

```swift:Swift4
let string = "we can`t"
let prefixed = string.prefix(6)
```

##所感
charactersを介さずに書けることになったことにより、非常に簡潔な書き方ができるようになったと思います。個人的にはMulti-line string literalsが地味に便利だなと感じました。

##参考文献
[Exploring the new String API in Swift 4](https://www.swiftbysundell.com/posts/exploring-the-new-string-api-in-swift-4?utm_campaign=Revue%20newsletter&utm_medium=Swift%20Weekly%20Newsletter%20Issue%2081&utm_source=Swift%20Weekly)
Xamarin (VisualStudio for Mac) で Android アプリを実行する時にハマった事

# 前書き
体系立てて説明するのが難しいので、自分がハマった現象と対策を書いておきたいと思います。

- （１）そもそもエミュレータが起動画面で一生固まる
- （２）起動はするが、ディスクが壊れてる的なことを言われる
- （３）起動はするが、「error : Failure [INSTALL_FAILED_NO_MATCHING_ABIS]」と言われる
- （４）起動はするが、「メインのアクティビティがなくてうんたらかんたら…」と言われる

なお、大前提として、標準で定義されている「Android_ARMv7a」は使わず、「Android_Accelerated_x86」を使います。そうしないと遅くて使い物にならないからです。

Xamarin で開発している皆さまの参考になれば幸いです。

# ハマった現象
## （１）そもそもエミュレータが起動画面で一生固まる
これは何故起こっていたのかいまいちよく分からないのですが、結論としては、

- ~/.android/ 以下を削除
- ~/Library/Developer/Xamarin/ 以下を削除
- VisualStudio for Mac のインストーラーから Android サポート関係を再インストールする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71179/8182c59b-4278-29c0-1da0-07f18ec55e1b.png)

これで直りました。なお、ARMv7a で起動していると、ちゃんと動いているんだけど死ぬほど遅くて固まっている様に見えてしまう事もある様です。どこかの記事では5分くらい起動にかかったという記事もありました。CPU の具合とか見ててもあまり分からないので注意した方がよさそうです。

ちなみに私は Mac Pro で 3時間くらい待っても起動しなかったので、そういう問題ではないと思います（笑）

## （２）起動はするが、ディスクが壊れてる的なことを言われる
いったんユーザーデータを消去する必要がある様です。

- VisualStudio -> ツール -> Google Emulator Manager -> (対象のバーチャルデバイスを選択) -> Start
- 出てきたダイアログで、 Wipe User Data にチェックを入れて起動

これで直りました。

## （３）起動はするが、「error : Failure [INSTALL_FAILED_NO_MATCHING_ABIS]」と言われる
バーチャルデバイスとして「Android_Accelerated_x86」を選択している時にこのエラーが出る時は、下記の様に、サポートされる AIB として x86 を追加します。

- VisualStudio 上の Android プロジェクトを右クリック -> オプション
- 出て来たダイアログで下記の様に x86 にチェックを入れる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71179/5bca6a31-5246-72c8-c326-35263c9d5ae6.png)

これで直りました。

## （４）起動はするが、「メインのアクティビティがなくてうんたらかんたら…」と言われる
ログを残しておらずどういうメッセージだったか忘れてしまったのですが…メインのアクティビティがなくてうんたらかんたらと言われていたのですが、いったんプロジェクトをクリーンしてから再度ビルドしたら直りました。
【Android】複数行の行頭に任意の文字列を追加する

コメント引用機能を実装するときに引用文字（">"など）を行頭に追加したいときがあったのでそのコードのメモです。

## やりたいこと
これを

```
foo
bar
baz
```

↓こうしたい

```
>foo
>bar
>baz
```


## コード

### 真面目に頑張るパターン
prefixを各行の行頭付与するメソッド

```java
public String A(String text, String prefix) {
    String prefixedText = "";
    String newLineCode = "\r\n";
    String[] lines = text.split(newLineCode, 0);
    for (String line : lines) {
        prefixedText += prefix + line + newLineCode;
    }
    return prefixedText;
}
```

呼び出し

```java
String prefixedText = A(text, ">");
```

### （追記）joinを使うパターン
```java
String newLineCode = "\r\n";
String prefixedText = prefix + String.join(newLineCode + prefix, text.split(newLineCode, 0));
```
@Kilisame さんありがとうございます！

### （追記）正規表現を使うパターン
```java
public String A(String text, String prefix) {
    return text.replaceAll("(?m)^.*$", prefix + "$0");
}
```
@saka1029 さんありがとうございます！

## 補足
正規表現使えばもっと簡単にできそう。
ビットコインと円のレートの取得

api.bitflyer.jp から、ビットコインのレートを取得するサンプルです。
python3,php7,node.js のサンプルです。

```py3:get_rate.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	get_rate.py
#
#					Jun/25/2017
# --------------------------------------------------------------------
import sys
import requests

# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
url='https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY'
rr=requests.get(url)
dict=rr.json()
#
print('timestamp = ' + dict['timestamp'])
print('ltp = ' + str(dict['ltp']))
print('best_bid = ' + str(dict['best_bid']))
print('best_ask = ' + str(dict['best_ask']))
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

```php:get_rate.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//	get_rate.php
//
//					Jun/25/2017
//
// ------------------------------------------------------------------
function curl_get_proc ($url)
{
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_PROXY, "");

$data = curl_exec($ch);

curl_close($ch);

return $data;
}

// ------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");
$url_in='https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY';
$json_string = curl_get_proc ($url_in);
$dict_aa = json_decode ($json_string,true);
print "timestamp = " . $dict_aa['timestamp'] . "\n";
print "ltp = " . $dict_aa['ltp'] . "\n";
print "best_bid = " . $dict_aa['best_bid'] . "\n";
print "best_ask = " . $dict_aa['best_ask'] . "\n";
fputs (STDERR,"*** 終了 ***\n");
// ------------------------------------------------------------------
```

```js:get_rate.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	get_rate.js
//
//					Jun/25/2017
// ---------------------------------------------------------------
console.log ("*** 開始 ***")

var https = require('https')

const url_in='https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY'
https.get(url_in, function(res) {
	res.on('data', function(dd)
	{
	json_str = dd.toString()
	dict_aa = JSON.parse(json_str)
	console.log ("timestamp = " + dict_aa["timestamp"])
	console.log ("ltp = " + dict_aa["ltp"])
	console.log ("best_bid = " + dict_aa["best_bid"])
	console.log ("best_ask = " + dict_aa["best_ask"])
	console.log ("*** 終了 ***");
	})
	}).on('error', function(ee)
		{
		console.error(ee)
		})

// ---------------------------------------------------------------
```

次のバージョンで動作を確認しました。

```text
$ python --version
Python 3.9.5

$ php --version
PHP 7.4.16 (cli) (built: Mar 23 2021 16:15:03) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.16, Copyright (c), by Zend Technologies

$ node --version
v14.14.0
```
React + Redux の勉強のためにお試しアプリを作成した

React + Redux を勉強しようと試しにアプリを作成してみました。

* GeneticAlgorithm でテストベットとなる問題（ナップザック問題）を解く様子を可視化したアプリ
  * コード: https://github.com/namutaka/genetic-algorithm-viewer
  * 実行例: https://namutaka.github.io/genetic-algorithm-viewer/

その時に自分なりに理解したポイントをメモ的にまとめておきます。

## React

Reactは、Componentと呼ぶ独自の機能を持ったHTMLタグを作り、それを組み合わせて画面を作る。
Componentはいろいろな方法で作成できるけど、React.Componentを継承したclassと作るのが基本になる。
Componentは、stateとprops(properties)という２つのデータを使う。

stateはそのComponent内部の状態を保持するためのデータストアでこのデータを使って表示を変化させる。
このstateは直接的には変更せず`Component#setState`で更新し、これによりReactがstateの変化に応じた画面の再描画を行う。

propsは、そのComponentを使用する時に外部から渡されるデータで、コンストラクタ引数のようなもの。
値は不変でこれを直接書き換えるようなことはしてはいけない。
Componentを使うときは、HTMLタグのように記述するので、その属性がそのままporpsに渡される。


## Redux

Reduxはデータの保持、更新、反映を行うタイミングを整理してデータの管理を行いやすくするフレームワーク。
よく、React + Reduxとしてワンセットで扱われているが、Redux単体でも成立しているようなのでjQuery + Reduxとかもやろうとすればできそう。
(参考: http://redux.js.org/docs/basics/Store.html#dispatching-actions)

## React + Redux

React + Redux の構成はReduxでアプリ全体のデータを管理し、そのデータをReactのComponentに渡して画面に反映する。
Reactは渡されたデータ構造を使って画面を構成することに注力し、ビジネスロジックによるデータ更新はReduxのReducerが担う。
`react-redux`モジュールの`connect`メソッドを使って、ReduxがもつデータをReact Componentのpropsに渡すことで両者を繋ぐ。
全てのReact ComponentをReduxと繋ぐよりは、Reactで作ったビューのルートとなるComponentにのみ繋ぐような使い方がよいように思う。

ReactのComponent自体のstateと、Reduxが持つデータ構造(state。どちらもstateで呼び分けづらい)の使い分けとしては以下のイメージ。
例えば、アプリのオプション設定をオプション設定用コンポーネントとして作成したときに、オプション画面のリアルタイムの入力内容はReact stateに保持し、その後にオプション設定を[Submit]ボタンとかで確定した時点で、React stateで持っていた内容をReduxのActionを通してReduxのデータに反映する。

## 初期構造作成

実装するにあたって公式のチュートリアルなどが参考になる。

* React公式
  * https://facebook.github.io/react/
* Redux公式
  * http://redux.js.org/

初期構造の作成は、create-react-appを使って初期テンプレートを作るのがよい。

* Create React App
  * https://github.com/facebookincubator/create-react-app

その上で、以下のRect + Reduxのサンプルアプリを参考にファイル構造や命名構造を参考にするとよい。

* React + Reduxサンプル
  * https://github.com/reactjs/redux/tree/master/examples/real-world
Xamarin.FormsでBindingできたのでメモ

Xamrin.FormsでBindingしてみたのでメモ。

## Xaml
xmlns:localでViewのnamespaceとアセンブリ名を記述。
WPFの時と同じように{Binding 〇〇〇}でバインディングソースのプロパティを指定。

```xml:MainPage.xaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:XF_BindingSample;assembly=XF_BindingSample"
             x:Class="XF_BindingSample.MainPage">

    <StackLayout Spacing="20" Padding="15">
        <Label Text="{Binding LblCount}"/>
        <Button Text="カウントアップ" Command="{Binding CountUpCommand}"/>
    </StackLayout>

</ContentPage>
```


## Xaml.cs
BindingContextに対象のViewModelを指定。

```csharp:MainPage.xaml.cs
	public partial class MainPage : ContentPage
	{
		public MainPage()
		{
			InitializeComponent();
            this.BindingContext = new MainPageViewModel();
		}
	}
```

## ViewModel
ViewModelはINotyfiPropertyを実装。
View側で指定したバインディングソースのプロパティも用意してsetterで値が変わったらPropertyChangedイベントを発生させる。
イベントはICommandで定義しておいて、コンストラクタで実処理に紐づける。 

```csharp:MainPageViewModel.cs

   public class MainPageViewModel: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        int count = 0;
        public MainPageViewModel()
        {
            this.LblCount = count.ToString();

            this.CountUpCommand = new Command(() => CountUp());
        }

        public ICommand CountUpCommand { get; }
        private void CountUp()
        {
            count++;

            this.LblCount = count.ToString();
        }

        private string lblCount;
        public string LblCount
        {
            set
            {
                if (lblCount != value)
                {
                    lblCount = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("LblCount"));
                    }
                }
            }
            get
            {
                return lblCount;
            }
        }
    }
```
Arduinoの各モデル(クローンを含む)の価格比較


買う時の参考用にまとめます。
とりあえず、モジュールなやつから。

|モデル|価格|IC|フラッシュ|IO|
|:--:|:--:|:--:|:--:|:--:|
|Micro|$2.58|mega32U4|32k|20|
|Nano||mega328|32k|22|
|Mini||mega328|32k|14|
|Pro mini|$1.26|mega328|32k|14|
|(Sparkfun)Pro Micro|$2.76|mega32U4|32k|12|
|Digispark|$1.06|tiny85|8k|6|

価格は、Aliexpressで、送料込み。
npmのモジュールバージョン指定におけるチルダ(~)とキャレット(^)の違いについての直感的な理解

package.jsonのdependencies/devDependenciesにおいて、左端が0ではない、z.y.zという3桁のバージョンを指定する場合、以下のとおり。

| 記法 | 種別 | 意味 | 問題点など |
|:-----------|:------------|:------------|:------------|
| ^x.y.z | キャレット表記 | [セマンティックバージョニング](http://semver.org/lang/ja/)に従う。つまり、メジャーバージョンxを指定し、マイナーバージョンyの上昇、パッチバージョンzの上昇は互換性があるはずだと信じて、「x.{y以上}.{yが同じならz以上、yが上昇していれば任意} 」にあてはまる最新のものを使う。 |開発時点と、ソース共有を経ての再ビルド(npm install)時の間で、NPMリポジトリ上の対象パッケージのバージョンが上がっている場合、より新しいものが使われることになる可能性があるが、セマンティックバージョニングの仕様に厳密に従わないパッケージは世の中に結構あるのではまり易い。|
| ~x.y.z | チルダ表記 | セマンティックバージョニングにおける「マイナーバージョンが上がっても互換性が保たれるはずだ」という建前を信じないが、パッチバージョン上昇だったら互換性があるだろうとは信じて、「x.y.{z以上}」にあてはまるものを使う。 | キャレット表記に比べて、上記の可能性がパッチバージョンのみなので少ない。とはいえ、はまるときははまるだろう。|
| x.y.z | 固定 | 指定したバージョン「x.y.z」に厳密にあてはまるものを使う。 | 開発時と異なるバージョンが使用される問題は回避できるが、たとえばセキュリテイ問題があってそのバージョンのNPMがリポジトリから削除された場合に(互換性のある後継バージョンがあるのに)ビルド不可能になったり、許容できるバージョン上昇を指定できないなど、セマンティックバージョンのメリットを全く享受できない。 |

いずれも問題があるので、^なり~で指定した上で、[package-lock.json](https://docs.npmjs.com/files/package-lock.json)なり[yarn.lock](https://yarnpkg.com/lang/en/docs/yarn-lock/)を併用するのが正しい(それぞれNPM5、yarnのデフォルト動作)。

これらのロックファイルを使うのは、セマンティックバージョニングの建前と本音を使いわけることである。つまり、^~をつかって「このバージョンの範囲なら、互換性に問題ないはずだ」という希望と理想をpackage.jsonに記す。それはその上で、「実際にはこのバージョン使ってビルドしましたよ、動作保証するのはこっちなんで、こちらをお使い下さいね、げっひっひ」とlockファイルを裏で提供する。

左端の桁が0であったり、3桁以外の場合を含めては[こちら](http://qiita.com/sotarok/items/4ebd4cfedab186355867)の記事などを参照のこと。