OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio > 抜粋: Asynchronous Programming with Async and Await (C# and Visual Basic) | XXXAsync()の二通りの呼び出し方法

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

関連: [Visual Studio | WPF > 非同期処理 > Link: ざっくりマルチスレッド(非同期処理)](https://qiita.com/7of9/items/5f9d900f01d6e6afc703)

[Asynchronous Programming with Async and Await (C# and Visual Basic)](https://msdn.microsoft.com/ja-jp/library/hh191443(v=vs.120).aspx)
を読んで興味を持った部分は以下の通り。

- .NET Framework 4.5
- Application areaのテーブル
- async and await keywords
- an Async or async modifier
    - The method signature includes an Async or async modifier.
    - 補足: method signatureには修飾語も含まれる?
- "Async" suffix
- Task if ... has type TResult
- Void ... an async event handler
- how the control flow moves
- returns ... `Task<int>` to the caller
- If GetStringAsync ... is complete before AccessTheWebAsync awaits it, ...
    - 補足: いくつかのRTOSなどでもこのような処理には違いがあることを経験している
    - awaitをする前に処理が終了した場合にawaitが失敗する場合
    - awaitをする前に処理が終了した場合にawaitが成功する場合
    - など
- API Aync Methods
    - .NET Framework 4.5 contains ...
    - 補足: XXXAsync()というような関数がある
- Async ... non-blocking operations
- runs on the current synchronization context
    - 補足: 別スレッドにはしない、とのこと
- race conditions
    - 補足: mutexやsemaphoreやdeadlock関連で出てくる用語
- ... returns a Task or a Task
    - 誤植: `Task<T>`もしくは`Task<TResult>`
- `Task<TResult>`
- An async method can't declare ByRef parameters in Visual Basic or ref or out parameters in C#, but the method can call methods that have such parameters.

### 呼び出し方法

XXXAsync()を呼ぶ方法について、二通りの記載があった。

Return Types and Parameters

```csharp
// Calls to TaskOfTResult_MethodAsync
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();
int intResult = await returnedTaskTResult;
// or, in a single statement
int intResult = await TaskOfTResult_MethodAsync();
```

前者を使うと良い状況については今後知ることになるだろう。
AWS-SDK for JavaScript(Nodejs)のリトライ

#AWS-SDK for JavaScript(Nodejs)のリトライ

デフォルトでリトライ機能あったんだ･･･というのを知ったので自分用にメモ

##参考URL

[最大リトライ回数について](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#maxRetries-property)
[タイムアウトについて](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#httpOptions-property)

##初期化

こんな感じで書くかなぁ、というのを`CloudWatch`で残しておきます。

```js
const AWS = require('aws-sdk');

const cw = AWS.CloudWatch({
  apiVersion: '2010-08-01',
  region: 'ap-northeast-1',
  maxRetries: 6,
  httpOptions: {
    timeout: 10000,
  }
})
```

##戒め

ドキュメント、読みましょう
ラズパイでkeras

#概要
ラズパイでkerasやってみた。

#写真
![2017-12-20-173241_1024x768_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/18104/61bd909c-290f-2db4-a479-8f4c663d4356.png)

#環境
Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch

#pipインストールしたもの
tensorflow-1.3
gym
gym[atari]

#設定

sudo nano /etc/dphys-swapfile

```
conf_swapsize=1024
```

以上。
PCブラウザーで簡単にAndroid・iOSスマホのデータを管理する方法

![airmorejp.jpg](https://qiita-image-store.s3.amazonaws.com/0/217547/2f07d54b-9b60-c1c0-bb22-4d6de87db20d.jpeg)

毎日スマホで写真・動画を撮ったり、テキストファイルを作成したり、連絡先をメモしたりして、スマホには色々な大事なデータが保存されています。PCモニターで写真・動画を見るためだけでなく、データのバックアップにもなりますので、PCでスマホデータを管理する必要はあります。続いて、ブラウザーだけでAndroid・iOSデバイスのデータ管理が可能な方法を紹介します。

# パソコンでスマホデータを管理

ここで利用するのは『AirMore』というオンラインアプリで、スマホに『AirMore』アプリをインストールすれば、PC上ではブラウザーだけでスマホと繋げることが可能です。接続するにはUSBケーブルが不要で、同じWi-Fiに繋いでいればできます。具体的なやり方は下記の部分をご覧ください。

# 『AirMore』アプリをスマホにインストール

AndroidデバイスはGoogle Playで『AirMore』を検索して、iOSデバイスはApp Storeで『AirMore』を検索して、『AirMore』アプリをお使いのデバイスにダウンロードして、インストールしましょう。

# 『AirMore』でスマホとPCを繋げる

1. PCのブラウザーで『Airmore』のウェブサイト([リンク](https://airmore.jp/))を開きます。
2. ウェブサイトの「AirMoreを起動」という青いボタンをクリックします。
![airmorejp-laucher.jpg](https://qiita-image-store.s3.amazonaws.com/0/217547/fdbace3e-8e38-8560-469d-349154bffdf9.jpeg)

3. それでQRコードが画面中央に表示されます。
![airmorejp-qr-code.png](https://qiita-image-store.s3.amazonaws.com/0/217547/dd790363-6382-da1b-085e-994b6a5b1581.png)

4. スマホで『AirMore』アプリを起動して、「スキャンして接続する」ボタンをタップします。
![airmore-app-scan.png](https://qiita-image-store.s3.amazonaws.com/0/217547/e650d2dd-c172-40ac-bfbe-ac3bd2607bb1.png)

5. カメラが起動されて、『Airmore』ウェブサイト上のQRコードをスキャンします。
![airmore-scan-qr-code.png](https://qiita-image-store.s3.amazonaws.com/0/217547/a547bb3f-916a-f5c4-1b99-5da832752d1b.png)

6. QRコードが識別されれば、ウェブサイト上ではお使いのデバイスのデータが下記の画像通りに表示されます。
![airmore-jp-interface.jpg](https://qiita-image-store.s3.amazonaws.com/0/217547/18d9f8fc-d523-0191-dce8-b79990b71929.jpeg)

7. 左側の各タブをクリックすれば、対応のデータを閲覧できます。例えば、画像タブを開くと、下記の画像のように画像データが表示されます。そこでインポート、エクスポート、削除などの操作が行えます。
![airmore-photo-tab.png](https://qiita-image-store.s3.amazonaws.com/0/217547/cbdd3777-15f2-5ca1-4b1c-55c8f0211d09.png)

他の「音楽」、「動画」などのデータも同じように管理できます。更に、スマホ用の『AirMore』アプリはデータ管理以外、画像を閲覧したり、音楽・動画を再生したりすることもできます。
Node学園祭2017[2日目]

結構前の話になってしまいましたが、[東京Node学園祭2017](http://nodefest.jp/2017/)の2日目に参加してきました。

私はNodeSchoolとCode And Learnという２つのセッションに参加しました。

## NodeSchool

[NodeSchool](https://nodeschool.io/#workshoppers)

上記ページWorkshoppersにあるlearnyounodeなどをインストールし、もくもくするセッションでした。

ページサンプルにはグローバルにインストールとあったのですが、
ローカルにだけインストールしたかったので、下記コマンドでインストール。

```
npm install learnyounode
```

かんたんに起動するにはインストールしたexecファイルを直接叩きます。

```
node_modules/learnyounode/bin/learnyounode
```

<img width="723" alt="スクリーンショット 2017-12-20 17.41.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/170830/b5bae8c0-3bdb-14e7-d7f1-e85e7e87dcf7.png">

まずは"HELLO WORLD"を選択しました。
そうするとお題が表示されます。

<img width="724" alt="スクリーンショット 2017-12-20 17.43.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/170830/eb322b59-87bb-87c4-2d7d-33ad7778c014.png">

program.jsにお題の内容を記載しverify

```
node_modules/learnyounode/bin/learnyounode verify program.js
```

<img width="724" alt="スクリーンショット 2017-12-20 17.45.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/170830/afccca51-9e83-d0d3-cd71-f68b5250df44.png">

日本語でコンソールテキストを書いたのでFAILになりました。
該当箇所を修正して、再度verify。

<img width="726" alt="スクリーンショット 2017-12-20 17.46.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/170830/c90aa8a5-b2a8-bb72-90ad-ea6b30668ad4.png">

OKになりました！
とうのをひたすら続けていったのですが、結構楽しかったです。
メニュー画面下にある”CHOOSE LANGUAGE”を選択して日本語表示にすることもできます。

メンターの方がたくさんいらっしゃったので、初歩的なところで躓いてもサポートしていただき
Node.jsを知った気になるセッションでした。

## Code And Learn

コントリビュートっていう言葉を知らなかったので、
セッション時間内で実際にみなさんにコントリビュートしてもらいますー！
みたいな流れになって、正直あせりました。

しかし、gitのリポジトリクローンのやり方から開発環境作成、テストのまわしかた、
PRのつくりかたまで説明していただきながら進めていったので、
macの充電がなくなるかもしれないというハラハラ以外は
問題なく進められて、無事私もコントリビューターの一員になれました。

## 感想

npmインストールはよくしていて使ってはいるけど、Nodeって何？
みたいな状態で参加するだけしてみたんですが、基本楽しかったです。

NodeってJavascriptであれやこれやできる何かなんだろうなってことはわかりましたw。

とはいえNodeを知るにはもうちょっと勉強していかないとなーという感じでしょうか。
ｶﾀｶﾀｶﾀｯﾀｰﾝを可視化した

# 何を言っているのか
![Dec-20-2017 17-50-11.gif](https://qiita-image-store.s3.amazonaws.com/0/7193/04820961-fcb1-f5bf-cdb3-4d501d975a1e.gif)


# 製作時間
30分ぐらい

# 内容
input要素のtypeがtextまたはsearchの要素、もしくはテキストエリア内におけるキャレットの位置を画面内の絶対値として取得し、その周辺に打鍵と同時に画像を散らかしています。

## キャレット位置の取得方法
これの実現については今回は自前実装ではなく caretposition.jsという素晴らしいライブラリがあったので、使わせていただいてます。
http://d.akiroom.com/2012-06/jquery-textarea-caret-position-javascript-library/

# 実装
```js
'use strict';
document.onkeydown = function (e) {
  var current = document.activeElement;
  if (e.key === 'Backspace') {
    return true;
  }
  if (current.type === 'textarea' || current.type === 'text' || current.type === 'search') {
    var isEnter = e.key === 'Enter';
    var prefix = isEnter ? 'tan' : 'kata';
    var size = isEnter ? rand(80, 100) : rand(10, 20);
    var caretPosition = Measurement.caretPos(current);
    var imgUrl = chrome.extension.getURL('images/' + prefix + '_' + rand(1, 4) + '.svg');
    var $img = $('<img width="' + size + '">');
    $img.attr('src', imgUrl);
    $img.css({
      'position': 'absolute',
      'top': caretPosition.top + rand(-10, 10),
      'left': caretPosition.left + rand(-10, 10),
      'zIndex': 99999
    });
    $('body').append($img);
    $img.animate({
      'top': caretPosition.top + rand(-40, 40),
      'left': caretPosition.left + rand(-40, 40),
      'width': size + (isEnter ? rand(30, 50) : rand(10, 20)),
      'opacity': 0
    }, 500, function () {
      $img.remove();
    })
  }

  function rand(min, max) {
    return Math.floor(Math.random() * (max - min) + min);
  }
}
```

# ウェブストアに公開しました
https://chrome.google.com/webstore/detail/katakatataaaaaaan/piapcmegjmiehfijbnafacnpmgkjnkhp?hl=ja

数年前にブラウザの中に陰毛を散らかすだけのChrome拡張を作って公開したことがあったので、今回も公開しました。　私のChromeデベロッパーダッシュボードはゴミばっかりです。

# 追記(2017/12/27 11:32)
陰毛を散らかすChrome拡張ってなんだよって反応を複数見かけたので追記します。
これです [ウェブちぢれっ毛](https://chrome.google.com/webstore/detail/%E3%82%A6%E3%82%A7%E3%83%96%E3%81%A1%E3%81%A2%E3%82%8C%E3%81%A3%E6%AF%9B/gndfeliefbgbnflipbjpefibkponopak?hl=ja)

動作の様子です

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なるほどイカれたChrome拡張だ <a href="https://t.co/zU4t9wV8ba">pic.twitter.com/zU4t9wV8ba</a></p>&mdash; コンユウ (@kon_yu) <a href="https://twitter.com/kon_yu/status/943712194964873216?ref_src=twsrc%5Etfw">2017年12月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
単体テスト、統合テストざっくり理解



単体テスト、統合テストについて知識ゼロだったので、ざっくりと全貌を掴みたい。
言語はJavaScriptを想定しています。


## そもそもテストとは？

ソフトウェアの挙動が、想定したとおりであるかを検証すること。
テストには主に「単体／ユニットテスト」と「結合テスト」の二種類がある。
ざっくり説明すると、

### 単体/ユニットテスト

プログラムを構成する小さな単位（ユニット）の機能が、  正しく動作しているのかどうかを検証するテスト。
通常、関数やメソッドが単位メソッドの単位（ユニット）となる。

* 主なツール
    * QUit
    * Jasmine
    * Mocha
    * Jest

### 結合テスト

複数のユニットを結合したときに正しく機能するかを検証するテスト。

* 主なツール
    * Zombie.js
    * PhantomJS
    * Selenium
    * TestCafe


今回ここまで。
次回mochaとpower-assertとkarmaを使ったユニットテストをやってみる。

## 参考記事

https://www.techmatrix.co.jp/t/quality/unittest.html
swiftでキャラクターをドラッグする。離した瞬間元の位置に戻る。

swiftのアプリを作るときにキャラクターをドラッグしたら、その指に付いてくるように動かすことはいろんなサイトや本を見てできた。「詳細！swift3 iphoneアプリ開発　入門ノート」のp499を参考にした

    @IBAction func label1drag(_ sender: UIPanGestureRecognizer) {
let tomobo = sender.view!
tomb.center = sender.location(in: self.view)
}



ただ、ドラッグした後のキャラクターは指を離したところに残る。
そうではなくて、指を離した途端元の位置に戻るようにプログラミングする方法がなかったので考えた。



class ViewController: UIViewController {
    
    //初めに動かしたいものをストーリーボードに配置して接続しておく
    @IBOutlet weak var label1: UILabel!
    
    
    //その動かしたいものにUIPanGestureRecognizerをつけて、それをAction接続する
    @IBAction func label1drag(_ sender: UIPanGestureRecognizer) {
        switch sender.state {
//これでドラッグしている間は指に付いてくる
        case .changed:
            label1.center = sender.location(in: self.view)
//これで離した瞬間x:200, y:462に戻ってくる
        case .ended:
            label1.center = CGPoint(x:200, y:462)
        default:
            break
        }
    
    }
Eclipse で Gradle のプロキシ設定

# 何を解決するか？
Eclipse の標準プラグイン「buildship」を使って Gradele プロジェクトをビルドしようとしたところ、社内プロキシの接続設定が必要でしたので、そのことについて書きます。

# 環境
- Eclipse 4.7 Oxygen (pleiades 4.7)
- gradle 4.4 (buildship)
- Windows 10
- インターネット接続は社内プロキシ経由（認証あり）

# 解決方法
gradlew.bat と同じディレクトリに gradele.propeties を作成して、プロキシを設定します。

```gradele.propeties
# HTTPプロキシ設定
systemProp.http.proxyHost=<プロキシサーバ名>
systemProp.http.proxyPort=<ポート番号>
systemProp.http.proxyUser=<ユーザー名>
systemProp.http.proxyPassword=<パスワード>
systemProp.http.nonProxyHosts=<プロキシを適用しないアドレス 例)123.564.*, localhost>

# HTTPSプロキシ設定
systemProp.https.proxyHost=<プロキシサーバ名>
systemProp.https.proxyPort=<ポート番号>
systemProp.https.proxyUser=<ユーザー名>
systemProp.https.proxyPassword=<パスワード>
systemProp.https.nonProxyHosts=<プロキシを適用しないアドレス 例)123.564.*, localhost>
```
# 確認方法
コマンドプロンプトから gradlew.bat をオプションを付けて実行します。

```
> gradlew --scan build
```

プロキシを原因とするエラーの場合、jcenter などの外部リポジトリへ接続できないため、 UnknownHostException が出力されると思います。

```
Caused by: java.net.UnknownHostException: jcenter.bintray.com
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
        at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
        at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
        at java.net.InetAddress.getAllByName0(InetAddress.java:1276)
        at java.net.InetAddress.getAllByName(InetAddress.java:1192)
        at java.net.InetAddress.getAllByName(InetAddress.java:1126)
（省略）
        ... 62 more
* Get more help at https://help.gradle.org
BUILD FAILED in 0s
1 actionable task: 1 executed
```

きちんと設定できれば、上のコマンドが成功しますし、Eclipse から build タスクを実行しても正常に完了するようになります。これで解決しない場合、別の理由で外部リポジトリへの接続に失敗していることが考えられますので、別途、そちらを確認してください。

以上です。
docker for macでrails × yarn × webpackerのfront環境を整える

#はじめに
[この記事](https://qiita.com/Dragon-taro/items/dda4c3663b65c3a1feb0)で構築した環境に、yarnというjsのパッケージ管理ツールとwebpackerというrailsでwebpackを簡単に構築できるツールを使ってfrontの環境を整える。

ちなみに[webpacker](https://github.com/rails/webpacker)はrails5.1から使えるようになった最新のgemです。

#yarnのインストール
[こちら](https://terakoya.site/dev/docker-mac-rails51-vuejs-setup/)を参考に、

```dockerfile:Dockerfile
FROM ruby:2.4.0

# シェルスクリプトとしてbashを利用
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# 必要なライブラリインストール
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

# yarnパッケージ管理ツールインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y yarn

# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
    apt-get install nodejs

# ワークディレクトリ設定
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock

# bundle install
RUN bundle install
ADD . /myapp
```


Dockerfileを上記のように変更します。
rubyのversionもあげています。

```Gemfile:Gemfile
gem 'rails', '5.1.1'
```

railsのversionを5.1.1にしてから、`$ docker-compose build`を実行し、yarnをインストールします。

これでエラーが出なければ、yarnのインストールは完了です。

#webpackerのインストール
```Gemfile:Gemfile
gem 'webpacker', '~> 3.0'
```

をGemfileに追記したら、

```shell
docker-compose run web bundle update
docker-compose build
```

を実行して、webpackerのインストールは完了です。

#reactの導入
```
docker-compose run rails rails webpacker:install
docker-compose run rails rails webpacker:install:react
```
これを実行すると、必要なfileのインストールとdefaltのディレクトリを作成してくれます。
適当なviewに、

```ruby:hoge.html.erb
<%= javascript_pack_tag 'hello_react' %>
```

と追加すると、
<img width="482" alt="スクリーンショット 2017-12-20 17.42.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/211808/3dfacbfc-d526-efbd-35cd-5c8a0073c9ce.png">
と表示されるはずです。

#最後に
app/javascript/packsという今までと違うディレクトリにjsが入っているのでそれを、いい感じのディレクトリ構成にしたい。

間違っているところや、こうした方がいい的なことがありましたら、コメントよろしくお願いします！！

コードは[こちらです](https://github.com/Dragon-taro/myapp)
Visual Studio > typo > Asynchronous Programming with Async and Await (C# and Visual Basic) > Task<T>がTaskになっているようだ

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

[Asynchronous Programming with Async and Await (C# and Visual Basic)](https://msdn.microsoft.com/ja-jp/library/hh191443(v=vs.120).aspx)
を読んでいるが、誤植(typo)があるようだ。

### What Happens in an Async Method

項目3つ目。

> GetStringAsync returns a Task where TResult is a string,

GetStringAsync returns a `Task<T>` where TResult is a string,
の気がする。
もしくは`Task<string>`。

### Return Types and Parameters

> returns a Task or a Task

a Task or a `Task<T>`

二か所ある。
SlackとGoogle Calendarを連携して、勝手に入れられたスケジュールを把握する



今更感ありますが、以前より設定してたSlackアラートの設定メモになります。

## Slackの連携設定

下記へアクセスする。

※Slackにログインしていない場合、SlackのチームアドレスとIDとパスワード入力してログインしておく。

https://[チーム名].slack.com/services/gcalendar


![1.png](https://qiita-image-store.s3.amazonaws.com/0/55848/6fc70e2f-5a6f-b10d-1160-3c10ae5a485d.png "1.png")

* Connect a Calendar to Slack をクリック

![2.png](https://qiita-image-store.s3.amazonaws.com/0/55848/a9c55dbb-45ac-1795-7929-fab0bf9762b0.png "2.png")

* 連携させたいアカウントを選択

![3.png](https://qiita-image-store.s3.amazonaws.com/0/55848/809d3ed7-7fbc-1a64-74cc-042b68ede206.png "3.png")

* 許可 をクリック

![4.png](https://qiita-image-store.s3.amazonaws.com/0/55848/a33a13f0-adbf-ec4e-3dcf-80f2beee362b.png "4.png")


### ① Which calendar do you want to post from?(どのカレンダーから投稿しますか？)

* 通知させたいカレンダーを選択

### ② What channel should it post to?(どのチャンネルに投稿する必要がありますか？)

* 通知したいチャンネルを選びます。(今回は、自分に設定)

![5.png](https://qiita-image-store.s3.amazonaws.com/0/55848/7d65446a-1a6a-503d-2f85-0b96416b4c27.png "5.png")


### ③ 通知時間の設定

* 今回は 5 mitues before を選択(5分前通知)

### ④ カレンダー変更通知

```
An event is created (or you are invited to an event) (イベントが作成された（またはイベントに招待された）)

An event's title, time, or location is updated (イベントのタイトル、時間、場所が更新された)

An event is cancelled or removed (イベントが取り消されたり削除されたりする)
```

* 今回は、全て通知してほしいので、全部にチェック


![6.png](https://qiita-image-store.s3.amazonaws.com/0/55848/e3920867-b9d7-8538-197e-400e44850dba.png "6.png")

※Calendar Summariesは、諸略します。

* Save Integration をクリック

![7.png](https://qiita-image-store.s3.amazonaws.com/0/55848/82b42ecf-c47d-7b03-6ca2-bea7ff0d709a.png "7.png")


* Slackの設定が完了
* I'm done! をクリック


## Google Calendarに予定を入れてみる

### 新規に予定を登録

![8.png](https://qiita-image-store.s3.amazonaws.com/0/55848/e745b6f7-7007-5e1f-91f3-20fb5d6fa3d7.png "8.png")

* 11:00~12:00に予定を入れる

![9.png](https://qiita-image-store.s3.amazonaws.com/0/55848/06cb6655-20d0-ef48-a9ab-be6c4c22c314.png "9.png")

* Slack側に通知される


### 予定を変更する

![10.png](https://qiita-image-store.s3.amazonaws.com/0/55848/d962db54-11c4-d54e-f26a-2c85cf445f00.png)


* 予定を11:30~12:30に変更する

![11.png](https://qiita-image-store.s3.amazonaws.com/0/55848/e28187db-47a2-fbf9-1329-272b94fe6025.png "11.png")

* Slack側に変更が通知される

### 予定を削除する

![12.png](https://qiita-image-store.s3.amazonaws.com/0/55848/fc22c16f-af34-94b4-24b5-23a8c3315465.png)

* 予定を削除する

![13.png](https://qiita-image-store.s3.amazonaws.com/0/55848/a5992dfc-6d9d-2329-de54-4ba7b2a4d44f.png "13.png")

* Slack側に削除されたことが通知される

## 連携してみて

* だいぶ抜け漏れが減りました。
* 勝手に予定が入れられたとしても、気づきやすくなった。(一声くらいかけろよ。)
* ただ、予定を変更されたりするとアラートが飛びまくるのでslack疲れが。。

## 参考
* [Slack と Google カレンダーを連携させる](https://get.slack.help/hc/ja/articles/206329808-Slack-%E3%81%A8-Google-%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B)
「![Payload Too Large]()」エラーが出てしまうときは

# 問題
* 弊社のAdvent CalendarをQiitaを利用して書いてみようと思い立ったものの、3つ目の画像を登録しようと思ったあたりで、![Payload Too Large]()と表示されて画像が添付できない。

# 解決方法
* Qiitaに投稿する。そうすることで、画像アップロード制限が100MBまで拡張される。

# ソース
初めてQiitaに投稿すると1ヶ月の画像アップロード制限が2MB→100MBにアップします
http://blog.qiita.com/post/75674629515/image-capacity-expansion
ピタゴラVMへのsshログインは（ゲストVM間でも）何も設定せずにできるよ、というだけのメモ

この記事は、[Galaxy Advent Calendar 2017](https://qiita.com/advent-calendar/2017/galaxy)の12/19日分として書かれたものです。


#ピタゴラVM外からsshログインして中身をいじる

　自分は、[ピタゴラVM](http://wiki.pitagora-galaxy.org/wiki/index.php/Versions)内のツールの開発等で中身をいじる必要があるときは、sshでVM外からログインして作業を行っています。
　tool_conf.xmlをいじったり、新規にファイルをコピーしたりする等々。
(gitとかつかってもっと効率よくエレガントにやるやり方とかあるのかもしれませんが…。)


　というわけで、http://wiki.pitagora-galaxy.org/wiki/index.php/Get_Started
の　[はじめよう ツール開発](https://docs.google.com/document/d/1oKHSWv2veCgqkzgm39f5fn9bbXqPSoS-3E4C9WVaE9k/)　とかを見て自分でツールを開発したくなったとか、それ以外でもちょっと中身をいじりたいだとか、あとそもそもピタゴラのブラウザを使わずに中身のツールを叩いてみたいとかそういう時のやりかた以前の話というかただのメモです。

###例：pitagora VM 0.3.4　の場合

1.端末(etc)を起動します。

2.シンプルに以下の通り。

```
$ ssh ubuntu@192.168.56.10
```

3.パスワード（ここだとgalaxy）を入力

以上です。

　特殊な作業は何も必要ありません、

###なんでこれ書いたの？

　実をいうと、windows10上で、ゲストVM　→　pitagora VMという感じにログインするときには、何か設定が必要なのかな？　と思って調べまわった挙句、（ホスト→ゲストログイン同様に）**何も必要なかった**という事実が判明したので、~~悔しいので~~せめてとりあえずメモを残しておく次第です。
\#そりゃそうですよね、ブラウザで開けますもんね…。

　尚、調べまわる過程で、普通のゲストVM間の通信に関しては以下のサイトで勉強させて頂きました。ありがとう御座います。

https://qiita.com/areaz_/items/c9075f7a0b3e147e92f2
http://linux2.g.hatena.ne.jp/lnznt/20120131/1328021979
アップデートできるスマートコントラクトを実装してみました

**コントラクトなのに、更新するの？**という問題は一旦おいておいて、ブロックチェーン上で更新できる方法をやってみました。
といっても、[Truffle の Migration は何をやっている？ - Qiita](https://qiita.com/blueplanet/items/e3f5590c9711df4d4845) の応用編的な感じですね。

## コード

```javascript
pragma solidity ^0.4.17;

contract InnerContract {
  function say() public pure returns (bytes32) {
    return "first ver";
  }
}

contract MyContract {
  address public owner;
  address public innerContractAddress;

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  function MyContract() public {
    owner = msg.sender;
  }

  function say() public view returns (bytes32) {
    InnerContract innerContract = InnerContract(innerContractAddress);
    return innerContract.say();
  }

  function setInnerContract(address new_address) public onlyOwner {
    innerContractAddress = new_address;
  }
}
```

## 初期バージョンをデプロイする
- 環境準備
    - Ganacheを起動しておく
    - `https://ethereum.github.io/browser-solidity` にアクセスして、`Environment`を`Web 3`選択し、`http://127.0.0.1:7545`に接続しておく
- 初期バージョンデプロイ
    1. 上記ソースをRemixのエディターに貼り付ける
    2. 右側のデプロイ対象コントラクトを`InnerContract`選択し、ピンク色の`Create`ボタンをクリックしデプロイする
    3. 同じく`MyContract`を選択し、デプロイする
    4. デプロイできたら、`InnerContract`のアドレスをコピーして、`MyContract`の`setInnerContract`関数のパラメータとして設定し（ダブルクオーテーションを忘れずに）、`setInnerContract`を呼び出す
    5. 結果確認：`MyContract`の`say`関数を実行する
    6. 添付画像のようによく分からに値が出てくる

![スクリーンショット 2017-12-20 17.09.33.png](https://qiita-image-store.s3.amazonaws.com/0/4777/32dc3e6e-f619-aa5b-f584-89af05d42ae8.png)

- 左側の下の部分をクリックすればコンソール使えるので、そこでデコードしてみたら、ちゃんと`first ver`になっている！！！

![スクリーンショット 2017-12-20 17.14.16.png](https://qiita-image-store.s3.amazonaws.com/0/4777/ec293150-c98f-e26f-8c89-6fc33836293a.png)

## アップデートしてみる
- `InnerContract`の戻り値を`second ver`に変更して、上記と同じく、`InnerContract`を再度デプロイする

```javascript
contract InnerContract {
  function say() public pure returns (bytes32) {
    return "second ver";
  }
}
```

![スクリーンショット 2017-12-20 17.19.37.png](https://qiita-image-store.s3.amazonaws.com/0/4777/b1a72771-b5e5-7314-3f6d-72cbb555f455.png)

- 上記画像のように、２個目の`InnerContract`が出て来る
- 初期バージョンのデプロイと同じく`InnerContract`のアドレスを`MyContract`の`setInnerContract`経由して設定する
- 再度`MyContract`の`say`関数を呼び出して、同じく値を`web3.toAscii()`でデコードすると、**`second ver`になっている！**

## まとめ
- **エンドユーザ側から見ると、MyContractがアップデートできるようになっています。**
- 入り口のコントラクトを用意して、実処理を裏側のコントラクトに任せることで、コントラクトのアップデートはできる
- もちろん、課題はまだまだいろいろある

## 課題
- [ ] データの移行は [Truffle の Migration は何をやっている？ - Qiita](https://qiita.com/blueplanet/items/e3f5590c9711df4d4845) のように実装すれば行けると思いますが、データ量が多くなると GAS limit すこし不安ですね。もっと良い解決案があるかな。
Amazon Elasticsearch ServiceのKibanaへ、SSH port forwardingでトンネルを掘り、踏み台サーバ経由でアクセスする

## TL;DR

たまにSSH port forwardingのやり方を聞かれるのでメモがてら。


3+1行で説明するとこんな感じ。
SSH port forwardingでトンネルを掘る

```
ssh -i ~/Path_to_SSH_key/id_xxxx {account_name}@{踏み台サーバIP or DNS name} -L 8888:{Kibana private IP}:80 -N
```

ブラウザで(トンネルを通ってKibanaへアクセスする

http://localhost:8888/_plugin/kibana



## Kibanaへのアクセス

今のところKibanaへアクセスするニーズがあるのは開発者のみ。
開発者は踏み台サーバにアカウントを持っている。

というわけで ssh port forwardingでアクセスできれば良しとしているケースです。


### 手順

#### 1. KibanaのPrivate IPを確認

※東京リージョンの場合
https://ap-northeast-1.console.aws.amazon.com/es/home
My domains > "Kibanaにアクセスしたいドメイン" > Overview

<img width="910" alt="Screen Shot 2017-12-20 at 17.50.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/14859/8ab99f00-c2ac-b922-fc12-450dd43dc806.png">


赤枠部分のドメインをメモし、IPを確認する

```
$ host {赤枠部分のドメイン}.es.amazonaws.com
{赤枠部分のドメイン}.es.amazonaws.com has address 172.xx.xx.xx
{赤枠部分のドメイン}.es.amazonaws.com has address 172.xx.xx.xx
```

#### 2. SSH port forwardingでトンネルを掘る

```
ssh -i ~/Path_to_SSH_key/id_xxxx {account_name}@{踏み台サーバIP or DNS name} -L 8888:{Kibana private IP:Port}:80 -N


e.g)
ssh -i ~/.ssh/id_rsa nntsugu@ec2-xx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com -L 8888:xxx.xxx.xxx.xxx:80 -N
```

#### 3. ブラウザで(トンネルを通ってKibanaへアクセスする

http://localhost:8888/_plugin/kibana



## お手軽に検索

Kibana > Dev Tools > Console 
からだとJSONでクエリを投げられるのでとっつきやすい。かもしれない。

```
GET _search
{
  "query": {
    "match": {
      "severity": "ERROR"
    }
  }
}
```
mocha のテストに無理やり連番を振って番号指定でテスト実行できるようにする

(mocha v2.5.3 で試しました。ほかのバージョンだとダメかも。)

こんな感じで mocha を無理やり拡張してみた。

**mocha_ext.js**:

```javascript
const Mocha = require("mocha");

const originalRun = Mocha.prototype.run;

Mocha.prototype.run = function (fn) {
  let i = 1
  this.loadFiles(() => {
    this.suite.eachTest((test) => {
      test.title = `#${i}: ${test.title}`
      i += 1
    })
  })
  return originalRun.apply(this, [fn])
}
```

こんな感じのテストを実行してみる。

**test.js**:

```javascript
const assert = require("assert");
describe("Numbered tests", ()=> {
  for(let i = 0; i < 15; i += 1) {
    it("test hogehoge", () => {
      assert(1 == 1)
    })
  }
})
```

普通にテスト実行すると、全部実行される。

```
$ mocha --require mocha_ext.js test.js


  Numbered tests
    ✓ #1: test hogehoge
    ✓ #2: test hogehoge
    ✓ #3: test hogehoge
    ✓ #4: test hogehoge
    ✓ #5: test hogehoge
    ✓ #6: test hogehoge
    ✓ #7: test hogehoge
    ✓ #8: test hogehoge
    ✓ #9: test hogehoge
    ✓ #10: test hogehoge
    ✓ #11: test hogehoge
    ✓ #12: test hogehoge
    ✓ #13: test hogehoge
    ✓ #14: test hogehoge
    ✓ #15: test hogehoge


  15 passing (11ms)
```

`--grep '#8:'` とか指定すると、その番号が振られたテストだけ実行できる。

```
$ mocha --require mocha_ext.js test.js --grep '#8:'


  Numbered tests
    ✓ #8: test hogehoge


  1 passing (10ms)
```
【FileMaker】チェックボックスセットとラジオボタンセット、同じフィールドに使ったらどうなる？

ちょっと前、値一覧を様々な形式で表示する機会があったので、その時に検証したものです。

こんな感じの値一覧。
<img width="494" alt="1220_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/07161ee4-48c1-8ce8-473f-3e8010a29a55.png">

これを、複数選択可能なチェックボックスセットと一つしか選択できないラジオボタンセットを同じフィールドに設置してみました。

「カテゴリチェック」というテキストフィールドに、チェックボックスセットとラジオボタンセットを当ててます。
<img width="768" alt="1220_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/e5b0ff66-2759-0eb4-5541-76efa2520585.png">

チェックボックスセットで、全てのチェックを入れた結果、、、
全てのラジオボタンにもチェックがついてしまいました。
<img width="561" alt="1220_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60538/29978f2b-f875-667b-7284-0fdd20c4f159.png">

ちなみに、Shiftボタンを押しながらラジオボタンをクリックしていくと、[チェックボックスセットのように複数選択できます](https://support.filemaker.com/s/answerview?language=ja&anum=8268)。
ラジオボタンの選択を解除する時にはとても有効だと思いますが、これで複数選択されてしまったら、業務的に想定外の動きということになりますね。
その際は、一つのみ選択されているかをチェックする動きを盛り込む必要がありそうです。

設計で防げるミスですが、気をつけてくださいね。
Cognos Analytics と LTPAトークンでのSSO

#LTPAトークンでのSSO
Cognos AnalyticsはWebSphere Liberty上で動作しますが、LTPAでのシングルサインオン(SSO)の実装方法が記事としてリリースされました。

**Administration – SSO with LTPA – WebSphere Liberty and Cognos Analytics**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/administration-sso-with-ltpa-websphere-liberty-and-cognos-analytics/

マニュアルにも情報が追加されていますね。
**Configuring Lightweight Third-Party Authentication**
https://www.ibm.com/support/knowledgecenter/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.inst_cr_winux.doc/t_configure_ltpa.html#configltpa


以前、Cognos BIでのLTPAでのSSOを投稿しましたので、こちらの内容と比べると。
**Cognos BI とLTPAトークンでのSSO**
https://qiita.com/shinyama/items/abbc1828091b34cec625

・Servlet Gatewayだけではなく、OptionalのGateway(Webサーバー)でCognos Analyticsを実装していても、LTPA SSOは実現できるようです。

・local-server.xml という名称のファイルに、以下を添付して、configurationフォルダ配下に配置が必要なようです。

```html
<?xml version="1.0" encoding="UTF-8"?>
<server>
	<featureManager>
		<feature>ldapRegistry-3.0</feature>
		<feature>appSecurity-2.0</feature>
	</featureManager>
	<ldapRegistry id="id" realm="realm" 
		host="host" port="port" ignoreCase="true" 
		baseDN="o=basedn" ldapType="Custom" sslEnabled="false">
		<idsFilters 
			userFilter="(uid=%v,ou=people)"
			userIdMap="*:uid"
			groupFilter='(objectclass=groupofnames)'
			groupIdMap="*:cn" />
	</ldapRegistry>

	<webAppSecurity allowFailOverToBasicAuth="true" displayAuthenticationRealm="true"/>
</server>
```

どなたか実装されましたら、是非フィードバック頂けるとありがたいです。
【Python】pandasのdescribeで出力される項目の意味について【データ分析】

すっごく基本的なところからわからないので一つ一つ調べていくのです。

## describeを出力

```
>>> import pandas as pd
>>> data = pd.read_csv("data.csv", names=['X', 'Y', 'Z'])
>>> data.describe()
                X          Y           Z
count    7.000000   7.000000    7.000000
mean    42.571429  -8.571429   98.714286
std     42.968427  14.920424    8.440266
min      0.000000 -40.000000   88.000000
25%      5.000000 -10.000000   92.000000
50%     33.000000  -5.000000  100.000000
75%     77.500000   0.000000  104.500000
max    100.000000   5.000000  110.000000
```

データの内容はいったん気にしないでください。

## 各項目の意味

| 項目名| 意味 | 
|:-----------------|------------------:|
| count          | そのカラムの件数 | 
| mean           | 平均 | 
| std            | 標準偏差 |  
| min            | 最小値 | 
| 25%            | 第一四分位数 |  
| 50%            | 第二四分位数 |  
| 75%            | 第三四分位数 |  
| max            | 最大値 |  


・・・初心者な僕は標準偏差と四分位数とやらがわかりませんでした。

というわけで、
標準偏差については、
https://markezine.jp/article/detail/15763

四分位数については、
https://mathtrain.jp/shibuni

を参考に理解することができました。

初めてやる領域ではこういった一つ一つを調べる事から始めるため、
最初はかなり進みが悪くて面白くないかもしれませんが、
だんだんと調べる単語やものが減ってくるのでそこまでは本人の踏ん張り、頑張りが大事なんだと思います。

そんな感じです。
DAX Studio とは

おススメのツールです。
Power BI Desktop でのモデリング機能を使って メジャー や テーブル を作成するなど データの集計に必要な準備を行います。ただ、最終アウトプットに必要とされるメジャーがどのようなものになるか試行錯誤が必要でなんどもやり直したりして結構面倒なんですよね。そんなとき [DAX Studio](http://daxstudio.org/) を使っています。

# [DAX Studio](http://daxstudio.org/)
表形式モードの SQL Server Analysis Service (SSAS) をサポートしますので、

- Power BI Desktop の データモデル
- Excel PowerPivot モデル
- [Azure Analysis Services](https://azure.microsoft.com/ja-jp/services/analysis-services/)

も接続することができる。更新情報などは、[DAX Studio - SQLBI](https://www.sqlbi.com/tools/dax-studio/)

## 何ができるのか
データモデルに接続し、DAXクエリを書き、そして実行するすることができる。実行計画やトレースなどの計測もできるようになっているので、

- そもそもどのような DAX クエリを書くのか - 学習
- クエリのパフォーマンスはどの程度か - 学習 と 最適化

や、DAX クエリの結果を Excel ファイルに出力して検証など。

## インストール
必要なコンポーネント(SSAS関連のProvider)がダウンロードされインストールされることがありますが、デフォルトの設定でインストールすればよいです。Excel PowerPivot モデル に接続する場合には Excel アドイン が必要(既定に含まれている)。

## 使い方
ひとまず、メジャーを作成し、その結果を含む データを表示
### 接続
#### Power BI Desktop
接続先 データモデル を含む Power BI Desktop ファイル(*.pbix) が開いていれば、接続先候補として列挙されるので 目的のデータソースを選択して [Connect]

![PBI](https://qiita-image-store.s3.amazonaws.com/0/193509/183724aa-2a27-3dc2-0472-b0fdda7ada58.png)

#### Excel PowerPivot モデル
PowerPivot データモデルを含むExcel ファイル(*.xlsx など)を開いた状態で Add-ins タブ から DAX Studio を起動。そして [Connect]

![Excel](https://qiita-image-store.s3.amazonaws.com/0/193509/a4760474-09be-de25-c252-c11d2a9c8dc6.png)

### オブジェクト ブラウザ
オブジェクトブラウザには、データモデルのメタデータなどが表示されていて、テーブル や 作成済みのメジャー 定義済みの内容や DAX 関数 が列挙され、エディタにドラッグしてコーディングの支援に使うことが可能。

![オブジェクト ブラウザ](https://qiita-image-store.s3.amazonaws.com/0/193509/ccb5b82f-01fd-073a-0558-39c01a056fda.png)

### DAX クエリの記述して実行
構文は シンプル。

- [DAX Queries -  Data Analysis Expressions (DAX) Reference](https://msdn.microsoft.com/en-us/library/gg492201.aspx)

すでに定義されたメジャーもそのまま利用できるけれども、DEFINE で メジャーを定義し、 EVALUATE で テーブル式を評価、[RUN] で実行すると結果が返ってくる。

![results](https://qiita-image-store.s3.amazonaws.com/0/193509/edb79421-9b81-e4f1-fdb2-17a2e1bf4dbc.png)


## 便利なところ
他にも便利なことがあるのだけど、特に、メジャーの定義をエディタに出力することができる
![コンテキストメニュー](https://qiita-image-store.s3.amazonaws.com/0/193509/a735c35c-10c9-aff1-317e-61420fccd74f.png)

- **Define Measure** 定義をそのまま
- **Define Dependent Measures** 参照している他のメジャーを一緒に 
- **Define and Expand Measures** 参照している他のメジャーを置き換えて

# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
チャットワークAPI(V2) python3でテスト投稿

### はじめに
“python3”でチャットワークAPIを使用して
メッセージを送る方法

## API Tokenの取得
メニューから、API設定を選択
![s.png](https://qiita-image-store.s3.amazonaws.com/0/58950/1baac86d-e468-bda9-6206-28648eff7921.png)
自分のAPIトークンを発行します。

### プログラムの作成

“chatwork.py” を作成。

```
#!/usr/local/bin/python
#coding: UTF-8
print ("Content-Type: application/json")

import pycurl
import urllib.parse

c = pycurl.Curl()
option = {'body': 'Python ChatWork API Testだぜ'}
c.setopt(pycurl.SSL_VERIFYPEER,0)
c.setopt(pycurl.URL, 'http://api.chatwork.com/v2/rooms/(ルームID)/messages')
c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken: (あなたのAPI Token)'])
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, urllib.parse.urlencode(option))
c.perform()
```

Macで、“python3”のインストールが出来れば問題なく動作します。

参考
[MacにPython3をインストールする方法 | ハジプロ！](https://hajipro.com/python/mac-python3)

チャットしたい文言は、body箇所に記載

```
option = {'body': 'Python ChatWork API Testだぜ'}
```

先ほど取得したあなたのAPI Tokenを記載します。

```
c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken: (あなたのAPI Token)'])
```

(ルームID)には、チャットワークのルームIDを入力します。

```
c.setopt(pycurl.URL, 'http://api.chatwork.com/v2/rooms/(ルームID)/messages')
```

チャットワークから、ルームのURLを確認した際に以下の場合は

```
https://www.chatwork.com/#!rid00000000
```
00000000
が入ります。勿論、グループチャットではなく、個人やダイレクトチャットのページでも大丈夫です。



## はまったポイント
リリース用に、Cent OS6 にて、 “python3”をインストール
実行をしたが、pycurlがインストールされていない。

そこで、

```
export PYCURL_SSL_LIBRARY=nss
pip install pycurl --compile pycurl --no-cache
```
pycurl のインストール
実行！しかし、

```
pycurl.error: (60, "Peer's certificate issuer has been marked as not trusted by the user.")
```
certificateで、エラーが出る！

そこで

```
c.setopt(pycurl.SSL_VERIFYPEER,0)
```
により今回は、SSLを無視
勿論、.crtを指定する方法もありますが今回は無視にて実行が出来ました。
parcel-plugin-vueを使って、今話題のParcelからVueの単一ファイルコンポーネントをビルドする方法

こんにちは。vueJS初心者の人です。
vueの勉強中、「**単一ファイルコンポーネント（.vue）**を動作させるためにはwebpackとかが必要だよ」と言われて「うぼあー」となっていたところ、**Parcel**というものが脚光を浴びていたので、導入してみました。

今回、例として作成したファイルはgithubにあげています。
[omatsu38/parcel-vue-startkit](https://github.com/omatsu38/parcel-vue-startkit)


###Parcelとは
**📦 [Parcel](https://parceljs.org/)** 、それは小包（直訳）。それはビルドツール。
先日の記事「[webpack時代の終わりとparcel時代のはじまり - Qiita](https://qiita.com/bitrinjani/items/b08876e0a2618745f54a)」から聞いたことがある人もいることでしょう。
つまり、gulpfileのような設定ファイルのないシンプルなビルドツールということ。
そんな便利で優しい世界が・・・？なんだかとってもすてき！

## Parcelの導入
###Parcelのインストール
※node.jsは、v.8.9.3を使用しています。
Parcelの導入はターミナルに次の２つのコマンドを打ち込むだけです。

```bash:ターミナル
$ npm init -y  #プロジェクトの初期化
$ npm i -D parcel-bundler  #Parcelインストール
```

##単一ファイルコンポーネントをParcel監視対象にする
今回は**🐙🐱「[parcel-plugin-vue](https://github.com/lc60005457/parcel-plugin-vue)」**を使用します。

> Make Parcel surport Vue single file components.
> （README.mdより）

###parcel-plugin-vueのインストール

```bash:ターミナル
$ npm i -D parcel-plugin-vue  #parcel-plugin-vueのインストール
```

また、GithubのREADMEにある通り、こちらの３つのプラグインをインストールをします。

- vue
- vue-template-compiler
- babel-preset-env

```bash:ターミナル
$ npm i -D vue   #vueのインストール
$ npm i -D vue-template-compiler   #vue-template-compilerのインストール
$ npm i -D babel-preset-env   #babel-preset-envのインストール
```

###ファイルの準備
vueJSのドキュメントの「[単一ファイルコンポーネント - Vue.js](https://jp.vuejs.org/v2/guide/single-file-components.html)」にあるソースコードを例として、以下のファイルを作ります。

####ディレクトリ構成

```
parcel-vue-startkit
├── .babelrc
├── index.html
├── app.js
└── vue
    └── hello.vue
```

```json:.babelrc
{
  "presets": ["env"]
}
```

```html:index.html
<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Parcelでvueを動かしたい</title>
</head>

<body>
  <div id="app"></div>
  <script src="app.js"></script>
</body>
</html>
```

```javascript:app.js
import Vue from 'vue/dist/vue.esm.js';
import Hello from './vue/hello.vue'

const app = new Vue(Hello);
app.$mount('#app');
```

```html:vue/hello.vue
<template>
  <p>
    {{ greeting }} World!
  </p>  
</template>

<script>
  module.exports = {
    data: function() {
      return {
        greeting: 'Hello',
      }
    }
  }
</script>

<style scoped>
  p {
    font-size: 2em;
    text-align: center;
    color: #2e9afe;
  }
</style>
```

##動作確認
###実行コマンド
次のコマンドでコンパイルを行うと、ビルド結果が表示されます。

```bash:ターミナル
$ npx parcel index.html
⏳  Building...
Server running at http://localhost:1234 

✨  Built in 1.89s.
```

この結果の通り`http://localhost:1234 `にアクセスすると
動作の結果を見ることができます。
![スクリーンショット 2017-12-20 14.43.34.png](https://qiita-image-store.s3.amazonaws.com/0/135623/2df37908-b51b-73dc-9390-10a7cdc29383.png)


###結果の出力先はどこに？
プロジェクトフォルダ直下にdistファイルが自動的に作成され、
そこにコンパイル結果が出力されていることが確認できます。
![スクリーンショット 2017-12-20 14.48.14.png](https://qiita-image-store.s3.amazonaws.com/0/135623/5905d3fb-9060-ae6f-f414-d046f9b5729a.png)


##これからのParcelが楽しみ
今回、様々な記事やgithubを見た結果「便利だけど、製品版に使うのはまだ先」という感じでした。せめてソースマップがあれば・・・！
とはいえ、githubのstar数やparcel専用のプラグイン数が急上昇していることから、採用される未来はそんなに遠くないだろうなーと思います。
設定ファイルに翻弄されない未来がくるといいですね。
IPAファイルのProvisioning Profileを差し替える feat.Jenkins氏

#まえがき
この記事は [Silbird Advent Calendar 2017](https://qiita.com/advent-calendar/2017/silbird) の:tada:20日目:tada:の記事です。

iOSの開発端末の指定をまれによくつけたり外したりしてて、そのたびにリビルドをお願いするのが~~めんどくさい~~申し訳ないので、なんとか署名とかProvisioningProfileだけ無理やり差し替えられないか、ついでにWebからボタン一発ぐらいでできないかと試行錯誤してみました。

肝心の再署名部は偉大なる先駆者様を参考にさせて頂きました。
(http://www.minimalab.com/blog/2016/04/14/resign-ipa/)

#前提条件
OSX機(MBPなりなんなり)にXCodeを導入し、必要な証明書(コード署名に使用可能なDevelopment or Distribution証明書)を導入します。
また、`security find-identity -p codesigning -v`でちゃんと導入できているかの確認と、証明書の名前を控えておきます
(`"iPhone Developer: fumitti (0A1B2C3D4E)"`)
また、Jenkinsを用意します。今回は既存のJenkinsのスレーブとして用意しました。

#JenkinsのJob作成
とりあえず、更新するProvisioning ProfileをWebUIからアップロードして、IPAを成果物として受け取るスタイルにしたいと思います。
なので、ビルドのパラメータ化でファイルを受け取るようにします。
更新するProvisioningProfileと、差し替えるIPAファイルを受け取るようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96944/0b7be107-deb1-fdad-c1b6-fe2b5db6806d.png)

次に、本命の差し替え、再署名処理を追加します
シェルスクリプトとして追加するので、シェルの実行から
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96944/39ff9935-1b33-e8e6-5519-c303c84d3739.png)

```sh
rm -rf ./Payload
rm -f ./entitlements.plist
unzip AwesomeApp.ipa
codesign -d --entitlements :- ./Payload/AwesomeApp.app > entitlements.plist
cat entitlements.plist
cp -p new.mobileprovision ./Payload/AwesomeApp.app/embedded.mobileprovision
codesign --force --sign "iPhone Developer: fumitti (0A1B2C3D4E)" --timestamp=none --entitlements entitlements.plist Payload/AwesomeApp.app
zip -ry AwesomeApp.ipa Payload
```
を追加します。
また、このままだとキーチェーンアクセスの認証を求められてしまうので、`security unlock-keychain -p <キーチェーンのパスフレーズ>`を先頭に追加し、キーチェーンへのアクセスを確保するか、キーチェーンアクセスAppより、該当秘密錠の情報より、codesignへのアクセスを許可しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96944/89487ceb-8fc1-4c81-761b-8c0175b3e59a.png)

最後に、ZIPで固めたIPAファイルを成果物として保存します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96944/edf7c58c-9967-5aaf-61a1-b4ef5afc2b9f.png)

#実行
https://developer.apple.com/account/ios/device/create から開発端末を追加or削除し、
https://developer.apple.com/account/ios/profile/ から更新するProvisioning Profileを選択し、中のDevicesを適宜更新し、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/96944/c3af8e17-f5b3-f79b-0ead-4aaf27f7d9c6.png)
ダウンロードします。

その後、Jenkinsで作ったJobを実行し、ダウンロードしたプロファイルを渡してやれば、再署名されたIPAファイルが成果物として保存されます。
![Awesome.png](https://qiita-image-store.s3.amazonaws.com/0/96944/c550f858-aa98-97b6-3f40-ecf472e14651.png)

YATTA！
ちなみに、ファイルを渡さずにビルドを実行することも可能で、その場合前回のビルドで使われたものが使いまわされるので毎回IPAファイルを渡してあげなくても大丈夫です。

成果物として保存しているので、ほかのJobから参照できますので、このJobのあとにOTAInstallサイトのIPA更新とかも~~頑張れば~~自動化出来ちゃいますね！

#あとがき
これで、毎回ビルド職人にお願いしなくてもWebですべての処理を完結させることができるようになり、主にビルド職人さんと僕がすこしハッピーになりました！
皆さんも是非自動化を進めてハッピーになりましょう！
Macでmupdf-toolsとImageMagickを使ってPDFを分割、JPEGに変換

# やりたかったこと

* 複数ページのPDFを1ページずつに分割する
* 分割したPDFをJPEGに変換する
* （予期せぬタスク）ページサイズが意図したものと違ったのでリサイズ

# 環境

* Mac OSX 10.13.1
* ImageMagick 7.0.7-14
* mupdf-tools 1.12.0

# やったこと

**参考：**
http://a244.hateblo.jp/entry/2017/03/30/060000
http://o.inchiki.jp/obbr/125

インストール

```
brew install imagemagick mupdf-tools
```

PDFを1ページずつJPEGに変換

```
mutool draw -o %d.jpg input.pdf
```

ページサイズが意図したものと違ったのでリサイズ

```resize.sh
for i in $(seq 1 10) ; do
  convert -resize 666x842 $i.jpg resized/$i.jpg
done
```

リサイズされたJPEGから分割されたPDFを再生成

```topdf.sh
for i in $(seq 1 10) ; do
  convert resized/$i.jpg pdf/$i.pdf
done
```

# 振り返り

繰り返し処理が頭悪そうな感じあるが放置されている…。
Swiftで素数判定してみたVol.1

#Swiftで素数判定してみた


この記事ではSwift4.0を使用して記述します。

徐々に実行スピードを速くするなど改良していきたいと思います。


```sosu.swift
import Foundation
    
func issosu(_ n:Int)->Bool{
    
    if(n<2){
	
        return false
		
    }
	
    if(n == 2){
	
        return true
		
    }
    
    var p = 3
	
    while p < Int(Double(n))+1 {
	
        if(n%p==0 && n != p){
		
		    return false
			
		}
		
        p = p + 2
		
    }
	
    return true
	
}
    
    
    
var n = 2

while n < 10000 {

    if issosu(n) {
	
        print(n)
		
    }
	
    if n == 2 {
	
        n = n - 1
		
    }
	
        n = n + 2
		
}
```
ImageMagick で複数画像を指定サイズに変換する

やりたいことはバラバラなサイズの透過付き画像があってそのサイズを揃えたいときに実行しました。



一枚だけ 128x128 へサイズ変更

```sh
convert 1.png -resize 128x128 -background none -gravity center -extent 128x128 out.png
```



カレントディレクトリの png を全て 128x128 へ

```sh
mogrify -resize 128x128 -background none -gravity center -extent 128x128 *.png
```

mogrify は元画像を変更してしまうのでそれが嫌であればバックアップを取った後に実行するか、シェルスクリプトで convert コマンドを回す感じにするといいと思います。



参考

<http://www.imagemagick.org/discourse-server/viewtopic.php?t=31290>
<https://stackoverflow.com/questions/9155377/set-transparent-background-using-imagemagick-and-commandline-prompt>
200 or 204 どっちを使うか

`PUT`と`DELETE`メソッドで200返すか204返すか悩んだのでそのメモ
200返すか204を返すか大体の方針が見えるはず！

# 204について
HTTPステータスコードの204 No Content
訳すると`内容なし`。HTTPステータスコードとして204を返すのなら、その名の通りレスポンスボディーは何も返さないのが正解

参考: [RFC2616 日本語訳の複製][2]

# PUT
[RFC2616 9.6 PUT 日本語訳の複製][3]には更新成功時には`200`か`204`と記載されていました

* 既存のデータを更新するだけなので、正しく更新された場合は204のステータスコードだけを返せばいいよー派
* 変更された状態のデータを返すべき！ステータスコードは200で！派

PUTでは上記の2つの派閥？考え？宗教戦争？？？？があるようです


RESTfulについて勉強する際にバイブルとしていた本。[Web API: The Good Parts][1] では、後者の200を返すことをおすすめしていたので、基本は200でいいのかなー安直

自分は基本は`200`だけど用意するAPIで使い分けるという意見に自分は落ち着きました
(W3Cもどちらかを使いましょうまでしか言及していないのでこれでいいはず...)

# DELETE
DELETEに関しては、W3Cがこれ！ってものを出していたので従うのがいいかなと思います。


> 成功したレスポンスは、もしレスポンスがステータスで表しているエンティティを含んでいるなら 200 (OK)、もし動作がまだ行われていないなら 202 (Accepted)、もし動作は行われたが、レスポンスにエンティティを含んでいないなら 204 (No Content) であるべきである>
 [RFC2616 9.7 DELETE 日本語訳の複製][4]

論理削除なら200、物理削除なら204でいけそうです

# おまけ
すごい図がありました
ただし200と204の分岐が`to content` でしかなかったので結局ボディー送るか送らないか考える必要はあるんですけどね笑
![](https://raw.githubusercontent.com/for-GET/http-decision-diagram/master/httpdd.png)
https://raw.githubusercontent.com/for-GET/http-decision-diagram/master/httpdd.png

# 参考
- https://triple-underscore.github.io/RFC2616-ja.html
- https://stackoverflow.com/questions/2342579/http-status-code-for-update-and-delete
- https://raw.githubusercontent.com/for-GET/http-decision-diagram/master/httpdd.png
- http://blog.ploeh.dk/2013/04/30/rest-lesson-learned-avoid-204-responses/

[1]: https://www.oreilly.co.jp/books/9784873116860/
[2]: https://triple-underscore.github.io/RFC2616-ja.html#section-10.2.5
[3]: https://triple-underscore.github.io/RFC2616-ja.html#section-9.6
[4]: https://triple-underscore.github.io/RFC2616-ja.html#section-9.7
スコープ付きCSSで別のコンポーネントにスタイルを当てる

書かれなかったみたいなので、代わりに先日投稿したものを紹介します。

`Vue.js`を使っているときに、`scoped`内で別のコンポーネントにスタイルを当てるときにはまったので備忘録として残しておきます。

# 概要

`scoped`を使っている際に親のコンポーネントで子のコンポーネントのスタイルを変更しようとしても、別のスコープとなるため変更できません。
グローバルに書いていくという手もありますが、すると`SFC`の利点が得られませんし、すぐに管理できなくなります :innocent: 
外部で定義された汎用コンポーネントとかを使う場合によく遭遇します。

# 例

簡単な例で確認していきます。

※ `pug`と`sass`を使っています


# 子コンポーネント

デフォルトで赤色のテキストを表示するだけのコンポーネントです。

```html:Child.vue
<template lang="pug">
.child-container
  .child-layout
    p.title ChildComponet
</template>

<script>
export default {
  name: "child",
}
</script>

<style lang="sass" scoped>
.title
  color: red
</style>
```

## 親コンポーネント

子コンポーネントを持ち、子のテキストを緑色にしようしています。

```html:Parent.vue
<template lang="pug">
.parent-container
  p.title ParentComponent
  child.child
</template>

<script>
import Child from "./Child"

export default {
  components: { Child }
}
</script>

<style lang="sass" scoped>
.title
  color: blue

.child .title
  color: green
</style>
```

## 実行結果

上記のコードを実行すると子のテキストは赤色のままです :sob:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97227/74d90249-c19a-dc0d-1f83-0869eb2d1c70.png)

出力されるHTMLにはコンポーネントのスコープを表す`data-v-XXX`というアトリビュートが設定されています。
(今回だと親は`data-v-a1-c2f88c`、子は`dta-v-10e5fd3c`)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97227/750ef2f0-ea9d-a618-6360-c9b1b0114618.png)

対してスタイルでは期待通りのスコープにはなっていません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97227/3e43c746-d586-2334-ff96-99059c05bde3.png)


# 解決策

よく読んだら[公式のスコープ付き CSSのページ](https://vue-loader.vuejs.org/ja/features/scoped-css.html)に書いてありました。

> scoped スタイルで入れ子のセレクタが必要なら、CSS に対して >>> オペレータを、そして scss に対しては /deep/ を使用する必要があります

「入れ子」という表現が今回の例にマッチすることだと気づかず、何回もスルーしてましたorz

親コンポーネントに`/deep/`を反映してみます。

## 親コンポーネント

子のコンポーネント以下になるところで`/deep/`を追加します。

```html:Parent.vue
<template lang="pug">
.parent-container
  p.title ParentComponent
  child.child
</template>

<script>
import Child from "./Child"

export default {
  components: { Child }
}
</script>

<style lang="sass" scoped>
.title
  color: blue

.child /deep/ .title
  color: green
</style>
```

## 実行結果

期待通りに緑色となりました :sunglasses: 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97227/5988bfd7-97f6-9454-3a3a-2dfc150fc163.png)

スタイルはこんな感じで、`.child`にスコープの値が設定されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97227/0e811a3d-c5f8-0a8b-bf1d-4084fe312f9b.png)

※HTMLに変化はないです。

# 注意点

`/deep/`をつけた後の結果を見ると分かりますが、`/deep/`以下はコンポーネント内部でグローバルになるので複数のコンポーネントを持つ場合は注意してください。
Laravelのメール送信で詰まったところ(備忘録)

# 概要
SMTPにgmailを使って、メール送信をする

# 詰まった点
https://qiita.com/sutara79/items/0ea48847f5565aacceea
上記の記事を参考にメール送信を実装しようとしたところ、いくら頑張っても送信できず。

## エラー文
`Swift_TransportException with message 'Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required`

# 解決するには
- .envの記述を100回くらい確認する
- .envの記述が本当に間違いがないか5回くらい確認する
- **.envの記述の間違いに気づく**
- Googleアカウントの**二段階認証**を有効化する(おまけ)


``` php:.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=hogehoge@gmail.com
MAIL_PASSWORD=gehogeho
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=hogehoge@gmail.com
MAIL_FROM_NAME=hoge
```
という記述の上に、同じような記述があると、上にある記述のほうが優先して読み込まれます。
いくらMAIL_USERNAMEを変えて、

``` php:view
dd(\Config::get('mail'));
echo \Config::get('mail.username');
```

こんなことしても、

``` php:terminal
$ php artisan config:cache
```
キャッシュをクリアしても、、
.envの記述がおかしかったら治りません

# Googleの二段階認証も忘れずに

あと、Googleの二段階認証もしていないと、そもそも
https://security.google.com/settings/security/apppasswords
ここで詰まります。
(他のサイトは認証設定してたのに、Googleだけしたつもりになってました、、、危ない)
誤って解放したElastic IP(EIP)を復旧する

オペミスでElastic IPアドレス(EIP)を解放できないように、[IAMポリシーでElastic IP(EIP)の解放を許可しない](https://qiita.com/masarusan776/items/0de6e1432814880d6541)という記事を以前書いたけど、復旧するコマンドがあったので、まとめておく。
# Elastic IPアドレスの復旧ルール
**以下のルールに沿えば、Elastic IPアドレスを解放した場合でも、復旧できる可能性がある。**

* もともと EC2-VPC で使用するために割り当てられていたか、EC2-Classic から EC2-VPC に移動された Elastic IPアドレスだけを復旧できる。
* 他のAWSアカウントに割り当てられている場合は復旧できない。
* Elastic IPアドレスの割当上限（AWSアカウント作成時のデフォルトでは5個）を超過する場合は、復旧できない。

**[ユーザーガイド(日本語版)](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-eip-recovering)では、以下のように記述されているが誤訳。**

> * もともと EC2-VPC で使用するために割り当てられていたか、EC2-Classic から EC2-VPC に移動された Elastic IP アドレスを **復元することはできません。**

> _(原文)[ユーザーガイド(英語版)](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-eip-recovering)_
> You can only recover an Elastic IP address that was originally allocated for use in EC2-VPC, or that was moved from EC2-Classic to EC2-VPC.

# オペレーション
```shell
# EIPを割り当てるコマンドに--addressオプションを付加して実行する
$ aws ec2 allocate-address --domain vpc --address 203.0.xx.yy

# 実行結果
{
    "PublicIp": "203.0.xx.yy",
    "Domain": "vpc",
    "AllocationId": "eipalloc-abcdefgh"
}
```
# その他
運悪く、他所のAWSアカウントにEIPを割り当てられてしまった場合は復旧不可なので、誤って解放した事に気付いた時点で速やかに復旧する必要がありそう。

# 参考
[Amazon Elastic Compute Cloud Linux インスタンス用ユーザーガイド - Elastic IP アドレスの復旧](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-eip-recovering)
起動できないコンテナからデータレスキュー

# 事象
kubernetes環境でnode1（Minionサーバ）がハード障害により再起動。
node1復旧後にコンテナ自体は再作成されましたが、その中にデータを永続化していないコンテナがあったため、DBが空になってしまった:fearful:

# 復旧に向けて
node1につなぎ以下を試みる。

|コマンド|結果|
|---|---|
|docker start <コンテナ名>|起動せず|
|docker commit <コンテナ名> <イメージ名>|DBデータのないイメージが作成された|
|docker inspect <コンテナID>|コンテナ詳細情報...の中にDBデータへのパスが！|
```
[root@hogehoge ~]# docker inspect 3f1ec342f66f
(省略)
"Mounts": [
        {
            "Name": "7e9049ff56d67dd8220977b683792969351a624c0df847af722b5e442aee6691",
            "Source": "/var/lib/docker/volumes/7e9049ff56d67dd8220977b683792969351a624c0df847af722b5e442aee6691/_data",
            "Destination": "/var/lib/mysql",
            "Driver": "local",
            "Mode": "",
            "RW": true
        },
(省略)
```
この情報でホスト側からデータを取得することができ、データをロストせずに済みました:sweat_smile:
コンテナにもよると思いますが、マウント設定していなくともデフォルトでされているのですね・・・感謝。
逆にマウント設定されていないコンテナの場合は`docker commit`でデータもイメージに取り込まれるのかも知れません。

# 後で気づいた
テンパってて試さなかったけど、`docker cp`でディレクトリごとコピーもできるみたい。