OmniAICreator/Qiita-1.07M huggingface dataset:
Rustであれこれ

信州大学のkstmと言うサークルに所属している[@wanimaru47](https://twitter.com/wanimaru47)です。

> 本記事は[信州大学 kstm Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kstm) 4日目です。

# Rustであれこれ
この記事では、Rustであれこれしてみたメモしたものです。
ネットを漁ればいくらでも出てくるネタなので、新規性なくてすいません。

大学の講義のTA(Teaching Assistant)をやっている関係で、学部生と同じ課題を取り組むことになりました。そこで、学部生とは違う言語で課題をクリアしようというのが動機です。講義内容は、ゲームAIを実装するような中規模？！開発を目的としています。学部生の良い対戦？練習？相手になれるよう、ただいま絶賛開発途中なので、その過程で調べたことをまとめようと思います。

## Socket通信
まず、ゲームAIを実装するに当たって重要なのは、他のAIと対戦できるようなネットワークです。幸いにもすでにサーバ側は、講義の担当教員によって実装されています。そのサーバに接続するために、Socket通信を使用して接続します。

あれこれ言うより、まずはコードをご覧ください。

```rust
use std::net::TcpStream;
use std::io::{BufReader, BufRead};
use std::io::{BufWriter, Write};

// サーバ接続
let mut stream: TcpStream::connect("127.0.0.1:8888").unwrap()

// 受信
let mut reader = BufReader::new(stream);
let mut message = String::new();
reader.read_line(&mut message).expect("Could not read!");

// 送信
let mut writer = BufWriter::new(stream);
writer.write(b"message").unwrap();
let _ = writer.flush();
```

Rustでは、入出力を行う場合に```BufRead```や```BufWrite```を使うといいでしょう。これはネットワークでも一緒です。
> [RustのファイルI/OにはBufReader, BufWriterを使いましょう、という話](https://qiita.com/gyu-don/items/50f4239fc856bed00dc4)

意外にやってみると簡単に通信できて驚いています。

## クレートとモジュール
クレートとモジールは、中規模以上の開発をする上で必ず必要になってくる知識でしょう。ここでは、```struct```と絡めて解説をしていきます。

> [Crates and Modules - The Rust Programming Language](https://doc.rust-lang.org/book/first-edition/crates-and-modules.html)

まず、クレートとはモジュールを束ねるものです。モジュール群です。
たとえば、以下のように```main.rs```に```extern carete hoge;```を追加します。これにより、```hoge```クレートを使うことができます。```hoge```クレートは同じディレクトリにある```lib.rs```を参照し、モジュールを使用可能にします。

```rust:main.rs
extern crate hoge;

use hoge::fuga::Fuga;
use hoge::piyo;

fn main() {
    let fuga = Fuga::new();
    piyo::piyo_test();
    piyo::piyo_print();
}
```

```rust:lib.rs
mod huga {
    struct Fuga {
        ...
    }

    impl Fuga {
        fn new() -> Fuga {
            Fuga{...}
        }
    }
}

mod piyo {
    fn piyo_test() {
        ...
    }

    fn piyo_print() {
        ...
    }
}
```

また、```lib.rs```だけでモジュールを記述するのは大変なので、モジュールごとファイルやディレクトリへ分割することができます。

## 今回はここまで
正直、Rustは入門レベルなので（記事の内容が薄くてすいません）、学習や開発を進めて行く中で、これ系の記事をまた書くかもしれませ。今回はアドベントカレンダーと言う機会を使って記事を書いてみました。
NefryBTでIoTこたつを作る

Nefry Advent Calendar 2017の4日目の記事です！

こんにちは、岩手で大学4年生やってます白田です
最近IoT分野に興味が出てきた程度の知識なので、誤った知識が含まれるかもしれません。
間違いなどありましたらコメントでお知らせしてもらえると助かります。

コードは自分のgithubにて公開してます！
https://github.com/ShirataHikaru/Kotatsu

よろしくお願いします👍

![無題のプレゼンテーション (1).png](https://qiita-image-store.s3.amazonaws.com/0/137949/45d259c8-3f79-1fdd-7b5e-ffdbe44aa7fb.png)
最終的にはこれ👆👆を目指す感じで


#外出時のこたつ消し忘れ問題を解決したい
冬の相棒、こたつ。寒冷地岩手に住む自分は毎年お世話になってます。こたつがないと死活問題です。
しかし、日常に溶け込みすぎるが故に外出時こたつを消し忘れることが多く、電気代を無駄にしたり、火災の危険があるのでなんとかしたいと思ってました。

最近NefryBTを持て余していたので、この問題をNefryBTを使って解決したいと思います。

#材料
- **サポート体制が手厚い**Nefry BT ×1
- サーボモーター SG92R　　　　×1
- ジャンパーワイヤー　　　　　　×3
- サーボモーター電源タップに固定するための何か(角材、プラスチックなんでもどうぞ)
    - 今回はそこらへんに落ちてた廃材を使いました(L字金具、ボルト、ナット、土台用木材)



#こたつ消してくれるくん(直球)

完成したものがこちら👇　初っ端の完成予定図とは全く異なる感じですが、やってることは同じですので見逃してください
サーボモーターが動くことで電源タップのスイッチを切ります。

***正面***
![IMG_3527.JPG](https://qiita-image-store.s3.amazonaws.com/0/137949/fbe83550-b0d1-b44c-2ae9-f2eaf0795e27.jpeg)

***背面***(画像が横になりましたすいません)
![IMG_3529.JPG](https://qiita-image-store.s3.amazonaws.com/0/137949/7df7380d-5da0-87e7-9a53-608363146054.jpeg)

家のこたつがすごく古い型だったので、こたつ自体のスイッチを切るのにサーボモーターじゃ力不足でした。
またNefryBTの電源を取る関係や使いやすさの観点から、今回は電源タップのスイッチを切ることでこたつを消すことにしました。

ソフトウェア的な処理の流れ
![無題のプレゼンテーション (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/137949/b8dddb2b-b609-c42d-44f6-495b0f75b5f9.jpeg)
1. スマホアプリ上からオンオフをDatabaseに格納
2. NefryBTでDatabaseのオンオフ読み取り
3. NefryBTからIFTTTにリクエストを投げる
4. IFTTTからLINEに通知する
5. NefryBTのSWボタンでオンオフ切り替え


###機能紹介
1. iPhone上からスイッチでオンオフ(メインの使い方です)
2. NefryのSWボタンでオンオフ切り替え
    - 家に帰ってきたときに、即こたつをつけるにはアプリ上から操作するより直接押した方が早いと思うので、NefryBTの物理ボタンから切り替えられるようにしました
3. こたつがオン／オフになったとき、LINE Notifyで通知する


##実際の動作です
> ![こたつ.gif](https://qiita-image-store.s3.amazonaws.com/0/137949/66132eba-c0f3-3692-4dbb-14c8603f995e.gif)

シンプルなUIで素敵なアプリになったと思います(テキトー)

#課題
##NefryライブラリのNefryFireBase.read()が正常に動かない問題(?)
NefryFireBase.read()の返り値がString型だと思い、Stringクラスの文字列比較メソッドのequals()を使ったが、NefryがFirebaseから取得した"on"と自分が手で入力した"on"が別物と判定されてしまった。"off"も然り

String::equals()の方がおかしい？詳しくわかりませんが、おそらく自分が何か見落としてます(ｵｼｴﾃｸﾚｰ)

####Firebaseの状態
![スクリーンショット 2017-11-27 10.09.42.png](https://qiita-image-store.s3.amazonaws.com/0/137949/f1226a50-05fe-0fce-9528-17f4c0c529fe.png)

####コード一部抜粋
![スクリーンショット 2017-11-27 9.57.38.png](https://qiita-image-store.s3.amazonaws.com/0/137949/d35416a3-d00a-3f21-5a6e-8a1e05a2ff86.png)
####結果

"on\n"も試してみましたが、どれもequals()ダメでした

![スクリーンショット 2017-11-27 9.59.59.png](https://qiita-image-store.s3.amazonaws.com/0/137949/e95c7b97-11ab-65f6-dcb2-23248da0185e.png)
####無理やり動かした

前回とこたつの状態が変わった時に、こたつのオンオフをやる部分です

![スクリーンショット 2017-11-27 9.57.55.png](https://qiita-image-store.s3.amazonaws.com/0/137949/70cf7acb-664b-c9a5-3475-e384ce5f25c0.png)


〜原因調査中〜

##SWボタンで割り込みができてない
SWボタンを押したときに、外部割り込みでこたつのオンオフを切り替えた方がスマートだと思います。できませんでしたけど
Fireabseにアクセスする回数を減らしたい...
欲を言えば、NefryFirebaseライブラリにdatabaseが変更された時に発火するイベントリスナー?みたいなの欲しい

##セキュリティ＝ガバリティ
Firebaseのルールの設定が未だにめんどくさくてサボっている
実際に運用する際は外部の人から自分の家のこたつを操作されたくないので認証を挟む必要がある(と思ってる)
これは今後ぽちぽち気が向いたらやりたいと思います〜

#作ってみた所感、まとめ

IoT面白すぎた😂😂😂

3日くらい実際に運用してみましたが、帰宅前にこたつを温めておけるのが一番便利でした。
作ってる過程で、***こたつを消し忘れて家を出ることがなくなりました。***


IoTこたつのパイオニアになりたい
以上ありがとうございました！
vimを触った事がない人へ最低限の知識で編集する


# 先日 
IDEを中心で使っているエンジニアに
crontabの書き換えを教える必要がありましたが
そもそもvimの操作ができないと説明が難しかったので
普段IDEやGUIを中心で使わない人へ急ぎ
「vim使える？」　となった場合に
「簡単な修正なら・・・」　と言えるようになって欲しい！！

だって、「できません」とか簡単に言いたくないじゃん

:dancer:

# 必ず使うvimのモード
- ノーマルモード （起動した直後の最初のモード）
- インサートモード　（ノーマルモードからiを押すと入れるモード）

があります。（他にも便利なモードがあります）

# 起動した時(vim program.php や crontab -e 等)
最初はノーマルモードで実行されます。
直接的な文字の入力はできませんがiを押すことでインサートモードに入ることができます。
ESC でノーマルモードに戻れます。
起動 -> i (インサートモードに) -> ESC （ノーマルモードに） -> i (インサートモードに) -> ... -> :wq か :q!
超簡単にはこのような編集の流れです。

# ノーマルモードでやること（起動した直後）
- ファイルを保存して終了
- ファイルを保存しないで終了
- 元に戻す
- やり直し

をやりたい時はノーマルモードで

# インサートモード
- キーボード入力で文字を入力したい

をやりたい時はインサートモードで！

# モードがわからなくなったら
ESCを押してノーマルモードに戻りましょう、連打しても良いです。
（それでも戻れなかったら:qかもしれませんがほとんどはESCでノーマルモードに戻れます）

# ノーマルモードでのコマンド一例
## :q!
ファイルを保存せずに終了する。

## :wq
ファイルを保存して終了する。

## hjkl

カーソルを移動する
hで左、jで下、kで上、lで右

## u
元に戻す

## ctrl-r
やり直し

## :set number
行数を表示します。

:four_leaf_clover:

# まとめ
1. 起動したらiでインサートモードに入り編集する
2. 修正が終わったら ESC を押してノーマルモードに戻る
3. OKなら :wq で保存、　やっぱやめたなら :q!
でとりあえず編集できます！

:writing_hand:

# 他にも
vimにはとても便利な機能がたくさんあります。
文字を入力して保存できるぐらいは安心してできるようになったら
他のノーマルモードでのコマンドやヴィジュアルモードを使ってみてください。
ノーマルモードからi以外でもインサートモードに入る便利な色々ありますので興味を持ったら他のコマンドも
:star2:

# 注意
crontab の編集は必ずしもvimが動くわけではありません。環境により異なる場合があります。
:dancer::dancer_tone1::dancer_tone2::dancer_tone3::dancer_tone4::dancer_tone5:
ES2015のexportをするIndexファイル自動生成

ES2015の `import` と `export` はそれぞれ構文が幾つかあってちょっとややこしいネ。

コンポーネントをモジュールで分けてたり、Atomicデザインでコンポーネント設計してるときなど、`export default` してるファイルを一々 `import` で呼び出すのが面倒になることがあります。

```javascript
import Sidebar from '../organisms/Sidebar.vue'
import Header from '../organisms/Header.vue'
...
```

呼び込むモジュールが増えるととても冗長です。

## index.jsにexportをまとめる

そこで、`export default` したファイルを一旦 `index.js` で一括で読みこみ、まとめて `export` するようにしてみます。

```javascript:index.js
export { default as Sidebar } from '../organisms/Sidebar.vue'
export { default as Header } from '../organisms/Header.vue'
```

`export default` でエクスポートしたファイルは `export { default }` という名前でも受け取れる。`default` として受け取ったモジュールを名前付きで再度exportし直しています。

上記のような `index.js` があれば以下のように呼び出し可能です。

```javascript
import { Header, Sidebar } from '../organisms'
```

一行で呼び出せるのでとてもスッキリしていい感じですね。さらにコンポーネントの名前は名前付きexportなので、typoのままコンポーネント名を使ってしまうみたいなミスはなくなりそうです。

## index.jsを作るのが面倒問題

コンポーネントが追加、移動等の度に `index.js` を手動で書き直すのは面倒です。なので、ビルド時などにフックして自動生成するスクリプトを作ります。

```javascript:generate_index.js
const fs = require('fs')

// index作成対象のディレクトリ
const targetDirs = [
  './src/components/atoms',
  './src/components/organisms'
]

// atomsとorganismのindex.jsを作成
targetDirs.forEach(function (dir) {
  // ファイル読み込み
  fs.readdir(dir, (err, files) => {
    if (err) throw err
    const content = makeIndexContent(files)
    fs.writeFile(dir + '/index.js', content, function (err) {
      if (err !== null) console.log(err)
    })
  })
})

// ファイル一覧からexportの文を作る
function makeIndexContent (files) {
  let content = ''
  files.forEach(function (item) {
    const file = item.replace('.vue', '')
    if (file === 'index.js') { return }
    content += 'export { default as ' + file + ' } from \'./' + file + '\'\n'
  })
  return content
}
```

このスクリプトを例えば `npm run dev` で dev-server を立ち上げた際に実行する、みたいにしておけば、その度 index.js が更新されるので、間違いがなさそうです。

## さいごに

そんな感じで現在のプロジェクトでは運用してますが、本当にこんな力技な事しないといけないのか、甚だ疑問ではある（調べた時にはわからなかった）ので、より良い方法、そもそもなツッコミがあれば是非コメント頂きたい次第でございやす。
ゼロから始めるLINEBot(AWS×node.js) ③投稿された画像をS3に保存

前回の記事の続きです。
ゼロから始めるLINEBot(AWS×node.js)②オウム返しする
https://qiita.com/tenn25/items/498f768a58ba6a6de156

# この記事で分かること
- LINEに投稿された画像をS３に保存する

# この記事の対象者
- いろいろと初心者(自分がそうなので)
- MessagingAPIのような外部APIを使ったことがない
- AWSもあんま詳しくない(アカウントは持ってるくらい)

# 流れ
第1回　とりあえず動かす
1.LINE Developersの登録/設定
2.実装(Lambda/node.js)
3.定期実行の設定(CloudWatch)

第2回 オウム返しの実装
4.ドメイン取得,DNS設定,SSL証明書の設定(Route53/ACM/SNS/S3)
5.イベントの受け取り(APIGateWay)
6.ユーザへの返信(Lambda/node.js)

**第3回 ユーザ情報や投稿画像の保存(この記事)**
**7.ストレージ(S3やDB)との連携**

# 投稿画像の取得

投稿からS3保存までの流れは以下の通りです。
①ユーザがLINEに画像を投稿する。
②画像は一旦LINEサーバに保存され、WebHookによって、APIGateWayが叩かれる。
③APIGateWayの裏でLambdaが実行される。
④Lambdaの処理でLINEサーバへ画像を取得する。
⑤Lambdaの処理でS３に画像を保存する。

S3への保存ファイル名は「ユーザID/現在時刻.jpg」としようと思います。

LINEにメッセージが投稿されると、WebHookを通じてLambdaにリクエストが届きますが、
リクエストのevent.events[0].message.typeがimageであれば画像が投稿されたと判断できます。

画像は一旦LINE側のサーバに保存されているようなので、
https://api.line.me/v2/bot/message/{messageId}/content
に対してGETリクエストを投げる必要があります。

GETリクエストの結果をdataとしてバッファに流し込めばS3に転送できそうです。

```js:index.js

var https = require('https');
var AWS = require('aws-sdk');

AWS.config.update({
    accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY,
    region: process.env.AWS_S3_REGION
});

exports.handler = (event, context, callback) => {

    //リクエストを取得
    event = event.events[0];
    var replyToken = event.replyToken;
    var message = event.message;
    var userId = event.source.userId;


    if(message.type === 'text'){
        //テキストが投稿された場合の処理はこちら

    }else if(message.type === 'image'){
        //画像が投稿された場合の処理はこちら
        var s3 = new AWS.S3();
        var message_id = message.id;

        //投稿された画像はmessage_idによって取得
        var send_options = {
            host: 'api.line.me',
            path: '/v2/bot/message/'+ message_id +'/content',
            headers: {
                "Content-type": "application/json; charset=UTF-8",
                "Authorization": " Bearer " + process.env.CHANNEL_ACCESS_TOKEN
            },
            method:'GET'
        };

        var data = [];

        //LINEサーバに対してリクエストを投げると画像(data)が取得できるのでS3に保存する
        var reqImg = https.request(send_options, function(res){
            res.on('data', function(chunk){
              data.push(new Buffer(chunk));
            }).on('error', function(e){
              console.log("ERROR: " + e.stack);
            }).on('end', function(){
                //ここらへんはPromiseで書いた方がいいかもしれない
                
                //ファイル名として現在時刻を取得
                var nowDate = new Date();
                var nowTime = nowDate.getTime();

                var params = {
                    Bucket: process.env.S3_BUCKET_NAME, // ←バケット名
                    Key: userId + '/' + nowTime + '.jpg', // ←バケットに保存するファイル名
                    Body: Buffer.concat(data)
                };
                s3.putObject(params, function(err, data) {
                    context.done();
                });
            });
        });
        reqImg.end();
    }
};

```

node.jsの話になってしまいますが、
④Lambdaの処理でLINEサーバへ画像を取得する。
⑤Lambdaの処理でS３に画像を保存する。
このへんが非同期処理になってしまうため、
④が完了してから⑤が開始するようになんらか工夫する必要ああります。(上記の書き方かPromiseを使うなど)
英語への抵抗を無くすための勉強

リブセンスのマッハバイトという事業でフロントエンドエンジニアをやっています、[rukiadia](https://qiita.com/rukiadia)です。入社してもうじき半年経ちます。

今回は「学」がテーマのアドベントカレンダーということで、自分なりにやっている英語の勉強法の話に触れていこうと思います。

# そもそも何故英語を勉強しているのか

英語への抵抗を無くしたいというのが大きな理由です。

以前から英語は勉強しないとなーという気持ちはあったものの、そのモヤモヤ感を払うための行動はきちんと起こせていませんでした。「まあ、なんとかなるだろう」という気持ちがどこかにあったのです。

そんな中、去年の１1月に「DevFest.Asia 2016 Singapore」という海外のカンファレンスに行く事に決め、単身海外に行ってみました。

カンファレンスの合間合間に３０分~４０分の長めの休憩があり、そこでコーヒーやビールを呑みつつ周りの参加者と交流をすることが出来るようになっています。
人見知りの自分はそういう場では静かにしていることが多いのですが、向こうのイベントではフレンドリーに話しかけてくる人が必ずいて、静かに過ごす事が殆ど出来ませんでした＼(^o^)／。
（席にいても陽気なおじさんに肩をいきなり組まれたりします）

そんな感じで積極的にコミュニケーションを図ってくれる人が多く、僕の方も怪しい手探り英語で必死に話をしていた気がします。それなりに話は出来たのですが、自分にもっと英語力があれば、もっと多くの話が出来たと思います。

勉強をサボってきた事をこれほど後悔した日はありませんでした。

# 普段、どんな事をしているのか

僕が普段、習慣的にやっていることを書いていきます。

## Quoraを読む

https://www.quora.com/

いわゆる質疑応答サイトです。技術的な話だけでなく、本や数学の話、コーヒーに関する話などテーマは様々です。これを知ったのは、前職の同僚が紹介してくれたからなのですが、地味に気に入っていて習慣的に読むようになっています。

文章を読むことに関しては習慣化出来たのですが、質問を自分から投稿することがまだ出来ていないので今年中に一度はやっておきたい・・・というのが目下の課題ですね。

## TEDを観る

https://www.ted.com/

プレゼンを上手くやりたいと悩んだ事のある人にとっては、お馴染みのサイトかもしれません。

- プレゼンのコツを盗みたい
- 聴き取りやすい英語を聴きたい
- 興味のある話を聞きたい

僕がTEDを見始めたのがこの辺りの理由です。

特に「自分が興味のある話を聞く」というのが、行動を習慣にするために重要な事だと考えています。
リスニングの練習のために英語のニュースを聞いてみたりもしたのですが、内容にあまり興味を持てず、すぐに飽きてしまいました。

スマホのアプリでも聴けるので、興味のある方はダウンロードしてみると良いと思います。

## 洋画を注意深く観る

自分は元々映画を観るのが好きなので、勉強のために意図的に観るようにした訳ではありません。
字幕を出さず、英語を全て聴きとるというストイックな事をしている訳でもありません。

僕がやっているのは俳優の台詞を注意深く聞くことだけです。
「Amazonプライムビデオで映画を見つつ、上手く俳優のセリフを聞き取れるかを試す」みたいな事をよくやっています。動画配信サービスであれば、聴き逃した箇所を巻き戻して何度も見れるので非常に便利です。

# まとめ

僕が普段やっていることを簡単に列挙してみました。

例を３つあげてみましたが、それぞれに共通しているのは「何かを学ぶついでに英語に慣れることが出来る」という点です。いくら英語の勉強をしたいといっても、「単語帳を読む」「TOEICを受ける」のような仰々しい理由をつけても、自分の場合は長続きしませんでした。

いくら立派な計画を立てても、継続が出来なければ何の意味もありません。英語に限らず、人それぞれに最適な学習方法やペースがあると思うので、それを模索していくのが大事だと考えています。

Livesense Advent Calendar 「学」の4日目はこんな感じで締めとさせて頂きます。
sourcetreeでbitbucketにssh接続ができても再起動すると毎回permissionエラーが出るのを直す

表題の事象がずっと続いていて、原因がよくわからず毎回sshkeyを作り直したりhttp接続で我慢したりしていたのですが、解消法がわかったのでメモします。
MacOS Sierra(10.12.6)
Sourcetree(Version2.7)Embedded Git2.10.1

https://apple.stackexchange.com/questions/254468/macos-sierra-doesn-t-seem-to-remember-ssh-keys-between-reboots

このページの通りなのですが、原因はSSHエージェントがキーチェーンにあるパスフレーズを再起動すると忘れてしまうのが原因のようです。なので忘れないように.bash_profileに記載します。

####vimで.bash_profileを開く
```
vi ~/.bash_profile
```
####以下を追記
```
ssh-add -A 2>/dev/null;
```

これで再起動してもssh接続ができるようになりました
WindowsのターミナルはCmderを推していきたい

Windows 10に入ってからBash on Windowsが出てきたりとかなりターミナル環境も整備されてきたのですが、ここで改めてWindows用ターミナルとしてCmderを推していきたいです。

# Cmderのここがすごい！
## タブ機能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152713/a73c3b38-8871-721d-1d1b-ccb33f348c0f.png)

minttyなどに対してCmderにはタブ機能があります。`Ctrl + T`で新規タブを作成し、`Ctrl + 数字キー`でn番目のタブに飛べるのでiTerm使ってる人にはとてもうれしい。

設定からシングルインスタンスモードにすると、追加起動したときに同一ウィンドウでタブ作ってくれるのでありがたい。

## シェルを選べる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152713/0471a305-e86e-9be0-ed24-1d4d6e678abf.png)

タブ作成時に起動するシェルを選択できます。引数とかカレントディレクトリとかも細かく指定できるのでいい感じ。

私はDocker ToolboxのDocker Quickstart Terminalとか、Bash on WindowsのBashとかを足して普段使いにしてます。

## 右クリックメニューに登録できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152713/d94a51f5-f30a-1703-e1f0-1fb29b27a0d0.png)

[Cmderをエクスプローラの右クリックメニューから開く『Cmder Here』](https://syon.github.io/refills/rid/1498646/)
Cmderもminttyやコマンドプロンプトと同様に右クリックメニューに追加できます。

# Cmderのここがダメ！
## Unicode絵文字非対応
これはCmderのベースになってるConEmuの仕様っぽいです。GithubのIssueにも上がってたのでそのうち実装されるかも。

# Cmderはいいぞ
簡単にBash on Windowsと組み合わせられてるとなると、タブ機能のあるCmderが一層便利になった印象です。みなさんもCmder使ってみてはいかがでしょうか。
組合せ最適化でエデンの園配置を証明する

Advent Calendar 3日目の記事 [組合せ最適化でボンバーパズルを解く](https://qiita.com/SaitoTsutomu/items/d1c9d34d17f8c7ec475e)
Advent Calendar 5日目の記事 [組合せ最適化でステンドグラスを解く](https://qiita.com/SaitoTsutomu/items/12b2562d13543a4180a3)

## これなに

エデンの園配置をしっていますか？

> エデンの園配置とは、セル・オートマトンにおいて他のいかなる配置からも到達できない配置を指す。
~~~~ [エデンの園配置 - wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%87%E3%83%B3%E3%81%AE%E5%9C%92%E9%85%8D%E7%BD%AE)より

セル・オートマトンの一種である[ライフゲーム](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)の下記のエデンの園配置が本当にそうか確かめてみましょう。

![](http://wwwhomes.uni-bielefeld.de/achim/icons/orphan_12x8_96_57.gif)

- 参考：[Achim's Game of Life Page](http://wwwhomes.uni-bielefeld.de/achim/orphan_9th.html)

組合せ最適化で使われるソルバーは、全ての組合せを調べてくれます。ソルバーで答えが出ないことがわかれば、エデンの園配置であることが証明できます。

## 考え方

ライフゲームで許される条件を数式で表現します。

- 現在＝生：
    - 過去＝生、過去の周り8マス＝2
    - 過去の周り8マス＝3
- 現在＝死：
    - 過去の周り8マス<=1
    - 過去＝死、過去の周り8マス＝2
    - 過去の周り8マス>＝4

OR条件は、線形式で表現できないので、0-1変数を使って場合分けします。

- 参考：[パズルでみる組合せ最適化のテクニック - IF条件](https://qiita.com/SaitoTsutomu/items/f05f4ff05d4ce6099ff3#if%E5%88%B6%E7%B4%84)

## Pythonのプログラム

1つ前の状態を計算するプログラム(`solve`)は下記のようになります。

```py3:python
import pandas as pd, matplotlib.pyplot as plt
from pulp import LpProblem, LpStatus, lpSum, value
from ortoolpy import addbinvar, addbinvars
def solve(data):
    ni,nj = len(data),len(data[0])
    a = pd.DataFrame([(i,j,data[i][j]!='.') for i in range(ni)
        for j in range(nj)], columns=list('行列値'))
    a['Var'] = addbinvars(len(a))
    m = LpProblem()
    for _,r in a.iterrows():
        v = lpSum(a.query(f'{r.行-1}<=行<={r.行+1}&{r.列-1}<=列<={r.列+1}').Var)-r.Var
        if r.値: # 3 <= v+x, 2v+x <= 7
            m += v + r.Var >= 3
            m += 2*v + r.Var <= 7
        else: # v+x <= 2 or >=4
            y = addbinvar()
            m += v + r.Var <= 2 + 7*y # y==0 → v+x <= 2
            m += v         >= 4*y     # y==1 →   v >= 4
    m.solve()
    print(LpStatus[m.status])
    if m.status==1:
        a['Val'] = a.Var.apply(value)
        plt.imshow((a.Val<0.5).values.reshape(ni,nj), cmap='gray', interpolation='none')
        plt.show()
```

## 確認その1

最初に、`solve`が1つ前の状態を計算できているか、簡単な例で確かめてみましょう。
（下記は、エデンの園配置ではなく[グライダー](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%82%A4%E3%83%80%E3%83%BC_(%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0))です）

```py3:python
solve("""\
.#.
#..
###""".splitlines())
>>>
Optimal
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/cdd18d29-7967-15de-3714-e627f2296150.png)

`Optimal`なので、解が存在します。確かに、図の状態から1ステップ進めると、入力の状態になることが確認できます。`solve`が1つ前の状態（の1つ）を計算できているのが確認できました。

## 確認その2

```py3:python
solve("""\
.##..#.##...
#..##..#.#.#
.#.#.##.#.#.
#....##..##.
.###...#....
..#.#.##.#..
.#.##...#.#.
#....#.#....""".splitlines())
>>>
Infeasible
```

今度は、`Infeasible`[^1]です。確かに、エデンの園配置のようです。

[^1]: 2018/10/25、筆者のPRでバグが修正されて「Infeasible」と表示されるようになりました。 [fix: issue-171, add MIP Infeasible status](https://github.com/coin-or/pulp/pull/172#event-1924585344)
以上
プログラミング初心者のためのpython[超入門編]ver.1

#A3とピーちゃんの出会い

　あるところに[python](https://ja.wikipedia.org/wiki/Python)でプログラミングを始めようとおもったけど、何から手をつけてよいのかわからないA3というひよこがおりました。なぜA3という名前なのかは後程・・・・

　とりあえず、[Anaconda](https://www.anaconda.com/what-is-anaconda/)というものをインストールして、パソコンを開くとspiderというよくわからないものが入ってたので、A3はこのspiderを使ってpythonのコードというものを入力することにしました。しかし、思い通りに動かないのです。

そのため、A3はpythonでコードを書くのがいやになってしまいたまごの殻に引きこもることに決めました。
すると、[データサイエンス](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9)に興味があるピーちゃんがA3に声をかけてきました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/da44bfec-ea0f-bba9-ccf7-33842765fdd2.png)ピーちゃん：なんで**たまごの殻**がついてるの？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ea7d1f9a-eb82-67a0-4bb5-d419fcd74e8d.png)A3:　プログラミングが嫌いだし、人生に疲れたから**引きこもることにしたの**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/da44bfec-ea0f-bba9-ccf7-33842765fdd2.png)ピーちゃん：pythonだけでもできるようになると**お金持ちになれるよ！**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ea7d1f9a-eb82-67a0-4bb5-d419fcd74e8d.png)A3:　**お金の亡者はお引き取りください**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/da44bfec-ea0f-bba9-ccf7-33842765fdd2.png)ピーちゃん：ビックデータの時代にデータ分析能力を持つものは世界を制す！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ea7d1f9a-eb82-67a0-4bb5-d419fcd74e8d.png)A3:　なんか変なひよこに絡まれてるんだけど。。。。。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/da44bfec-ea0f-bba9-ccf7-33842765fdd2.png)ピーちゃん：A3ちゃんの**今日の運勢**占ってあげるよ💖
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ea7d1f9a-eb82-67a0-4bb5-d419fcd74e8d.png)A3:　**結構です。**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/da44bfec-ea0f-bba9-ccf7-33842765fdd2.png)ピーちゃん：占い結果でたよ。**大凶だって**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/4e6671f5-96ba-f29d-9f6c-693b49448c6f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/ea7d1f9a-eb82-67a0-4bb5-d419fcd74e8d.png)A3:　あのね。引きこもりのひよこに大凶ってひどくね？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/da44bfec-ea0f-bba9-ccf7-33842765fdd2.png)ピーちゃん：これpythonで作ったの。ほらみて！[if文](https://udemy.benesse.co.jp/development/python-if.html)でこんなこともできるんだよ☆
# Spyderを使ってpythonコードを実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/eef15500-c8b9-58b2-9cef-e6905011c5e1.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/6bf0524d-0c0d-cecb-2f7d-e5a14585c09a.png)A3:　if文…なにそれ。ちょっとおもしろそうだね
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/da44bfec-ea0f-bba9-ccf7-33842765fdd2.png)ピーちゃん：まず基本的なコードの書き方を覚えていこ！**一緒にpython勉強してお金持ちになろうよ！**













そんなことから、二匹のひよこはpythonでデータサイエンスでもしかしたらお金持ちになれると期待して勉強を始めることにしました。しかし、数学の知識も、英語の知識も、プログラミング知識も、ビジネス力もないのでお金持ちへの道のりは険しそうです。
#if文で今日の運勢を占う：ピーちゃんが作成したコード
```
import random
uranai = random.randint(1,10)
print(uranai)

if uranai == 1:
    print("大吉！何をやってもうまくいくラッキーDAY☆")
elif uranai == 2:
    print("中吉☆好きな子がいたら声かけて♡仲良くなれるかも")
elif uranai <= 4:
    print("小吉　本屋で前から欲しかった情報が手に入りそう")
elif uranai <= 7:
    print("凶　今日は寄り道せずまっすぐ帰ろう！")
else:
    print("大凶　明日があるさ☆")

```
KituraでサーバーサイドSwift

おはようございます、Sankameと申します。
業務では主にPHPを使ってますが、SwiftでもWebページを作れるようになったと知って、自宅でやってみました。
練習してたのが半年ほど前なので、内容が古いかもしれない点はご了承下さい。

# お題
DBを使わないライトな課題ということで、年号の表示とカレンダーを作ってみました。

- <a href="https://jyear.net" target="_blank">西暦と年号</a>
- <a href="https://jyear.net/cal" target="_blank">カレンダー</a>

ソースコードは<a href="https://github.com/Sankame/jyear" target="_blank">こちら。</a>
Java畑が長かったので、Swiftならこんな書き方できるよ、などのプルリク頂ければ幸いです。

# フレームワーク選定
サーバーサイドSwiftのフレームワーク兼HTTPServerは色々あります。
各フレームワークの性能比較をした<a href="https://medium.com/@rymcol/benchmarks-for-the-top-server-side-swift-frameworks-vs-node-js-24460cfe0beb" target="_blank">ブログ</a>などを見て、<a href="http://perfect.org/" target-"_blank">perfect</a>の評価が高かったので試してみましたが、確か"Get Started"でつまずき断念しました。

次に、Kituraを検討しました。
KituraはQiitaなどで導入事例が多く、また、<a href="https://hub.docker.com/r/ibmcom/kitura-ubuntu/" target="_blank">サンプルのdockerイメージ</a>を落としてきたらサクッと動いたので、それをベースに進めることにしました。
Swift自体のサポートOSもLinuxは<a href="https://swift.org/download/#using-downloads" target="_blank">Ubuntuだけ</a>なので、その点でもdocker上で開発した方が楽かもしれません。
僕は開発環境がMac、本番環境がCentOSだったので、そうしました。

# 感想
<a href="https://ibm-swift.github.io/Kitura/" target="_blank">API仕様書</a>やKitura関連の記事が結構あるため、あまり実装で困ることはないです。

ただ、Kituraがサポートしている、<a href="http://stencil.fuller.li/en/latest/builtins.html" target="_blank">stencil</a>というテンプレートエンジンは機能が少なく、なるべくサーバーサイドでデータを加工して渡すなどの工夫が必要でした。
ソースコード内で月ごとのテンプレートをそれぞれ用意しているのも、確か、stencilの制約からだったと思います。

先日、サーバーサイドKotlinも発表されたので、個人的にはSwift推しでいくかは少し様子見の状態ですね。

# その他
Swiftの実行結果を手軽に確認するのに、下記ツールを重宝しました。
コードの共有もできるので便利です。
同種のツールの中では一番使いやすく、Swiftに対するIBM社の本気度を感じます。(KituraもIBM社です)
<a href="https://swift.sandbox.bluemix.net/#/repl" target="_blank">IBM Swift Sandbox</a>
Sketchの便利なプラグイン

最近使って便利だなーと思ったプラグインを紹介します！
もし「知らなかった！」というものがあれば、ぜひインストールして試してみてください。

[:runner_tone3:Sketch Runner](http://sketchrunner.com/)
これがないと始まらないというくらい、自分にとって欠かせないです。

[:ring:Automate Sketch](https://github.com/Ashung/Automate-Sketch)
Runnerと併せて使うことで作業効率が劇的にアガります。自分の使い方だとSlice作成時の手間がなくなりました。

[:robot:Craft](https://www.invisionapp.com/craft)
色々できるやつ。inVision連携でさらにプロトタイプ作成効率向上バフ効果も。

[:writing_hand_tone2:Paster](https://github.com/Volorf/Paster)
クリップボードの内容をダイレクトにペースト。地味に便利なやつ。

[:japanese_ogre:Sketch Plugin Monster](https://github.com/PeachScript/sketch-plugin-monster)
プラグイン入れすぎても大丈夫。
OpenFOAMのpostProcessについて

#postProcess
OpenFOAMで気が付いたら入ってきていた機能。
先日の24耐合宿で質問があったので、メモとして残します。
この記事はv1706で動作を確認しています。

#patchAverageとか使えなくなったとき
ネット上の資料を見ていてpatchAverageとかが使えないときはpostProcessが導入されたバージョンである可能性がある。


#postProcessの使い方
patchAverageなどが使えなくなったのは、コマンドがなくなったのではなく、postProcessを使うようになっただけ。
パッチ面「outlet」の速度Uに対してpatchAverageを使うには次のようにコマンドを入力する。

```
postProcess -func 'patchAverage(name=backstep_outlet, U)'
```

vorticityなどは以下のように実行できる。

```
postProcess -func vorticity
```

ただし、wallShaerStress、yPlus等はsimpleFoamが必要になる。

```
simpleFoam -postprocess -func yPlus
```

この時にはfvSoutionにSIMPLEの項目がないとエラーになる。どうも計算にturbulenceModelが必要なユーティリティはsimpleFoamがいるらしい。

#まとめ
実は公式サイトのマニュアルに記載があるのでユーザーサイトとかで見つからない場合は公式のマニュアルを見に行くことも重要。

https://cfd.direct/openfoam/user-guide/post-processing-cli/#x31-2470006.2.3

とりあえずコマンドを打ってみても、コマンドが変わったことを教えてくれるので、OpenFOAMではとりあえず実行が重要。
Amon2をさくらVPSで動かす

ネットで調べたら古い情報も多くて困ったので...

#やりたいこと
- Amon2を独自ドメインかつさくらVPSで動かす

#環境
- Ubuntu16.04
- Apache/2.4.18

#前提
- hogeユーザーで行う
- [Perlの環境構築](https://github.com/perl-entrance-org/workshop-2014-01/blob/master/build_perl.md)と[Amon2入門](https://github.com/perl-entrance-org/Perl-Entrance-Textbook/blob/master/amon2/1.md)で、Hello Amon2まで表示されている.
- 上記URLと同様にカレントに`Scheduler`がある.

#作成
## scheduler.shを作成する
```shel
#!/bin/bash
export PATH="$HOME/.plenv/bin:$PATH"
eval "$(plenv init -)"
exec plenv exec carton exec plackup script/scheduler-server
```

##Supervisorの設定
##Supervisorのインストール
```
pip install supervisor
```
とりあえずPython2.x系で動いてます。

##ディレクトリの作成
```
mkdir /var/log/supervisord
mkdir /etc/supervisord.d
```
###supervisord.confの作成
```/etc/supervisord.conf
[unix_http_server]
file=/var/run/supervisor.sock

[supervisord]
logfile=/var/log/supervisord.log
loglevel=debug
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=1024
minprocs=200
environment=SHELL="/bin/sh"

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
history_file=~/.sc_history

[include]
files=/etc/supervisord.d/*.ini

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface
```

###supervisord.iniファイルの作成
```/etc/supervisord.d/supervisord.ini 
[group:supervisord]
programs=schedulersupervisord.ini 

[program:scheduler]
numprocs=1
autostart=true
autorestart=true
startsecs=5
user=hoge
redirect_stderr=true
stdout_logfile=/var/log/supervisord/scheduler_out.log
stdout_logfile_maxbytes=0
stdout_logfile_backups=0
stderr_logfile=/var/log/supervisord/scheduler_err.log
stderr_logfile_maxbytes=0
stderr_logfile_backups=0
#environment=HOME="/home/hoge/Scheduler",USER="xxxx", PATH="$HOME/.plenv/bin:$PATH"
directory=/home/hoge/Scheduler/
command=bash /home/hoge/Scheduler/scheduler.sh
```

###apacheの設定
```/etc/apache2/sites-available/000-default.conf 
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /home/hoge/Scheduler/

    ProxyPass / http://[取得した独自ドメイン].com:5000/
    ProxyPassReverse / http://[取得した独自ドメイン].com:5000/

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.xxxxxn\.com$
    RewriteRule ^/(.*) http://[取得した独自ドメイン].com/$1 [R=301,L]
</VirtualHost>
```

# Hello Amon2 :)
```
sudo supervisorctl reload
sudo supervisorctl stop
sudo supervisorctl start
```
あとはこの辺で起動して独自ドメインでアクセスすると、Hello Amon2が表示されます :)

                              
#参考
[Amon2 アプリのデプロイ](http://snippets.feb19.jp/?p=745)
[Supervisorでamon2アプリのデーモン化 with plenv](http://tech-mr-myself.hatenablog.com/entry/2013/05/15/172118)
[SuperVisor導入(基本編)](http://blog.hakutoitoi.com/?p=343)
[supervisorctlについて調べてみた](http://papix.hatenablog.com/entry/2015/08/05/131113)
play2.6でtemplateやらroutesでUnusedな警告が出るのを消す

## play2.6でtemplateやらroutesで覚えのないUnused警告を消したときのメモ
scalacオプションに以下を追加すると、

``` build.sbt
scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-Xlint")
```

こんな警告が出た。

``` sbt.compile
[warn] $HOME/workspace/my-item-search/conf/routes: Unused import
[warn] $HOME/workspace/my-item-search/conf/routes: Unused import
[warn] $HOME/workspace/my-item-search/conf/routes: Unused import
[warn] $HOME/workspace/my-item-search/conf/routes: Unused import
[warn] $HOME/workspace/my-item-search/conf/routes: Unused import
[warn] $HOME/workspace/my-item-search/app/views/footer.scala.html:1: Unused import
[warn] <div class="footer">
[warn] ^
[warn] $HOME/workspace/my-item-search/app/views/header.scala.html:1: Unused import
[warn] @(headerTitle: String)(userName: String)
[warn] ^
[warn] $HOME/workspace/my-item-search/app/views/index.scala.html:1: Unused import
[warn] @*
[warn] ^
[warn] $HOME/workspace/my-item-search/app/views/main.scala.html:1: Unused import
[warn] @import controllers.routes
[warn] ^
[warn] $HOME/workspace/my-item-search/app/views/menu.scala.html:1: Unused import
[warn] @(userName: String)
[warn] ^
[warn] $HOME/workspace/my-item-search/app/views/sidebar.scala.html:1: Unused import
[warn] <div class="side-bar">
[warn] ^
[warn] 11 warnings found
```

以下が参考になる。

+ [https://github.com/playframework/playframework/issues/7382](https://github.com/playframework/playframework/issues/7382)
+ [https://github.com/playframework/twirl/issues/105](https://github.com/playframework/twirl/issues/105)

要するに、viewに関してはデフォルトで↓みたいなのが勝手にimportされているがtemplate内で呼び出してないからUnused警告が出るらしい。

``` xxx.scala.html
import play.twirl.api._
import play.twirl.api.TemplateMagic._
```

解決策は、まずbuild.sbtに以下を追記する。

``` build.sbt
TwirlKeys.templateImports := Seq.empty
```

しかし、こうするとviewのroutesとかHtmlタイプとかがエラーになるので、それぞれ個別に
importする必要がある。

``` main.scala.html
@import controllers.routes
@import play.twirl.api.Html
```

routesの警告に関しては、AssetがUnusedらしい。
build.sbtとroutesのassetsを下記のようにする。

``` build.sbt
import play.sbt.routes.RoutesKeys
RoutesKeys.routesImport := Seq.empty
```

``` routes.
GET     /assets/*file              controllers.Assets.at(file)
```

で、scala.htmlはこんな感じにする。

``` main.scala.html
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
```

元々は↓のようにしていました。

``` build.sbt
GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)
```

``` main.scala.html
<link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
```

詳細は以下を参照。

+ https://www.playframework.com/documentation/2.6.x/AssetsOverview
Scratch3.0 を Androidアプリとして動作させてみよう (2)

昨日の続きです。以下のような感じで進めるのでした。

1. Cordovaをインストール
2. Cordovaで、ブラウザーアプリを動作させる
3. Cordovaで、Androidアプリを作成してみる
4. Scratch3.0 を、ビルドしてサーバを経由しなくても動作するようにする
5. 4で作成したScratchアプリをCordovaに移植してみる
6. Scratch3.0をCorodovaブラウザーアプリとして動作させてみる
7. Scratch3.0をAndroidアプリとして動作させてみる。

2まで進んでいます。

# Cordovaって何?

今回、Scratch3.0 の アプリを Androidアプリとして動作させるために、Corodavaを使います。
https://cordova.apache.org/docs/en/7.x/guide/overview/index.html

Cordovaは、Webブラウザーで動作する、ホームページやゲームを、アプリ化するフレームワークです。 Cordovaを使えるようになると。 HTML5, CSS3,JavaScriptで作られた作品を、 AndroidやiOSやDesktopアプリに変換することができるようになります。



# Android アプリを作成してみよう

では、Androidアプリを作成して見ましょう。
https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html

1. Android Studioをダウンロードするする
https://developer.android.com/studio/index.html

2. Android Studio をインストールする
ダウンロードした Android Studioを起動してみてください

3. Android Studio で、 Hello World を作成してみる
"Android Sutdio hello world" とかで、ググールしてみてね、



# Cordovaで、WebページをAndroidアプリ化してみよう

Androidアプリを作成することができるようになりました。
CordovaのHello Worldアプリを Androidアプリかして見ましょう
https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html

1. npm install -g cordova
2. cordova create MyApp
3. cd MyApp cordova platform add browser
4. cp -r {this www} ./www
5. cordova run browser
6. cordova platform add android
7. cordova build android
8. cordova run android

はい、5までが、前回までにやったことですね
順番に進めると、無事、Android アプリが起動します。

![スクリーンショット 2017-12-03 23.36.57.png](https://qiita-image-store.s3.amazonaws.com/0/54192/e4217dbe-532c-1a6a-8357-b01ab0161b8b.png)


# 困った時はググる

大体の場合は上手くビルドできません。
私も今回は「Error: spawn EACCES」　というエラーがでて、ビルドできませんでいした。

そういった時は、”cordova run android Error: EACCES” みたいに、キーワードを含めてグーグル検索して見てください。対処方法が見つかるはずです。

例えば以下のような、答えを見つけることができます。
https://github.com/ionic-team/ionic-cli/issues/2835



# PS
以下の場所でも、アレコレ書いていきます。
https://firefirestyle.blogspot.com/

[Scratch3.0 自分専用機 を作ろう!! (0)](http://blogger.firefirestyle.net/2017/09/scratch30-0.html)
[Scratch3.0 自分専用機 を作ろう!! (1) Scratch3.0をビルドしてみよう](
http://blogger.firefirestyle.net/2017/12/scratch30-1-scratch30.html)
[Scratch3.0 自分専用機 を作ろう!! (2) Scratch3.0 を Androidアプリとして動作させてみよう (1)](http://blogger.firefirestyle.net/2017/12/scratch30-2-scratch30-android-1.html)
[Scratch 3.0 自分専用機 を作ろう!! (3) Scratch3.0 を Androidアプリとして動作させてみよう (2)](http://blogger.firefirestyle.net/2017/12/scratch-30-3-scratch30-android-2.html)

[火の型 With Scratch 2.0 (プログラム入門) 　第00巻](https://firebook.firefirestyle.net/)
[炎の型 With Scratch 2.0 (ゲームプログラム入門)](https://firefirebook.firefirestyle.net/)
cloud9 のsave と git に関しまして

ちょっとした疑問です。
プログラミング歴2ヶ月の超ひよっこです。
現在cloud9でruby on rails のチュートリアルを勉強中なんですが、ふと疑問に思ったこと、、、

cloud9ってviewなどを編集してローカルで結果を確認しようと一旦saveする必要があると思います。
でも一旦saveしてしまうと、プログラミングしていたものが間違った時にbranch checkout や git resetなどを行っても以前のコミットに戻らない気がするのですが
気のせいでしょうか。
皆さまご教授頂ければ幸いです🙇
「いい感じのデザイン」で終わらせないために。ユーザエクスペリエンスの期間を考える。


アトラエに新卒デザイナとして入社してから、はや３ヶ月が経ちました。

この3ヶ月は、社内の3つのプロダクト全てを１ヶ月ごとに周るという体験をしました。
その中で一番難しく感じたことは、ロジカルにデザインをするということでした。

大半の人がが見て良いものは、結果的にはロジックを詰めたら良いものであることが多いため、ロジック詰めるのにエネルギーを使うことに面倒臭ささえ感じていました。
が、先日先輩にロジックないこっちの方がかっこいいかっこよくないは宗教戦争にすぎないと飲みの場で言われ、その言葉でハッとした1年目デザイナでした。


自分が今まで無意識のうちに考えてきたデザインは、どうロジックを組むべきかを考えた結果、[UX白書](https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxoY2R2YWx1ZXxneDo2NWIxZTQwMTdjYTU1YTNm)のユーザエクスペリエンスの期間に当てはめ、その機能がそこでどういう役割を果たす必要があるのかを明確にするという所に行き着きました。

#　UX白書：ユーザエクスペリエンスの期間とは？
ユーザエクスペリエンスの期間とは、UXには「予期的UX」「一次的UX」「エピソード的UX」「累積的UX」の４つの期間があるという考え方です。
<img width="566" alt="スクリーンショット 2017-12-03 23.07.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/217188/6c7bd42e-fd05-ba69-bb96-30289906be86.png">
> UXについて議論したり話したりする時には、対象とする期間を明確にすることが重要で、それらは一時的UX、エピソード的UX、累積的UXの3種類に分けられます。一時的UXに着目すると、あるユーザインターフェースに対するユーザーの感情的な応答について情報を得ることができます。それよりも長い期間に着目するならば、一時的UX群が累積的UXに与える影響が明らかになるでしょう。例えば、利用中に起こった強い否定的な反応の重要性は、成功体験の後にはとても小さくなっていて、否定的だった反応は最終的には違ったものとして記憶されるかもしれません。UXデザインとその評価を行う際に必要となる条件は、一時的UXに着目する場合と、エピソ ード的UXやさらに長い期間のUXに着目する場合とでは異なってきます。



# デザイン案をロジカルに構成していく
これを利用してデザイン案をロジカルに作っていきます。
まずはじめに、サービスのUX期間のサイクルを抽出し、次にその期間にユーザはどんな体験をしなければならないかを設計していきます。そうすることで、全体のUX体験が見え、線で繋がった体験が見えてきます。

そこから細かく分解して点としてデザインに落とし込んでいくと、一貫性のあるロジカルなデザインに落としこむことが出来ます。

例えば、ユーザが愛着が湧きやすいような仕掛けである一時的UXを取り入れることで、それが好感を持てるエピソード的UXに繋がり、最終的にはユーザの累積的UXが向上する。というようなロジックの組み方ができるようになります。


もう少しわかりやすいように追記していきます。

### 参考
UX白書
https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxoY2R2YWx1ZXxneDo2NWIxZTQwMTdjYTU1YTNm
UXデザインの教科書 [書籍]
https://www.amazon.co.jp/UX%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%AE%89%E8%97%A4-%E6%98%8C%E4%B9%9F/dp/4621300377/ref=sr_1_1?ie=UTF8&qid=1512311529&sr=8-1&keywords=ux%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8
Rで音声信号処理(2) Voice Activity Detection

Rで使えるNon-realtime Voice Activity Detection: [vadeR] (https://github.com/akinori-ito/vadeR) を書いたのでメモ。

# アルゴリズム
普通のVADは音声認識や電話の前処理なのでリアルタイム処理が前提だが，Rでリアルタイム性を気にしてもしょうがないので，非リアルタイムを前提にこんな感じのアルゴリズムにしてみた。
1. 入力音声をMFCCに変換
2. MFCC系列をk-meansでいくつかのクラスタに分け（デフォルトは３），入力をベクトル量子化する。
3. コードベクトルのうちパワーが最小のものを無音区間だとみなす。
4. 無音区間と音声区間の長さにしきい値を設け，短い区間は直前の区間に統合

これだけだ。最後の統合がめんどくさいが，本質的な部分はこんなコードで書ける。下記のコードでは，各フレームが音声区間かどうかが変数`vad`に格納される。

```:R
library(tuneR)
x <- readWave("speechfile.wav")
mfc <- melfcc(x)
cl <- kmeans(mfc,3)
sil <- which.min(cl$centers[,1])
vad <- cl$cluster!=sil
```

非常に単純なアルゴリズムであるが，それなりに動く。動作例はこんな感じ。
![クリップボード.png](https://qiita-image-store.s3.amazonaws.com/0/219428/39dce2b7-641a-355b-0e6a-9ee5d70622a8.png)
Macにログインできない。macOS could not be instead on your computer対処方法

##クソイライラしたので、めも
##新しく買ったMacBookProが以下の文書でログインできなくなった。

#以下のメッセージがログイン時に出てきた。
```
macOS could not be instead on your computer

The path /System/Installation/Packages/OSInstall.mpkg appears to be missing or damaged.

Quit the installer and try again.

```

どうやらMacがなんかの衝撃でダメージを受けていたみたい（多分野球行った時のリュックに入れたのが間違い）

#対処方法
いくつかあるみたいだが、ぼくは、
1.画面左上のappleマークをクリック
2.startup diskをクリック

これでなんとか今この投稿ができている。

すぐにappleストアに行ってこの2stepにお金を払う人が増えないための投稿でした。
Juliaで重複がないサンプリング

1から$n$までのリストから、重複が無いように$k$個（$n$以下でないといけない)の要素をサンプリングするという操作がそこそこの頻度で必要になる（復元抽出と非復元抽出のことだけど）。

単純にrandint的なことをやろうとすると標準で使える**rand**を使うと、重複ありのサンプリングが可能。

```julia
n = 10
k = 5
rand(1:n, k)

> 5-element Array{Int64, 1}:
   2
   3
   6
   5
   5
```

重複が望ましくない場合、**StatsBase**に入っているsampleを利用して、**replace**フラグを設定すれば良い。

```julia
using StatsBase
n = 10
k = 5
sample(1:n, k, replace=false)
> 5-element Array{Int64, 1}:
   5
   7
   4
   2
  10
```

----
- StatsBase.jl https://github.com/JuliaStats/StatsBase.jl
JavaScriptはnull以外のオブジェクトはtrue判定される

#JavaScriptはnull以外のオブジェクトはtrue判定される
```js
	var hoge = "nullじゃないよ";
	var fuga;

	if(hoge){
		console.log("hogeがtrue判定されたよ");
	}
	
	if(!fuga){
		console.log("fugaがfalse判定されたよ");
	}

/*実行結果--------------
hogeがture判定されたよ
fugaがfalse判定されたよ
-----------------------*/
```
AWS + Docker + Jenkins = 同一サーバで複数ドメインの開発環境構築

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@smiraxです。

以前新規事業を立ち上げた際に開発環境周りでいろいろと苦労をしました。
その中でもうまくいったなーと思う一例があったのでそちらを紹介しようと思います。

# 課題
開発している環境で当時課題に上がっていたのが
「サーバにデプロイしたいです。12~13時の間使わせてください」
というデプロイ予約。

本番へのデプロイであれば、下手にチーム内で混乱がおきないようにするために必要な声かけかもしれません。
ですが開発環境でわざわざデプロイの予約をしなくてはいけないのはめちゃくちゃ面倒です。
さらにこの予約が混み合えば
「今日デプロイできなかったので明日にします」
こんな結果になってしまえばこれほど時間の無駄はないです。

# 対策
そこで対策として私が取った方法が
**Dockerを使って複数ドメインの開発環境を作ること** でした

# 環境
・AWS
・Docker
・Jenkins
・Capistrano
(※Capistranoで、AWSへのデプロイができることが肝になっています。)

# サーバ側方法
EC2インスタンスにDockerをインストールします。
(色々な方が記載していると思うのでインストール方法などは割愛します)

Dockerはポートフォワーディングができるので複数のポートを開けてrunしておきます。

複数ポートで起動し、アクセスの確認をしたらAWSコンソールで、新しくELBを作ります。

Dockerで開けたポートと同じ数ELBを用意します。
このとき、ELBにもポートフォワーディングがあるので、Dockerで開けたポートと同じように設定します。

あとは作成したそれぞれのELBに起動したEC2インスタンスを接続します。

そうすることで、それぞれのELBにアクセスすれば、ポートフォワーディングされて同一インスタンスの中の別コンテナにアクセスできるようになります。

あとはAWSのRoute53を使って、それぞれのELBに対して設定をすれば終了です。

# Jenkins側方法

Jenkins側ではGitHubにpushしたユーザ名を取得します。
そのユーザ名を判別し、デプロイするときに必要なファイルを書き換えます。
（当時はsymfonyを使っていたのでparameters.ymlを書き換えてました）

デプロイするサーバのディレクトリも、GitHubのユーザごとに分けて自動で作成するように設定をします。
またデプロイするときに、Dockerコンテナを自動で作り直すようにしておけば常に綺麗な状態を保てるので、自分は作り直してました。

# やってみて
Jenkinsを使ったデプロイを1から構築してみて、正直わからないことばかりでしたがかなり勉強になりました。
正直もっといい方法があるような気がしなくもないですが、自分の中では結構満足しています。
EC2インスタンスを複数用意する必要もなく、少しはコストの削減もできたなーと思ってます。

--------
次は弊社に第二新卒で入社したEngがredashについて記載してくれるようです！
弊社集計の基盤となっているものをガリガリ使っているのでどんな内容になるのか楽しみですー！
sudoers覚え書き

ときどき書くと書式がわからなくなるのと、Manページの学習コストが割と高いので、備忘がてらに書いておく。

大事なことは全て[Manページ](https://linuxjm.osdn.jp/html/sudo/man5/sudoers.5.html)に書いてある。

# 基本構文

```sudoers:sudoers
誰が どのホストで = (誰として) 何を
```

## 具体例

```sudoers:sudoers
# rootユーザはどこでも、誰としてでも何でもできる
root ALL=(ALL:ALL) ALL

# wheelグループのユーザはどこでも、誰としてでもパスワード無しで何でもできる
%wheel ALL=(ALL:ALL) NOPASSWD: ALL

# bobはaliceとして閲覧コマンドを実行できる
bob ALL=(alice) /bin/ls, /bin/cat
```

以下、基本構文の簡単な解説。

## 誰が

上の `%wheel` のように `%` を付けるとグループ指定。  
他にも指定の仕方がいくつかあるが、ほとんどの人は使う機会がないだろうと思う。

## どこで

ここはホスト名を入れることができるのだが、基本はローカル上で解釈されるので、 `ALL` でも問題ない。
LDAPとか使っていると話は違ってくるが、この記事ではLDAPの話はしない。

## (誰として)

例で `(ALL:ALL)` と書いたが、左側がユーザ、右側がグループを表す。

ユーザ権限のみで十分の場合、 `(app)` のように書く。  
この場合、対象者はappユーザとしてコマンドを実行できる。

## 何を

実行コマンドをカンマ区切りで指定する。  

- フルパスで指定する
- 引数も指定することができる
- ディレクトリを指定すると、そのディレクトリ直下の全てのコマンドを実行可能になるが、サブディレクトリは許可されない。
- パスや引数に `*` などの **ワイルドカード文字列** を指定することもできる(後述)

```sudoers:sudoers
# aliceはbobとして/home/bob/bin/以下のあらゆるコマンドを実行可能
alice ALL=(bob) /home/bob/bin/
```

### ワイルドカードで指定

ワイルドカード文字列はシェルglob[^1]によって解釈される。
特に、よく使われる `*` は0字以上の任意の文字列にマッチする。

[^1]: https://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html

- コマンドのファイル名として使う場合
  - `*` はスラッシュ(`/`)にはマッチしない。
- コマンドライン引数として使う場合
  - `*` はスラッシュ(`/`)やホワイトスペース(` `)にマッチする。**※要注意**

例:

```sudoers:sudoers
# /opt/bin/fooは実行できるが、/opt/bin/foo/barは実行できない
someone ALL=(ALL) /opt/bin/f*

# "cat /var/log/messages /etc/shadow" も可能になってしまうので、まずい
someone ALL=(ALL) /bin/cat /var/log/messages*
```


補遺:

- ワイルドカードはホスト名にも使える。

# その他よく使う構文
## #include, #includedir

```sudoers:/etc/sudoers
#includedir /etc/sudoers.d
```

これはコメントではなく、 `/etc/sudoers.d/` 以下のファイルを追加のsudoersファイルとしてインクルードするというディレクティブである。

同様に、 `#include` ディレクティブは別のsudoersファイルを読み込む。

この他に `#` がコメントとして解釈されないケースは、ユーザを指定するときにuidを指定するケースだけである。

## Defaults

sudoersのオプションを指定する。
例:

```sudoers:sudoers
Defaults !requiretty
Defaults env_reset
Defaults env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 LANG"
```

# よく使うオプション

上記 `Defaults` 構文でよく見るもの。

## env_reset (真偽値)

`sudo` 実行時に環境変数をリセットする。
セキュリティ上、重要。

後述のsecure_pathオプションを指定した場合、PATHの値はsecure_pathで指定した値になる。

## requiretty (真偽値)

これがセットされたとき、ttyがないときにsudoが実行できない。  
cronなどではsudoが実行できなくなる。

## env_keep (リスト)

上のenv_resetを有効にしているときに、ユーザ側から引き継げる環境変数をホワイトリスト的に指定する。

## secure_path (文字列)

sudo経由のコマンドの `PATH` 環境変数に設定される値。

例:

```sudoers:sudoers
Defaults    env_reset
Defaults    secure_path="/sbin:/bin:/usr/sbin:/usr/bin"
```

# sudoedit

sudoeditはsudoの組み込みコマンドで、通常対象ファイルにアクセス権限のないユーザに対して安全にファイルを編集するインタフェースを提供する。

ユーザにsudoeditを許可するには、例えば次のようにsudoersファイルに記述する:

```sudoers:sudoers
# bobは/etc/motdを編集可能
bob ALL = sudoedit /etc/motd
# operatorグループのユーザは、/etc/motdをパスワードなしで編集可能
%operator ALL = NOPASSWD: sudoedit /etc/motd
```

※ユーザ権限で実行するので、 `(誰として)` の条件は不要。

# 参考

- [Man page of SUDOERS](https://linuxjm.osdn.jp/html/sudo/man5/sudoers.5.html)
- [sudoedit - Qiita](https://qiita.com/urakarin/items/1dfc83370e767d070ec2 "sudoedit - Qiita")

# 脚注
Rails で Wicked PDF を使う際に、日本語フォント導入ではまったところ


#はじめに
この前Railsアプリケーションで初めてPDF化を実装しました。
wicked_pdf と wkhtmltopdf を使ったのですが、日本語フォントの出力にまる2日ほどハマってしまったのでまとめておきます。

# 基本的な日本語フォントの実装の流れ

自分で調べた際に出てきた、日本語フォントのインストール方法をいくつかあげときます。

## gem を使う 
下記コマンドで、日本語フォントをインストールする

```Gemfile
$ yum install -y ipa-gothic-fonts
$ yum install -y ipa-mincho-fonts
```

## ダウンロードしてくる

[IPAexのサイト](http://ipafont.ipa.go.jp/ipaexfont/download.html)からフォントファイルをダウンロードし、
```.ttf```のファイルを`app/assets/fonts`内に持ってくる。

`vendor/fonts`や新しく追加したfontファイル等でなく、`assets/fonts`内に持ってくれば、

```config/initializer/assets.rb
config.assets.paths << Rails.root.join('app', 'assets', 'fonts')
```

みたいな設定をする必要はないです！

# ハマった点...

基本上記のようにIPAフォントを入れれば、PDF内でも日本語フォントとして動くはずなのですが...
実際にPDFを出力してみると、文字化けが治らないor真っ白になる、という状況に陥ってしまいました。

## エラーの原因

実は今回PDF出力用に新たに追加した、`views/layouts/pdf.html.erb`のなかで、

```views/layouts/pdf.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Wicked PDF</title>
    <%= csrf_meta_tags %>
    <%= wicked_pdf_stylesheet_link_tag    'application', 'data-turbolinks-track': 'reload' %>
    <%= wicked_pdf_javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>
  <body>

    <%= yield %>

  </body>
</html>
```

と記述しておりました。問題はこの四行目の`<%= csrf_meta_tags %>`の記述！
実はここ、`views/layouts/application.html.erb`のところからコピペしてしまっていたのですが、
ここでうまく `UTF-8`の設定ができずに、何をしてもフォントを読み込めていませんでした。
ですので、正確には

```views/layouts/pdf.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Wicked PDF</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <%= wicked_pdf_stylesheet_link_tag    'application', 'data-turbolinks-track': 'reload' %>
    <%= wicked_pdf_javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>
  <body>

    <%= yield %>

  </body>
</html>
```
このように`<meta/>`タグ内でしっかりと定義する必要があります。
これでうまく日本語フォントで、PDFの出力をすることができました！

#参照元
https://qiita.com/metheglin/items/bb88aa25eae250bfa2a2
https://qiita.com/ma2ge/items/90a7d4511954b5fec2c7
Goの変数名を日本語で書くと言う一つの方法

# アドベントカレンダーにはかけない程度のメモです。
ありそうで中々ない日本語による変数名ですが、個人的には日本人のみのチームなら有りだと思っています。
利点は圧倒的な可読性。
さらに英語圏の人へは難読化になると言う特典付き・・・如何でしょうか。

```go
package main

import "fmt"

type 魔法少女 struct {
  まどか string
  ほむら string
}

func にゅー魔法少女()  *魔法少女{
  return &魔法少女{
    まどか:   "魔法少女まどか",
    ほむら:   "魔法少女ほむら",
  }
}

type 話数 struct {
  回 int
}

func(話 *話数)マミったかな(){
  if 話.回 >= 3 {
     fmt.Println("マミった")
  } else {
    fmt.Println("マミってない")
  }
}

type 契約しようよ string

func main() {
  まほうしょうじょ := にゅー魔法少女()
  fmt.Println(まほうしょうじょ.まどか) //=> 魔法少女まどか
  fmt.Println(まほうしょうじょ.ほむら) //=> 魔法少女ほむら
  
  夢の中で逢ったような := new(話数)
  夢の中で逢ったような.回 = 1
  
  もう何も怖くない := new(話数)
  もう何も怖くない.回 = 3
  
  夢の中で逢ったような.マミったかな() //=> マミってない
  もう何も怖くない.マミったかな()     //=> マミった
  
  まどかちゃんへ := make(chan 契約しようよ, 5)
  
  go func(){
    まどかちゃんへ <- "僕と契約して魔法少女になってよ！"
    まどかちゃんへ <- "僕と契約して魔法少女になってよ！"
    まどかちゃんへ <- "僕と契約して魔法少女になってよ！"
    まどかちゃんへ <- "僕と契約して魔法少女になってよ！"
    まどかちゃんへ <- "その必要はないわ。"
    close(まどかちゃんへ)
  }()
  
  for やあまどか := range まどかちゃんへ{
    fmt.Println(やあまどか)
    /* =>僕と契約して魔法少女になってよ！
	 僕と契約して魔法少女になってよ！
	 僕と契約して魔法少女になってよ！
	 僕と契約して魔法少女になってよ！
	 その必要はないわ。*/
  }
}
```
https://play.golang.org/p/dUFkiHITEQ
演算子の優先順位と結合性

##関連する記事
https://qiita.com/e16tsu/items/7ecabd7a06f0e9f4aadb
結合性の説明
##この記事の目標
http://www.bohyoh.com/CandCPP/C/operator.html
この表の一番左の列に優先順位というのがありますが、この意味を説明することです。
##「掛け算は足し算より先に計算する」
小学校では「掛け算は足し算より先に計算する」と習います。
例えば
1+2×3
の値は
1+(2×3)と同じで7ということですね。
上のURLの表でも\*は+よりも優先順位の値が小さく、これは\*は+よりも先に計算するということを表しています。
上の表では*の使い方が掛け算だけでなくポインタ絡みのやつ(単項演算子)もありややこしいのですが…
##プログラミングだと演算の記号がいくつも出てくる
算数では掛け算と足し算の順番だけ知っていれば良かったのですが、プログラミングとなると掛け算と足し算以外にいくつも小学校で習っていない記号がいくつも出てきてしかも計算する順序も小学校で習っていない。
例えば || (OR)とか && (AND)とか

## C言語では||とか&&の論理演算を整数に対してもできる
Javaでは `2 || 0`などと書くと整数に対して論理演算はできませんとはねられますが、C言語では`printf("%d",2||0);`と書いてもはねられることはなく、`2||3`の値 1 が表示されます。C言語では0はfalse扱い、0以外の数字をtrueとして扱うこととなっており上の例では
2(true扱い) || 0 (false扱い) で　true OR falseとなり、この値が1(true扱い)になっています。値がなぜ1なのか、0以外のtrue扱いの数ならなんでもいいのではという疑問はありますが、C言語の仕様で1になるようになっています。
話がC言語に脱線していますが結局、C言語では整数に対してできる演算が\*　+ || && => %などと何種類もあり優先順位も違う。
##例　
###例　3 => 0 && 5 => 2
&&と=>どっちが先か確認します。
&&よりも=>が先なので
(3 => 0) && (5 => 2)
と同じ値です。

###もし&&が=>よりも先だったら
3 => 0 && 5 => 2は
3 => (0 && 5) => 2 と同じになって =>は左結合なので
(3 => (0 && 5)) => 2　　、(0 && 5)の値は0(false)で
(3 => 0) => 2　　 、(3 => 0)の値は1(true)
1 => 2 、この値は0(false)ってなります。

###例　4+6*0/2
とりあえず+の計算はあとなので
4+(6*0/2)
\*と/の優先順位を確認すると\* 、/同じ優先順位となっています。
\* / は左結合なので
6*0/2は　
(6*0)/2
左側を先に計算します
同じ優先順位だったら同じ結合性(左結合か右結合か)のはずです。違ってたらどう計算するんだってなると思います。


##優先順が何段もある式の見方
優先順が先の演算子からかっこをつけていく見方と、逆に優先順が後の演算子からかっこをつけていく見方があります。
3*3 => 0 && 5*2 => 2 なら
(3*3) => 0 && (5*2) => 2
((3*3) => 0) && ((5*2) => 2)です。
逆に優先順位の一番低いやつで式が区切られていると思ってかっこを足していくと
3*3 => 0 && 5*2 => 2
(3*3 => 0) && (5*2 => 2)
自分としては優先順位の一番低いやつで式が区切られていると思っていくとわかりやすいと思います。
##まとめ
この記事はC言語の話になっている。
優先順を理解して余計なかっこをつけないようすると良い
(3 => 0) && (5 => 2)のかっこは余計で
3 => 0 && 5 => 2と書いても変わらない
C#の文字列の参照？　""とstring.Emptyの違いは？

C#の文字列の扱いに関するよくある小ネタ。

C#の文字列はクラスですが普通のクラスと振舞いが異なります。
不変型はまだいいですけれど「""って書く度にインスタンスが作成されてしまう」と言う人がたまにいるので、確認も兼ねてパターンを分けてどのような参照になっているか見てみました。

# コード
```C#
using System;
					
public class Program
{
	public class HogeClass {}
		
	public static void Main()
	{
		// (1)
		var hoge1 = new HogeClass();
		var hoge2 = new HogeClass();
		Console.WriteLine(Object.ReferenceEquals(hoge1,hoge2)); // (1) False
		
		// (2)
		hoge2 = hoge1;
		Console.WriteLine(Object.ReferenceEquals(hoge1,hoge2)); // (2) True
		
		// (3)
		var str1 = "hoge";
		var str2 = "fuga";
		Console.WriteLine(Object.ReferenceEquals(str1,str2)); // (3) False
		
		// (4)
		var str3 = "hoge";
		Console.WriteLine(Object.ReferenceEquals(str1,str3)); // (4-1) True
		Console.WriteLine(Object.ReferenceEquals(str2,str3)); // (4-2) False
		
		// (5)
		str3 += "fuga";
		Console.WriteLine(Object.ReferenceEquals(str1,str3)); // (5-1) False
		Console.WriteLine("str1=" + str1 + ", str3=" + str3); // (5-2) str1=hoge, str3=hogefuga
		
		// (6)
		Console.WriteLine(Object.ReferenceEquals("",string.Empty)); // (6) True
	}
}
```

# 結果
(1)においてhoge1とhoge2は同じHogeClassですが違うインスタンスとして作成したので、異なる参照を持ちます。
(2)においてhoge1とhoge2が同じインスタンスを指すようになったので、同じ参照を持ちます。
(3)においてstr1とstr2はそれぞれインスタンスを作成したので、違う参照を持ちます。
(4)においてstr3は別にインスタンスを作成しましたが、文字列の内容が同じstr1と同じ参照を持ちます(4-1)。文字列の内容が違うstr2とは違う参照を持ちます(4-2)。
(5)においてstr3に文字列を追加したところ、同じ参照をだったはずのstr1と違う参照になりました。str1とstr3は違う文字列であり、違うインスタンスです。
(6)において""はstring.Emptyは同じ参照を持ちます。

# 解説
(1)、(2)については基本的なクラスの振舞いです。その延長で考えると(3)も自然な動きでしょう。

(4)において(1)と同じように別個にインスタンスを作成したはずです。しかし文字列の内容が同じ場合は実は同じ場所を参照しています。つまり、同じ文字列の場合はインスタンスは逐一作成されずに使い回されるという仕組みになっています。

(5)においてstr3に文字列を追加したところstr3は別のインスタンスになってしまいました。普通同じ参照を指しているならstr3を変更した場合str1も同じ値になるはずですが、そうはなりませんでした。string型は不変（イミュータブル）なので後から追加した処理に見えても実際は別のインスタンスが作成されます。この辺りは(4)より知っている人が多いことでしょう。

(6)においてstring.Emptyとは空文字列であり""のことです。同じ文字列なのでこれも同じ参照になります。……実は実際に動かしてみるまで他の記事を読んで""とstring.Emptyは違う参照を持つと思っていたのですが同じになるんですね。

# 結論
- string型は不変型なので文字列を追加した場合は違うインスタンスが作成される
- 同じ文字列として宣言した場合は同じインスタンスが参照される
- ""とstring.Emptyも同じインスタンスが参照される

# おまけ
```C#
// (A)
str1 += "fuga";
Console.WriteLine("str1=" + str1 + ", str3=" + str3); // (A-1) str1=hoge, str3=hogefuga
Console.WriteLine(Object.ReferenceEquals(str1,str3)); // (A-2) False
Console.WriteLine(Object.ReferenceEquals(str1,"hogefuga")); // (A-3) False
Console.WriteLine(Object.ReferenceEquals(str3,"hogefuga")); // (A-4) False
Console.WriteLine(Object.ReferenceEquals("hogefuga","hogefuga")); // (A-5) True
```
後から同じ文字列にしても違うインスタンスですね。同じインスタンスにしてくれるのは宣言時だけでした。