OmniAICreator/Qiita-1.07M huggingface dataset:
VisualStudio2017のオフラインインストール

# Visual Studio 2017が出ました

Visual Studio 2017が出たので導入しようという方も多いと思いますが、導入台数が複数台になると毎回ダウンロードするのは意外と時間がかかって不便です。
従来であればISOイメージを落としてきて仮想ドライブにマウントして…という手があったのですが、どうもISOイメージの提供予定は無いようで、オフラインインストールファイルを自分で用意する必要があるようです。

# オフラインインストールファイルの作り方

作るというかダウンロードしてくるだけですが。。。

## ダウンローダーのダウンロード先とオフラインインストールファイルのダウンロード先を作る

今回はCドライブ直下に vs2017 というディレクトリを作成し、そこにまずダウンローダーをダウンロードします。
そしてダウンローダーを使い vs2017/dlfile にオフラインインストールファイルをダウンロードします。

とりあえずディレクトリを作ります。
コマンドプロンプトを起動して以下のコマンドを入力してください。

```
cd c:\
mkdir vs2017
mkdir vs2017\dlfile 
```

## ダウンローダーをダウンロードする
ダウンローダーをダウンロードするというのは変な感じですが、とりあえずダウンロードします。
とりあえず [Visual Studioの公式サイト](https://www.visualstudio.com/ja/vs/whatsnew/) にある**Visual Studioのダウンロード**からダウンロードします。

若干わかりにくいですがそれぞれのリンク先は以下のようになっています。

[Visual Studio Community 2017](https://www.visualstudio.com/ja/thank-you-downloading-visual-studio/?sku=Community&rel=15)
[Visual Studio Professional 2017](https://www.visualstudio.com/ja/thank-you-downloading-visual-studio/?sku=Professional&rel=15)
[Visual Studio Enterprise 2017](https://www.visualstudio.com/ja/thank-you-downloading-visual-studio/?sku=Enterprise&rel=15)

とりあえず今回は無料版のCommunityで進んでいきます。
上記リンク先から **vs_community__1536533144.1489752389.exe** をダウンロードします。
(このファイル名はバージョン番号が付与されていると思いますので、vs_community～～.exeであればたぶん大丈夫です。)
保存先は **C:\VS2017** にしてください

ファイル名があまりにも長いので**vs_community.exe**というファイル名にリネームします。
(普通に右クリックしてファイル名を変更でも問題ありません。)

```
cd c:\vs2017
ren vs_community__1536533144.1489752389.exe vs_community.exe
```

するとこのようになります。

![000.png](https://qiita-image-store.s3.amazonaws.com/0/151455/3b1708c3-ac94-a3cd-986f-4247488f1451.png)

## オフラインインストールファイルをダウンロードする

それではダウンロードに入る前に準備ができているか確認します。
以下のコマンドを入力して、dlfileというディレクトリとvs_community.exeが見えれば準備完了です。

```
dir
```

![001.png](https://qiita-image-store.s3.amazonaws.com/0/151455/21f3491f-b218-35ef-15c0-ebfb766f8f83.png)

以下のコマンドを入力します。

```
vs_community.exe --layout ./dlfile
```

![002.png](https://qiita-image-store.s3.amazonaws.com/0/151455/7fde9d0b-83c5-2a93-0741-c195e170b9ed.png)

実行権限の確認が出ると思いますので、**はい**を選択します。

しばらく待つと新しいコマンドプロンプトのような画面が起動してダウンロードが始まります。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/151455/b52bfc83-bce8-8d3a-98c3-b684f94f8202.png)


ダウンロードが完了するまで1時間程度かかりますが、完了するとダウンローダーが終了します。
今回の総ダウンロードファイルサイズはおよそ23.6GBでした。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/151455/26b2db2e-3a7a-5822-1bb9-54d2a121c9c1.png)

## Visual Studio 2017のインストーラー

C:\vs2017\dlfile がオフラインインストールに必要なファイル一式となります。
インストーラーは **C:\vs2017\dlfile\vs_community.exe** です。
（ダウンローダーである C:\vs2017\vs_community.exe はもう不要ですので、削除して問題ありません。）

![005.png](https://qiita-image-store.s3.amazonaws.com/0/151455/9da54618-0090-4242-6eab-dc6b5a29ab55.png)

## その他のオプション

公式サイトにはいくつかのオプションの例が掲載されていますのでそちらを参考にしてください。

## 公式サイト
[Create an offline installer for Visual Studio 2017](https://docs.microsoft.com/en-us/visualstudio/install/create-an-offline-installation-of-visual-studio)
[Create a network installation of Visual Studio 2017](https://docs.microsoft.com/en-us/visualstudio/install/create-a-network-installation-of-visual-studio)
PyCharmを完全に英語化する（時々表示される日本語を消す）

#目的
PyCharmの設定画面に日本語が混じっていて気になりました。
![fig1.jpg](https://qiita-image-store.s3.amazonaws.com/0/161252/26ebbde0-2248-4d46-8960-1435ddcf90fc.jpeg)
~~画面の完全な日本語化はまだ無理そうなので~~、せめてこの表示を全部英語に変えたいと思います。(3/23追記:コメント欄にて、Pleiadesという日本語化プラグインがあることを教えていただきました)

OSはwindows10 64bit、PyCharmのバージョンはcommunity 2016.3.3です。

#方法
javaの実行オプションでロケールをenに変えれば、すべての表示が英語になります。
PyCharmの実行ファイルがあるフォルダ（デフォルトでは```C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3.3\bin```）の
pycharm64.exe.vmoptions(32bitならpycharm.exe.vmoptions)を開いて、最終行に```-Duser.language=en```と追加します。PyCharmを再起動すると、下のようにすべての表記が英語になりました。
![fig2.jpg](https://qiita-image-store.s3.amazonaws.com/0/161252/c6b7612a-4815-cf74-aaa7-4570ee3ef5c1.jpeg)

これで落ち着いて開発ができる！（読めるかは別問題）
リテラルの toString() 問題 (？)

`node` と対話しながら [型と値 · GitBook](https://hatena.github.io/Hatena-Textbook-JavaScript/language/type.html) を読んでたら気付きました。

```
> 123;
123
> 123.toString();
123.toString();
^^^^
SyntaxError: Invalid or unexpected token

> (123).toString();
'123'
```

えっ！？と思ったので chrome のコンソールでも確かめました。この振る舞いで正しいらしい。
どういうコトなんですかああああ。

`123` はプリミティブ値で、 `(123)` とした時点で `Number` オブジェクトになるんかいなあ……？
【初心者投稿-5】学習リズムと明日からの学習について

#昨日までのおさらい
* Progate「HTML&CSS 学習コース 初級編」2周目終了
* 平日サラリーマン、文系人間でも案外出来るし、楽しい！

#学習リズムについて
案外平日のほうが勉強って続く？
この3連休は初日会社の2日間は予定があって全然パソコン触れなかった！
なるべく土日にまとめて勉強するようにして、平日に最低1時間は勉強する学習習慣を作ろうと思う。

成果としては、「やらないとなんか落ち着かない！」っていう心理状況は作れていると思う！

#明日からの学習について
道場コース「HTML&CSS 学習コース 初級編」をやろうと思う。
目安7時間ですが、平日で終わらすのが目標。
wildflyのインストール

## グループとユーザ作成
```
groupadd -r wildfly
useradd -r -g wildfly -s /bin/false -d /nonexistent wildfly
usermod -s /bin/bash -d /home/wildfly wildfly
```

## wildfly本体ファイルを取得
```
wget http://download.jboss.org/wildfly/9.0.2.Final/wildfly-9.0.2.Final.tar.gz
```
## 解凍
```
tar xvzf wildfly-9.0.2.Final.tar.gz
```

## ファイルを/var/serviceへ移動
```
cp -rp wildfly-9.0.2.Final /var/service/wildfly
```

## 所有者変更
```
chown -R wildfly:wildfly /var/service/wildfly
```

## ログフォルダ作成
※今回はwildfly/logに指定する。
```
mkdir /var/service/wildfly/logs
chown -R wildfly:wildfly /var/service/wildfly/logs
```

## PIDフォルダ作成
```
mkdir /var/run/wildfly
chown -R wildfly:wildfly /var/run/wildfly
```

## 設定ファイルを/etc/default/wildfly.confへコピー
```
cp -p /var/service/wildfly/bin/init.d/wildfly.conf /etc/default/wildfly.conf
```

## 設定ファイル変更
コメントアウトを外して、微調整

```vim:wildfly.conf
# General configC34:C67the init.d scripts,
# not necessarily for JBoss AS itself.
# default location: /etc/default/wildfly

## Location of JDK
JAVA_HOME="/usr/bin/java"

## Location of WildFly
JBOSS_HOME="/var/service/wildfly"

## The username who should own the process.
JBOSS_USER=wildfly

## The mode WildFly should start, standalone or domain
JBOSS_MODE=standalone

## Configuration for standalone mode
JBOSS_CONFIG=standalone.xml

## Configuration for domain mode
# JBOSS_DOMAIN_CONFIG=domain.xml
# JBOSS_HOST_CONFIG=host-master.xml

## The amount of time to wait for startup
STARTUP_WAIT=60

## The amount of time to wait for shutdown
SHUTDOWN_WAIT=60

## Location to keep the console log
JBOSS_CONSOLE_LOG="/var/service/wildfly/logs/console.log"

## Additionals args to include in startup
JBOSS_OPTS="-b 0.0.0.0"
```

## 起動スクリプトをinit.dへコピー
```
cp /var/service/wildfly/bin/init.d/wildfly-init-redhat.sh /etc/init.d/wildfly
```

## 起動確認
```
service wildfly start
service wildfly stop
```

## 管理ユーザを登録
ユーザ名とパスワードを設定する。

```
/var/service/wildfly/bin/add-user.sh
```

## 管理コンソールの起動

```
/var/service/wildfly/bin/jboss-cli.sh
```

## デプロイ
- デプロイ
deploy test.war

- 削除
undeploy test.war

- 上書き
deploy test.war --force

- name指定
deploy test.war --name=test.war
Vue.jsでリストの一部をレンダリングする方法

※[はてブ](http://www.kunst1080.net/entry/2017/03/17/215820)とのマルチポストです

----

vue.jsの`v-for`でアイテムのリストを描画する際`v-for="item in items"`でループを書くと思いますが、この`items`を`slice`してやることでリストの一部だけを描画することができるようです。

※やってみたらできた;)

### サンプルコード

```html
<html><body>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.4/vue.min.js"></script>

<div id="sample">

  <h4>List1</h4>
  <ul>
    <li v-for="item in items.slice(0,2)">
      item = {{item}}
    </li>
  </ul>

  <h4>List2</h4>
  <ul>
    <li v-for="item in items.slice(2,4)">
      item = {{item}}
    </li>
  </ul>

  <h4>List3</h4>
  <ul>
    <li v-for="item in items.slice(4,6)">
      item = {{item}}
    </li>
  </ul>

</div>

<script>
var vm = new Vue({
    el: "#sample",
    data: {
        items: ["a", "b", "c"]
    }
});

// 要素を追加すると、sliceで割り当てられた部分に描画される
vm.items.push("d");
vm.items.push("e");
vm.items.push("f");

</script>

</body></html>
```

### サンプル表示

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/42741/27596fd4-2c1e-72c6-0220-833173aa6180.png)


# 関連するマニュアルのURL
* [https://jp.vuejs.org/v2/guide/list.html:title]
AndroidSDK Rev.25.3.0以上でビルドコマンドが変わった？（その対処）

取り急ぎやったことですが、メモとして残しておきます。

cocos2d-x(ver3.11)を使用していて、AndroidStuidoを２．2から2.3にアップデートにする際に、AndroidSDKもアップデートして25.3.0にしました。
その後、「cocos compile」でビルドしようとしたら以下のエラーが出力されました。

>
The android command is no longer available.
For manual SDK and AVD management, please use Android Studio.
For command-line tools, use tools/bin/sdkmanager and tools/bin/avdmanager
Error running command, return code: 1.

どうやらビルドコマンドが変わったようです。

対処法が以下の動画から。

FIX: The "android" command is no longer available
https://www.youtube.com/watch?v=FMLVY3PqPlc

動画はWindowsでやっていますが、Macbookでもディレクトリの構成が違うくらいで同様の手順でできました。

平たく言えば、AndroidSDKの/Toolsだけを25.3.0以前に手動で戻しただけってことです。
本来は「sdkmanager」「avdmanager」というコマンドでビルドしないといけないはず。

そんな発信元からすればイレギュラーなことを取り急ぎやってみただけなので、後で何かあることは覚悟しておかないといけませんね・・・・・・真似するにしても自己責任ですよ？（笑）

今のところは僕の手元では普通に動いていますが、何かあったら当該記事に追記しまーす。

それでは。

追記１：「android avd command-line functionality replaced with new avdmanager tool.」だって
https://developer.android.com/studio/releases/sdk-tools.html
Swiftのmutatingキーワードについて

struct, enumで自身の値を変更する場合、funcの前にmutatingキーワードを書く。
再代入が行われるため、mutatingなメソッドは定数に対しては実行できない。

```swift
extension Int {
    // mutatingがない場合、コンパイルエラー
    // left side of mutating operator isn't mutable: 'self' is immutable
    mutating func plusOne() {
        self += 1
    }
}

var a = 1
a.plusOne() //2

let b = 1
// letで宣言したためコンパイルエラー
// cannot use mutating member on immutable value: 'b' is a 'let' constant
b.plusOne()
```

structの場合、ストアドプロパティを変更する場合にもmutatingキーワードが必要。
（structのストアドプロパティの変更=構造体の値の変更のため）

```swift
struct MyStruct {
    var member: Int
    
    init(member: Int){
        self.member = member
    }
    
    mutating func plusOne() {
        self.member += 1
    }
}

let myStruct = MyStruct(member: 1)
// letで宣言したためコンパイルエラー
// cannot use mutating member on immutable value: 'myStruct' is a 'let' constant
myStruct.plusOne()
```
bxslider ver3 実装テスト

# bxslider ver3 実装テスト

jquery1.5.2 の環境で画像スライダーを実装する必要があったので、bxslider var3での実装テスト。

- [jquery1.5.2 download](http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js)
- [bxslider-3 github](https://github.com/stevenwanderski/bxslider-3)
- [bxslider Version 3.0 Documentation](http://bxslider.com/v3)

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<title>bxslider test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery.bxslider3.js"></script>
<script type="text/javascript">
$(document).ready(function(){
  $('.js-bxslider').bxSlider({
    slideWidth: 720,
    speed: 1000,
    pause: 4000,
    auto: true,
    pager: true,
    pagerSelector: '.slider_pager',
    prevSelector: '.slider_prev',
    nextSelector: '.slider_next',
    prevText: '&lt;',
    nextText: '&gt;',
  });
});
</script>
<style>
p,ul {
  margin: 0;
  padding: 0;
}
ul {
  list-style: none;
}
img {
  width: 100%;
  height: auto;
  vertical-align: top;
}

.sample {
  width: 720px;
}
.slider_nav {
  text-align: center;
}
.slider_nav a {
  display: inline-block;
  margin: 5px;
  text-decoration: none;
  line-height: 1;
  vertical-align: middle;
}
.slider_prev,
.slider_next,
.slider_pager {
  display: inline;
  vertical-align: top;
}
.slider_prev a,
.slider_next a {
  padding: 0 2px;
  background-color: #ccc;
  color: #fff;
  line-height: 20px;
}
.slider_pager a {
  overflow: hidden;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background-color: #ccc;
  text-indent: 100%;
  white-space: nowrap;
}
.slider_pager a.pager-active {
  background-color: #000;
}
</style>
</head>
<body>

<div class="sample">
  <ul class="slider js-bxslider">
    <li><img src="./images/photo.jpg"></li>
    <li><img src="./images/photo.jpg"></li>
    <li><img src="./images/photo.jpg"></li>
  </ul>
  <div class="slider_nav">
   <div class="slider_prev"></div>
   <div class="slider_pager"></div>
   <div class="slider_next"></div>
  </div>
</div>

</body>
</html>
```

以上です。
とりあえずdebugAPKをCircleCIでdeploygateにデプロイしてみる

CircleCI触ったことのない人間でしたが、使えるようにならにゃということで備忘録。

## 目的
CircleCI使って、テスト〜デプロイ〜リリース作業を自動化する。
テストはローカルでもいいので、とりあえず今回はデプロイの自動化について。

## やること

### GitHubとCircleCIの連携
これはCircleCIとGitHubアカウントを連携すれば大丈夫。

### DeployGateのAPIキーをCircleCI環境変数に保存
プロジェクトの設定→Environment Variables→Add Variables

### プロジェクト直下にcircle.ymlを配置
```
general:
  branches:
    only:
      # プッシュされたビルド実行するブランチを指定
      - pre-release
  artifacts:
    # Artifactsで見えるようにするファイル
    - app/build/outputs/apk/app-debug.apk
machine:
  java:
    # java8を指定
    version: openjdk8
  environment:
    # $ANDROID_HOMEを指定 (おまじない)
    ANDROID_HOME: /usr/local/android-sdk-linux
dependencies:
  pre:
    # 新しいSDKだとCircleCIがライセンス持ってないので、ローカルに合わせる
    - mkdir $ANDROID_HOME/licenses
    - echo "8933bad161af4178b1185d1a37fbf41ea5269c55" >> $ANDROID_HOME/licenses/android-sdk-license
  override:
    # AndroidManifest.xmlを参照し、必要なSDKとビルドツールを指定
    - echo y | android update sdk --no-ui --filter "android-25,build-tools-25.0.2"
test:
  override:
    # 今回はテスト書いていないので何もしない
    - echo "Nothing to do here."
deployment:
  master:
    # デプロイするブランチ名を指定
    branch: pre-release
    commands:
      # デバッグAPK生成
      - ./gradlew assembleDebug
      # DeployGateにアップロード
      #  環境変数DEPLOY_GATE_API_KEYはCircleCIで設定
      - curl -F "token=${DEPLOY_GATE_API_KEY}" -F "file=@app/build/outputs/apk/app-debug.apk" -F "message=deployed" https://deploygate.com/api/users/ユーザー名/apps

```

とりあえずこれを配置して、ターゲットブランチをプッシュする。

## 結果
・プッシュするだけでテスト、ビルド、デプロイをしてくれちゃう。
・DeployGateに勝手に上がるので動作確認楽チン。
【Git】 project.pbxprojのコンフリクトの直し方

#project.pbxprojファイルのコンフリクト解消
XcodeでiOSの開発をしているときに絶対に起こしたくないコンフリクトの解消の仕方をメモしておきます。
##そもそもなぜ起こるのか
新規ファイルを追加したりしたときにこのコンフリクトが起きる可能性が高いです。
##コンフリクト解消法
とりあえず`origin`に`master`と`develop`ブランチが存在しているとします。

1, 以下のコマンドを実行する

```
$git pull origin master                           // masterを最新状態に
$git checkout develop                             // developにブランチを切り替える
$git rebase master                                // masterをrebaseする
※コンフリクトする
$git checkout --ours プロジェクト名.xcodeproj/project.pbxproj   // masterの方を採用する
$git add プロジェクト名.xcodeproj/project.pbxproj               // 変更を保存する
$git rebase --continue
※コンフリクトが再度発生する場合があるので git checkout --ours プロジェクト名.xcodeproj/project.pbxproj以下を繰り返す
```

2, プロジェクトを開くと自分が追加したファイルがあるのでそれを削除する（参照切れを起こして赤くなっている）

3, finderから自分が追加したファイルをドラッグドロップで再度追加する。

##最後に
project.pbxprojのコンフリクトは起こしたくないと思っても起きてしまう...
[mergepbx](https://github.com/simonwagner/mergepbx)などの便利なものもありますがチーム開発となると導入は簡単にできないので上の方法で解消しちゃいましょう！
JavaScriptをオブジェクト指向として書く

# きっかけ
[Google流 JavaScript におけるクラス定義の実現方法](http://www.yunabe.jp/docs/javascript_class_in_google.html)という記事をみて、確か２社目の会社でこんな感じの書き方をしていたなぁというのを思い出した。いいやり方だと思ったので、再びキャッチアップすべく、そして備忘録としてこの記事を書く。

# はじめに
JavaScriptにはpublic,privateという概念がないが、この記事ではあえてその言葉を使う。

# コンストラクタ
## 基本形
```js
ClassName = function () {};
```

## 引数を与える場合
```js
ClassName = function (arg1, arg3) {
    this._arg1 = arg1;//privateはアンダーバーで始める等、Pythonと同じような命名規則を設けておく
    this._arg2 = arg2;
};
```

# 内部定数
```js
ClassName = function () {
    this._CONST_NAME = 1;
};
```

# private関数
```js
ClassName = function () {
    this._func_name1 = function(arg1){
        //色々な処理
    };
    this._func_name2 = function(){
        return this._func_name1(1);//同一クラスの他関数を呼び出す場合、thisをつける
    };
};
```

# public関数
```js
ClassName.prototype.public_func_name = function (arg1) {
    this._func_name1(1);
    var that = this;//JQueryの使用上、eachの中などではthisの意味合いが変わるため、中から内部変数などを実行したい場合はthatにthisを一時避難させておく。
    $.each(target_idxs,
        function (index, target_idx) {
            that._func_name2();
        }
     );
};
```

# インスタンス生成
```js
    a = ClassName();
    b = ClassName2(1); //コンストラクタで引数がある場合
```

# 継承
```js
//おそらくいたるところからこのinherits　を参照することになると思われるので、共通js等に記述しておくと良い
var inherits = function(childCtor, parentCtor) {
  Object.setPrototypeOf(childCtor.prototype, parentCtor.prototype);
};

inherits(ChildClass, ParentClass);
```

# 継承した場合のコンストラクタ
```js
var ChildClass = function(arg1){
    ParentClass.call(this, arg1);//親のコンストラクタを実行するにはcallを使い、第一引数にthisを指定する、Pythonっぽい。
};
```

# 親クラスのメソッドを実行する
```js
ChildClass.prototype.func_name = function(){
    ParentClass.prototype.func_name.call(this);//同じようにcallを使い、第一引数にthisを指定する
};
```

#最後に
そんな弊社ですが、もし興味がありましたら、[Qiitaの弊社技術者ブログトップページの下の方](http://qiita.com/organizations/techbureau)から連絡いただけましたら嬉しいです。お待ちしています！
JsonをそのままList<T>に変換する

JsonArrayをそのままList<Object>に変換する。
reflectパッケージのTypeを使う

```java
JSONArray jsonArray;
//jsonArrayに何か値が入る
Gson gson = new Gson();
Type listType = new TypeToken<List<Dto>>() {}.getType();
List<Dto> dtoList = gson.fromJson(jsonArray.toString(), listType);

```
http://stackoverflow.com/questions/8371274/how-to-parse-json-array-in-android-with-gson
cakephp3でテーブルのカラム名の取得

cakephp3でテーブルのカラム名の取得です。
Tableクラスのschemaから取得することができます。

```php
$table = TableRegistry::get ( 'テーブル名' );
$columns = $table->schema ()->columns ();
foreach ( $columns as $column ) {
    $this->log ( $column );
}
```
みたいな
JavaでBigQueryのテーブルの存在を確認する

# はじめに
JavaでBigQueryのテーブルがあるかないか確認する方法です。

GCPまわりはAPIのSDK(`com.google.api.services.*`)よりもそれをラップしたSDK(`com.google.cloud.*`)を使う方がだいぶ簡単ですね。
ぐぐると`com.google.api.services`のほうがよく出るのでそれを真似るととても複雑なコードになってしまいます :sweat_smile: 

# 依存
`build.gradle`はこんな感じです。

```groovy
apply plugin: 'java'
apply plugin: 'application'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.cloud:google-cloud-bigquery:+'
}

mainClassName = "Main"

run {
    if (project.hasProperty('args')) {
        args project.args.split('\\s+')
    }
}
```

# コード
見つかればFound、見つからなければNot foundと出力します。
引数でサービスアカウントのJSON Keyを指定すればそれで認証し、なければデフォルトのアカウントを使うようになっています。

```java
import com.google.auth.oauth2.ServiceAccountCredentials;
import com.google.cloud.bigquery.*;

import java.io.FileInputStream;
import java.io.IOException;

public class Main {
    private static final String DATASET = "yourdataset";
    private static final String TABLE = "yourtable";

    public static void main(String args[]) throws IOException {
        BigQuery bigQuery;
        if (args.length > 0) {
            bigQuery = getClientWithJsonKey(args[0]);
        } else {
            bigQuery = BigQueryOptions.getDefaultInstance().getService();
        }

        Table table = bigQuery.getTable(DATASET, TABLE);
        if (table != null) {
            System.out.println("Found!");
        } else {
            System.err.println("Not found");
        }
    }

    private static BigQuery getClientWithJsonKey(String key) throws IOException {
        return BigQueryOptions.newBuilder()
                .setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(key)))
                .build()
                .getService();
    }
}
```

# 実行
```bash
$ ./gradlew run -Pargs="/path/to/key.json"

# もしくは
$ ./gradlew run
```

# おわりに
`com.google.api.services`の方だけで頑張るとこんな感じで、認証まわりだけでもめちゃくちゃ複雑です :tired_face: 
https://github.com/googlearchive/bigquery-samples-java/blob/master/src/main/java/com/google/cloud/bigquery/samples/BigQueryJavaGettingStarted.java

今回のコードはこちらにあります :pencil:
https://github.com/nownabe/examples/tree/master/bigquery-table-existence
Apacheのpreforkっていくつまで子プロセス作れるんっだてばよ？

#結果 →　　200000まで増やせるッッツ！！

・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
![images.jpeg](https://qiita-image-store.s3.amazonaws.com/0/171250/0747bfc6-bbbf-f2ed-bf69-9980e1b1a54e.jpeg)


_思わず一桁づつ数えたわ！_



yumdownloaderでお手軽に諸々持って来て
ソースコード見ると・・・

```ruby:httpd-2.4.6/server/mpm/prefprk/prefork.c
#ifndef DEFAULT_SERVER_LIMIT
#define DEFAULT_SERVER_LIMIT 256
#endif

/* Admin can't tune ServerLimit beyond MAX_SERVER_LIMIT.  We want
 * some sort of compile-time limit to help catch typos.
 */
#ifndef MAX_SERVER_LIMIT
#define MAX_SERVER_LIMIT 200000
#endif

#ifndef HARD_THREAD_LIMIT
#define HARD_THREAD_LIMIT 1
#endif
```

ハードコーディングされてました！


> Apache MPM prefork
> https://httpd.apache.org/docs/2.4/mod/prefork.html

公式ドキュメントではApache Preforkでは、
"256の子プロセスを超えて設定したい場合は、
MaxClients設定しろ"、って書かれてます。

そもそもなんで256なのか、心の底にしまってた疑問も
単にそうコードで書かれてたからなんですね。
(数字の決め方だけどんな事情で設定さた数値なのかわからないですが・・・)


<h1>論と証拠だッ！！

と言いたいところだが、メモリやアクセスなど
物理的にもサービス的にも
そもそもそんな状況あるわけないじゃん（泣

どこかの変態よ、頼んだ!


_以上!!_
[iOS][Swift]UITableViewのヘッダーとフッターを設定する方法

先日、セクションのようにUITableViewにもヘッダーとフッターがあることを知ったのでその方法をメモ。

#1. Storyboardでヘッダーとフッター用のUITableViewCellを用意
<img width="679" alt="スクリーンショット 2017-03-20 20.23.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/6fbee167-c7a0-14db-d112-2b28e517d4a9.png">

#2. ViewControllerのviewDidLoadでTableViewのヘッダーとフッターを設定
TableViewのヘッダーとフッターはセクションのようにdelegateメソッドを実装する必要はなく、
viewDidLoadで設定する。

```swift
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        tableView.dataSource = self
        tableView.delegate = self
    
        // TableViewのヘッダーを設定
        let headerCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableHeaderCell")!
        let headerView: UIView = headerCell.contentView
        tableView.tableHeaderView = headerView
        
        // TableViewのフッターを設定
        let footerCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableFooterCell")!
        let footerView: UIView = footerCell.contentView
        tableView.tableFooterView = footerView
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // 行数
    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "articleCell")!
        return cell
    }
    
    // セクション数
    public func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    // セクションヘッダーの高さ
    public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 50
    }
}
```
立体感のあるバー

h1 {
padding: 0.4em 0.5em;/*文字の上下 左右の余白*/
color: #494949;/*文字色*/
background: #f4f4f4;/*背景色*/
border-left: solid 5px #7db4e6;/*左線*/
border-bottom: solid 3px #d7d7d7;/*下線*/
}
SwiftでKVCしてみる

# 概要
SwiftでKVC(Key-Value Coding)を実現する方法についてです。
Swiftでクラスを`NSObject`のサブクラスにすれば実現できるのですが、Swiftだけで実現できる方法はないかと調べていたらSwiftKVCというライブラリを見つけました。
今回はこのライブラリを活用してKVCしてみようと思います。

# ライブラリ
https://github.com/bradhilton/SwiftKVC

# 実装
実装時はKVCでアクセスしたい対象が`struct`の場合と`class`の場合で対応が分かれます。
対応は以下です。
* 対象が`struct`の場合、`Value`プロトコルへの準拠
* 対象が`class`の場合、`Object`プロトコルへの準拠
(ライブラリの実装を見るとそれぞれのprotocol extensionに実装が書いてあります。)

# 実装例
今回はライブラリのサンプルに倣って`Person`構造体を作成し、この構造体へのアクセスをしてみます。

```swift:Person.swift
struct Person: Value {
    var name: String
    var age: Int
}
```

## サブスクリプトを用いたアクセス
### 値の設定
値を設定する際は以下のように設定できます。

```swift
var person = Person()
person["name"] = "John"
person["age"] = 10
```

### 値の取得
値の取得は以下のような感じです。

```swift
let person = Person(name: "John", age: 10)
name = person["name"]
age = person["age"]
```

### エラー時の挙動
存在しないキーへのアクセスや、指定と違う型の値を設定しようとした場合は、値の設定の場合はその操作は無視されます。
また値を取得する場合は、`nil`が返ります。

## setメソッド、getメソッドを用いたアクセス
### 値の設定
`set(value:key:)`メソッドを用いて値を設定できます。
`set(value:key:)`メソッドはメソッド定義に`throws`キーワードの記載があるため、エラーハンドリングをする必要があります。

```swift
var person = Person()
do {
    try person.set(value: "John", key: "name")
    try person.set(value: 10, key: "age")
} catch {
    print(error)
}
```

### 値の取得
`get(key:)`メソッドを用いて値を取得できます。
こちらも`set(value:key:)`メソッド同様`throws`キーワードの記載があるため、エラーハンドリングが必要です。

```swift
do {
    let name = try person.get(key: "name")
    let age = try person.get(key: "age")
} catch {
    print(error)
}
```

### エラー時の挙動
存在しないキーへのアクセスや、指定と違う型の値を設定しようとした場合はエラーが発生し、`catch`ブロックに入ります。

# リポジトリ
以下に上記の設定や取得を試せるソースコードをあげています。
https://github.com/ikezzi/KVCExample

# まとめ
SwiftKVCライブラリを用いれば手軽にSwiftでKVCを実現できます。
ドット記法とサブスクリプト等キー文字列を用いたアクセス両方を使いたい場合に活用できるかと思います。
また、今回SwiftKVCのライブラリに触れましたが、このライブラリ自体はかなり軽量で実質裏側で使われているReflectionというライブラリが本体なのでこちらもどこかのタイミングで触れたいと思います。
アーキテクチャ設計の基本一覧

#はじめに
アーキテクチャについて考えるときの基本を整理しました。

#アーキテクチャ設計の基本となる考え方
 - [大規模Webアプリケーションにおける複雑性とアーキテクチャ設計に関する一考察](http://qiita.com/tmknom/items/be5c4b350f561991f2f5)
 - [システム間連携のアーキテクチャ、4つの基本パターンと正しい適用のポイント](http://www.atmarkit.co.jp/ait/articles/1501/26/news009.html)

# 〇〇アーキテクチャ

## マイクロサービスアーキテクチャ
 - [Sam Newman『マイクロサービスアーキテクチャ』](https://www.oreilly.co.jp/books/9784873117607/)

## クリーンアーキテクチャ
 - [クリーンアーキテクチャ](http://blog.tai2.net/the_clean_architecture.html)
 - [持続可能な開発を目指す ~ ドメイン・ユースケース駆動（クリーンアーキテクチャ） + 単方向に制限した処理 + FRP](http://qiita.com/kondei/items/41c28674c1bfd4156186)

## クラウドアーキテクチャ
 - [鈴木 雄介『Cloud First Architecture 設計ガイド』](https://www.amazon.co.jp/Cloud-First-Architecture-%E8%A8%AD%E8%A8%88%E3%82%AC%E3%82%A4%E3%83%89-%E9%88%B4%E6%9C%A8/dp/4822237818)
 - [AWS「クラウドコンピューティングのアーキテクチャ: ベストプラクティス」](https://aws.amazon.com/jp/whitepapers/architecting-for-the-aws-cloud-best-practices/)

# より具体的な。でも、私たちにとって大切な。

## ストリーム処理
 - [ストリーム処理とは何か？＋2016年の出来事](http://qiita.com/kimutansk/items/60e48ec15e954fa95e1c)

## 大規模データ
 - [大規模データに対するデータサイエンスの進め方](https://www.slideshare.net/Cloudera_jp/data-science-toward-big-data-cwt2016)

## DWH原典
 - [W.H.Inmon「Building the Data Warehouse」](http://fit.hcmute.edu.vn/Resources/Docs/SubDomain/fit/ThayTuan/DataWH/Bulding%20the%20Data%20Warehouse%204%20Edition.pdf)

## DWH解説
 - [データウェアハウス入門 (マーケティングデータ分析基盤技術勉強会)](https://www.slideshare.net/takemikami/ss-66770647)
 - [Oracle® Database 2日でデータ・ウェアハウス・ガイド](https://docs.oracle.com/cd/E16338_01/server.112/b56298/tdpdw_intro.htm)
property initializer syntaxを使うとbindが不要

## bind問題
ReactのコンポーネントをES6のクラス構文で書く場合、コンストラクタ内でメソッドをbindする処理を逐一書く必要があります。

```
class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);
```
メソッドの数が増えるにつれて、この記述は面倒です。

## property initializer syntaxを使う

[ReactのチュートリアルのHandling Events](https://facebook.github.io/react/docs/handling-events.html)には、property initializer syntaxを使うと、bindが不要になるという説明がありました。

このように、メソッドをアロー関数で書くと、babelのコンパイル時に内部で、bindしてくれるようです。

```
class LoggingButton extends React.Component {
  // This syntax ensures `this` is bound within handleClick.
  // Warning: this is *experimental* syntax.
  handleClick = () => {
    console.log('this is:', this);
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        Click me
      </button>
    );
  }
}
```

property initializer syntaxを使い方は、[こちら](https://babeljs.io/docs/plugins/transform-class-properties/)を参照してください。

## Create React Appなら、設定不要

[Create React App](https://github.com/facebookincubator/create-react-app) で作られたReactプロジェクトは、デフォルトでproperty initializer syntaxが有効になっているようです。
[C#] ジェネリックメソッド内でforeachを使いたい

デバッグ用にいろんなリストをデバッグ出力できる一時関数を定義したかったのでやりかたメモ

# TL;DR

そのままだと、 `GetEnumerator` が定義されていないとエラーになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/37721/4728a0e2-9d54-fd6b-1372-8cf4ee222b8f.png)

対処として、`where Type : IList` で型引数に対する制約条件をつけてやると良いようです。
=> [追記] コメントにて `IEnumerable<T>` を使用したほうが汎用性が高いとのご指摘を頂きました。たしかにそうですね・・・。

# サンプルコード

```csharp:サンプルコード
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace hwapp
{
    class Hoge {
        public int i;
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Array
            int[] intArray = Enumerable.Range(0, 10).ToArray();
            PPrint(intArray);

            // List<int>
            List<int> intList = Enumerable.Range(0, 10).ToList();
            PPrint(intList);

            // List<T>
            List<Hoge> hogeList = Enumerable.Range(0, 10).Select(i => new Hoge { i = i * 10 }).ToList();
            PPrint(hogeList);
        }

        static void PPrint<Type> (Type T)
            where Type : IList
        {
            foreach (var obj in T)
            {
                if (obj is Hoge hoge) {
                    Console.WriteLine($"[{T.GetType()}] {hoge.i}");
                }
                else {
                    Console.WriteLine($"[{T.GetType()}] {obj}");
                }
            }
        }
    }
}
```

```text:実行結果
[System.Int32[]] 0
[System.Int32[]] 1
[System.Int32[]] 2
[System.Int32[]] 3
[System.Int32[]] 4
[System.Int32[]] 5
[System.Int32[]] 6
[System.Int32[]] 7
[System.Int32[]] 8
[System.Int32[]] 9
[System.Collections.Generic.List`1[System.Int32]] 0
[System.Collections.Generic.List`1[System.Int32]] 1
[System.Collections.Generic.List`1[System.Int32]] 2
[System.Collections.Generic.List`1[System.Int32]] 3
[System.Collections.Generic.List`1[System.Int32]] 4
[System.Collections.Generic.List`1[System.Int32]] 5
[System.Collections.Generic.List`1[System.Int32]] 6
[System.Collections.Generic.List`1[System.Int32]] 7
[System.Collections.Generic.List`1[System.Int32]] 8
[System.Collections.Generic.List`1[System.Int32]] 9
[System.Collections.Generic.List`1[hwapp.Hoge]] 0
[System.Collections.Generic.List`1[hwapp.Hoge]] 10
[System.Collections.Generic.List`1[hwapp.Hoge]] 20
[System.Collections.Generic.List`1[hwapp.Hoge]] 30
[System.Collections.Generic.List`1[hwapp.Hoge]] 40
[System.Collections.Generic.List`1[hwapp.Hoge]] 50
[System.Collections.Generic.List`1[hwapp.Hoge]] 60
[System.Collections.Generic.List`1[hwapp.Hoge]] 70
[System.Collections.Generic.List`1[hwapp.Hoge]] 80
[System.Collections.Generic.List`1[hwapp.Hoge]] 90
```

# 参考
[ジェネリック - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](http://ufcpp.net/study/csharp/sp2_generics.html#where)
[LINQのそのForEach、実はSelectで書き換えられるかも - Qiita](http://qiita.com/t_takahari/items/6dc72f48b1ebdfed93b7)
[Type.GetType メソッド (String) (System)](https://msdn.microsoft.com/ja-jp/library/w3f99sx1(v=vs.110).aspx)
kintone データ集計（PivotTable.js）

[kintone データビューア](http://qiita.com/rex0220/items/c3397d76c94b0d849d88) である程度の集計が出来ましたが、今度は PivotTable.js で集計とグラフ化を試してみました。

対象アプリの選択などは、kintone データビューアそのままで、表示部分をPivotTable.jsを使います。

# PivotTable.js
ピボットテーブルを作成できるライブラリです。

- [PivotTable.js Examples](http://nicolas.kruchten.com/pivottable/examples/index.html)
- [PivotTable.js documentation](https://github.com/nicolaskruchten/pivottable/wiki)

# 表示の種類

- テーブル表示

![2017-03-20_17h21_25.png](https://qiita-image-store.s3.amazonaws.com/0/100572/263e45e1-28f3-d2f5-5023-16289bd32736.png)

- グラフ表示

![2017-03-20_17h22_41.png](https://qiita-image-store.s3.amazonaws.com/0/100572/5afe2817-30b0-b939-4e6d-73470869a388.png)


# 操作例

新規レコード追加で、在庫アプリのグラフを作成します。

![2017-03-20_17h32_29.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/736f127a-08d4-2de3-9b1d-eaaf1a88f5f1.gif)


# 課題

- PivotTable.js の日本語化

集計方法やグラフの種類などの選択肢は、英単語になっています。
残念ながら、標準では日本語オプションが無いので、対応が必要です。
ただ、英語以外のオプション指定はありますので、それを参考に作れそうです。
スライスが便利なのでどんなことができるのか調べてみた


文系プログラマのレムです。
最近個人的なお勉強として言語処理100本ノックやったりしているのですがスライスがめっちゃ便利で感動しています。

普段使ってるJavaではこういう文字列の操作をしないので（勉強不足で知らないだけかも、、、知ってる方教えてください）ちょっとまとめて見ました。


#そもそスライスとは？
>スライス表記はシーケンスオブジェクト (文字列、タプルまたはリスト) におけるある範囲の要素を選択します。スライス表記は式として用いたり、代入や del 文の対象として用いたりできます。
引用：http://docs.python.jp/2.7/reference/expressions.html?highlight=%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9


なるほど。
プライマリの評価値結果がシーケンス型のオブジェクトでないとダメ皆たいです。

もうちょいわかりやすいやつないかな。。。


#なにはともあれ使ってみる
スライスは開始位置、終了位置、ステップ幅を指定することで文字列の任意の箇所を指定できます。

>sequence[開始位置:終了位置:ステップ幅]


またこれらは省略が可能みたいです。
簡単な例で試してみます！



```Python:Sample.py
str = u"今日は晴天ですね！"
print (str[::2])
```
結果：今は天す！

今回はステップ幅を2で指定しているのでこのようになりました。
ステップ幅2の時は要素0番目、要素2番目...というように2つおきによ嘘を取り出します。
ちなみに開始位置は0なので初心者は気をつけないと欲しい要素を取り出せません。


今度は開始位置や終了位置を指定したものです。

```Python:Sample.py
str = u"今日は晴天ですね！"
print (str[1:3:])
```
 結果：日は晴
 
 このように開始から終了までの文字列を指定してくれます。
 

ちなみに終了位置や開始位置、ステップ幅を文字列に存在しないものに指定するとなにも取り出しません



スライスって奥深いですね。
ただ可読性を下げるかもしれないのであんまマイナス値とかで指定するのは良くないかも
HaskellをIntelliJで使えるようになりました！

intellij-haskellというプラグインを使って、効率よく開発ができるようになりました!!

# 環境
Ubuntu 16.04LTS
mac OS Sierra

# 手順
1. stackをインストール
2. IntelliJをダウンロード
3. プラグイン「IntelliJ-Haskell」をインストール
4. Create New Projectをクリックし、Haskell moduleを選択。さらに、Configureをクリックし、stackのパスを入力する。

## 1. stackをインストール

```shell
wget -qO- https://get.haskellstack.org/ | sh
```
を実行すれば、stackが自動でインストールされると思います。（詳しくは、[stackの公式サイト](https://docs.haskellstack.org)をご覧ください。)
stackの概要については、[こちらの記事](http://qiita.com/tanakh/items/6866d0f570d0547df026)をご覧になると詳しく知ることができると思います。

## 2. IntelliJをダウンロード
https://www.jetbrains.com/idea/
からダウンロードできます。（公式サイト）

## 3. プラグイン「IntelliJ-Haskell」をインストール
1. File -> Project を選択
2. Pluginを選択し、Brows repositories... を選択
3. IntelliJ-Haskellをインストール

インストールできたら、IntelliJを再起動する。

## 4. Create New Projectをクリックし、Haskell moduleを選択。さらに、Configureをクリックし、stackのパスを入力する。

僕のubuntuの環境では、`/home/[ユーザ名]/.local/bin/stack` としました。

macの環境では、`/usr/local/bin/stack` でいけました。

<img width="956" alt="スクリーンショット 2017-03-19 9.55.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/136124/60dd06a2-8d1d-1353-248b-ecc8cbb17061.png">

# エラーが出た時
私のmac環境で以下のエラーが出ました。
> Something went wrong while calling hlint. Error: No compiler found, expected minor version match with ghc-8.0.2 (x86_64) (based on resolver setting in /Users/v97ug/dev/haskell/free-game/TestHaskell3/stack.yaml). To install the correct GHC into /Users/v97ug/.stack/programs/x86_64-osx/, try running "stack setup" or use the "--install-ghc" flag. To use your system GHC installation, run "stack config set system-ghc --global true", or use the "--system-ghc" flag.

どうやらGHCが入っていなかったようで、

```shell
stack setup --install-ghc
```

を実行すると、無事プラグインが動作しました。

# 既存のstackのプロジェクトを読み込む場合の注意
Openで開くのではなく、**Import Project**で開くと上手く読み込んでくれます。

![IntelliJの最初の画面.png](https://qiita-image-store.s3.amazonaws.com/0/136124/8dec0e30-3920-0e50-aed8-a4487d1c05c4.png)

# 他に僕が気づいたこと
- ~~IntelliJ内で、実行ができない模様(できる方がいましたら教えてください！)~~ 追記：実行できました！！次の記事がとても参考になります。 [IntelliJでHaskellを実行する（haskell stackプロジェクト）](http://qiita.com/nwtgck/items/d64647c05a0ba52db63c)
- ~~New Projectでプロジェクトを作成して、コマンドラインでstack execしようとすると、パスがないなどのエラーが発生する。(最初に、コマンドラインでstack newしてから、Import ProjectでIntelliJに取り込んだほうがいいと思われる)~~ 追記：`stack exec プロジェクト名`で実行できます。このとき、`プロジェクト名-exe`とはせずに、`プロジェクト名`とすればできます。
- asパターンでかいた変数を、なぜかリファクタリングできない。

# IntelliJを使う利点
- リファクタリングができる！（関数名などを一括で変更できる）
- type signatureを自動で出してくれる。(type signatureを書いていない時に、alt+Enterを押す)
- 静的解析してくれる。
- moduleを作る時、先頭が小文字のmodule名だと、エラーが出るようになる。

# あとがき
以前はatomでHaskellの開発をしていましたが、IntelliJを使えばリファクタリングができるので、こっちに乗り換えました。とても便利です。

# 参考
[Haskellで、リファクタリングする方法](https://github.com/v97ug/question/issues/5)
[stack](https://docs.haskellstack.org)
[IntelliJ-Haskell](https://github.com/rikvdkleij/intellij-haskell)
[IntelliJでHaskellを実行する（haskell stackプロジェクト)](http://qiita.com/nwtgck/items/d64647c05a0ba52db63c)
ReactNativeが、"Sample" という名前のプロジェクトを正しく動かせない話

# 初めに

ReactNativeを触ってみて、チュートリアル通りにやっているはずなのに起動したら

<img width="375" alt="Simulator Screen Shot 2017.03.20 17.07.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/73290/118feffe-ffe0-f1b5-23d2-70d65865e878.png">

こんな画面が出てきてしばらくハマった。

# 手順

```
$ react-native init Sample
$ cd Sample
$ react-native run-ios
```

でビルドが始まり、しばらく待つとiOSのシミュレータが起動する。

動いた〜、とか思って喜ぶと ↑ の赤い画面が出てくる。

# 原因

アプリ内部からlocalhostで動いているPackergerServerと通信を試みているのだが、
そのPackegerServerを起動する部分で名前の衝突が起きている様子。


↓ こんなエラーログが吐かれている。

```

This error is caused by a @providesModule declaration with the same name across two different files.
Error: @providesModule naming collision:
  Duplicate module name: Sample
  Paths: /Users/hira/Documents/git/react-native-sample/Sample/package.json collides with /Users/hira/Documents/git/react-native-sample/Sample/node_modules/react-native/Libraries/Sample/package.json

This error is caused by a @providesModule declaration with the same name across two different files.
    at HasteMap._updateHasteMap (/Users/hira/Documents/git/react-native-sample/Sample/node_modules/react-native/packager/src/node-haste/DependencyGraph/HasteMap.js:158:13)
    at p.getName.then.name (/Users/hira/Documents/git/react-native-sample/Sample/node_modules/react-native/packager/src/node-haste/DependencyGraph/HasteMap.js:133:31)
~
Process terminated. Press <enter> to close the window

```

# 対策

プロジェクト名を `Sample` 以外 (`SampleApp`とか) にする。

```
$ react-native init SampleApp
$ cd SampleApp
$ react-native run-ios
```

↓ `SampleApp` に変えたら無事起動した。

<img width="375" alt="Simulator Screen Shot 2017.03.20 17.12.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/73290/b5666757-eb9c-008f-17a2-62b9d8d44409.png">

# 終わりに

最初からエラーログをちゃんと読めばよかった。
エラーログは細かいところまで読もう。
文系エンジニアが言語処理100本ノックやってみた　in Python 01

とりあえず小出しにしていこうということで今回は01の回答をのせようと思います。

普段JavaなのでPythonはなんか新鮮で楽しい。


>01「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．

今回の問題はこいつです。
今回もスライスのお世話になります。



```Python:01.py
str = u"パタトクカシーー"
print (str[::2])
```

こんな感じのコードを書いています。
とりあえず短いしこれでいいかと思うのだけどもうちょい工夫できる気もする。


ご指摘をいただいたので編集

pythonではstrという関数があってstr(123)とすると　’123’に変換する関数があるそうです。
つまりこの書き方でもっと本番に近い環境で使う時、str()を使いたいのに使えない状況になってしまうとのことでした。

なので

```Python:01.py
s = u"パタトクカシーー"
print (s[::2])
```

こんな風にした方がいいですね。
変数とかクラスの名前の付け方が結構適当だったり、Javaのくせが抜けないので治します。。。。

#参考
言語処理100本ノック: [言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec01 "言語処理100本ノック2015")
言語処理100本ノック in Python:[Qiita](http://qiita.com/piyo56/items/eb72b496669f541055c3)
Visual Studio 2017でLinux C++開発（CentOS7仮想環境）

Visual Studio 2017でLinux C++のクロスプラットフォーム開発ができるようになったということで試してみます。

基本的にはこちらの内容と一緒です。
http://qiita.com/tadnakam/items/4660d8fa5b1b72f9eb70

#環境
Windows 7 Professional SP1 64bit
Visual Studio 2017 Community
VirtualBox v5.1.8
Vagrant v1.8.6

ゲストOS
CentOS7.2 (bento/centos-7.2)

※VagrantでゲストOS(CentOS)はセットアップ済みとします。

#Visual StudioでLinux C++開発できるようにする
Visual Studio 2017のインストーラーからC++によるLinux開発をインストールします。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/e4ce669e-c07c-fa77-b95a-0700da83b363.png)

#ゲストOS(CentOS)にgdbserverをインストール
Visual StudioからデバッグができるようにゲストOS(CentOS)にgdbserverをインストールします。

```bash:
$ sudo yum -y install gdb
$ sudo yum -y install gdb-gdbserver
```

#Linux C++プロジェクト作成
新しいプロジェクトから「Visual C++」、「クロスプラットフォーム」、「Linux」を選択します。
今回はコンソールアプリケーション(Linux)プロジェクトを作成しました。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/49abb1eb-ec2f-5e42-b08a-58fe2e018441.png)

#ビルド
自動でコンソールにメッセージを表示するプログラムが作成されるので、そのままビルドします。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/12961ed7-4f05-03ec-62ff-5b12ea561071.png)

接続先のLinuxを指定するダイアログが表示されるので次のように入力します。

Host Name: localhost
Port: 2222
User Name: vagrant
Authentication type: Private Key
Private key file:<仮想環境のVagrantフォルダ>\.vagrant\machines\default\virtualbox\private_key

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/2d463d9d-9674-25a7-5cf1-ea2f8a431418.png)

次回からは入力しなくてもこの設定で自動的に接続されます。

#実行
実行する前にツールバーのデバッグからLinux Console Windowを表示します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/2476149c-b6a9-4b8a-d382-27ebb6dd968b.png)

ツールバーからリモートGDBデバッガーを実行すると実行結果がLinux Console Windowに表示されます。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/ad58874f-f943-1e02-3bd2-180df4f3ac81.png)

これでブレークポイントを設定してデバッグできるようになります。

#Linuxディレクトリ構成
Linuxにはユーザーフォルダ下にprojectsディレクトリが作成されそこに配置されるようです。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/aea20e6b-24f6-5a55-a81d-a7d8c4b2eca4.png)

#接続先Linux設定
接続先となるLinuxはオプションのCross PlatformからConnection Managerで管理されているようです。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/d0738371-0f9c-d94b-d267-2049014dbe35.png)

#感想
とりあえず開発できる環境は構築できましたが、ライブラリの組み込みや大規模な開発での利用など実際に使うのはまだ難しいと感じます。
そういったノウハウが蓄積されてVisual Studioで簡単にLinux C++の開発ができるといいですね。
Visual Studioはほんと便利なので。
PhpStormでLaravelをリモートデバッグ

[こちらの記事を参考にしました](http://qiita.com/k-okada/items/2b8d6db9b96abcb94696)

# ローカルにxdebugをインストールする
php -v で確認

```
$ php -v
PHP 7.1.2 (cli) (built: Feb 17 2017 10:51:21) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
```
入ってない。
homebrewでインストール。
php7.1なので php71-xdebug

```
brew install php71-xdebug
```

確認

```
$ php -v
PHP 7.1.2 (cli) (built: Feb 17 2017 10:51:21) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Xdebug v2.5.1, Copyright (c) 2002-2017, by Derick Rethans
```

OK。

# リモート(vagrant)のxdebugの設定をする

今回はHomesteadを使ってるので、デフォルトでxdebugはある程度設定されている。

```
$ vagrant ssh
$ sudo vim /etc/php/7.1/mods-available/xdebug.ini

zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
xdebug.max_nesting_level = 512
xdebug.idekey = "vagrant" ←これを追記。
```

# PhpStormの設定
[ここ参考](https://www.sitepoint.com/install-xdebug-phpstorm-vagrant/)
動画だとPHPのServerのポートを8000に変更してるけど、私は8000をポートフォワードしてなかったので、vagrantのnginxの80ポートを指定しました。
<img width="559" alt="スクリーンショット 2017-03-20 16.47.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/167554/984af6eb-4385-0ff5-c94d-ca49365e5f28.png">


# 試してみる
適当にブレークポイントおいて、Run>Debug>設定したサーバー。

<img width="734" alt="スクリーンショット 2017-03-20 16.53.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/167554/771f0a3c-fb1e-60ef-006e-d8536b7771d1.png">

できた。
GAEは無料で複数プロジェクト作れるけどクォータ逃れに使っちゃダメよって話

[GCPの利用規約](https://cloud.google.com/terms/)を眺めていたら次のような文章を見つけました。

> 3.3 Restrictions. Customer will not, and will not allow third parties under its control to: （中略） (d) create multiple Applications, Accounts, or Projects to simulate or act as a single Application, Account, or Project (respectively) or otherwise access the Services in a manner intended to avoid incurring Fees
>
> （拙訳）顧客は次のことをしてはいけません、もしくは第三者に次のことをさせてもいけません。（中略） (d)複数のアプリケーションやアカウントやプロジェクトを作ってそれを1つのアプリケーションやアカウントやプロジェクトであるかのように使うこと、それ以外の方法であっても料金の支払いを免れようとすること。

本当は1つのサービスなんだけど無理矢理2つの別サービスが連携しているかのような見せ方にして、無料枠を2倍使えるような作りにするのはダメよ、ということになると思います。

GAEの無料枠はプロジェクトごとに設定されるので、これ合計の無料枠を考えたら使い放題に近いのでは？と思っていたんですが、さすがに無制限に使えるわけではありませんでした。

まあ、サービス提供側からすれば当然の内容ですよね。実はAWSにも同様の規約があったりします。
ActiveSupport 5系で、前まであった capture メソッドを使う方法

```ruby
require "tempfile"
require "active_support/testing/stream"

include ActiveSupport::Testing::Stream

capture(:stdout) { "x".display }   # => "x"
```

前までは Kernel モジュールに入っていたので、気軽に使える反面、Capistrano の capture メソッドと衝突したりと問題がありました。そのためか、別のモジュールになっていました。使うときだけ部分的に include すればよいようです。ただ Tempfile を使っているのに require してくれてないので require "tempfile" も必要です。
PostgreSQLのJSONのIndexの張り方

PostgreSQLのJSON、jsonb型についてみていきます。
まずはテーブルつくりましょう。
<pre>
test=# create table test ( val jsonb );
</pre>

そしてデータを１０万件ほどぶち込みました。
インポート用のデータファイル形式は1行ごとにjson書いたmongodbでmson形式って呼ばれてるやつです。

インポートデータ
<pre>
{"val": 0, "j": {"val": 0,"k": {"val": 0}}}
{"val": 0, "j": {"val": 0,"k": {"val": 1}}}
・
・
・
{"val": 99, "j": {"val": 99,"k": {"val": 99}}}
</pre>

インポート
<pre>
test=# copy test ( val ) from '/home/ubuntu/workspace/user/mson.txt';
</pre>

10秒弱で終わりました。早いですね。あ、cloud9上です。

さて検索してみます。jのvalが10のものを探してみましょう。 @>演算子でJSONにそれを含むものを検索できます。今回は'{ "j": { "val": 10 }}'::jsonbを含むレコードを検索しています。

<pre>
test=# select * from test where val @> '{ "j": { "val": 10 }}'::jsonb;
   id   |                       val                       
--------+-------------------------------------------------
   1001 | {"j": {"k": {"val": 0}, "val": 10}, "val": 0}
   1002 | {"j": {"k": {"val": 1}, "val": 10}, "val": 0}
   1003 | {"j": {"k": {"val": 2}, "val": 10}, "val": 0}
   1004 | {"j": {"k": {"val": 3}, "val": 10}, "val": 0}
   1005 | {"j": {"k": {"val": 4}, "val": 10}, "val": 0}
   1006 | {"j": {"k": {"val": 5}, "val": 10}, "val": 0}
   1007 | {"j": {"k": {"val": 6}, "val": 10}, "val": 0}
   1008 | {"j": {"k": {"val": 7}, "val": 10}, "val": 0}
   1009 | {"j": {"k": {"val": 8}, "val": 10}, "val": 0}
   1010 | {"j": {"k": {"val": 9}, "val": 10}, "val": 0}
   1011 | {"j": {"k": {"val": 10}, "val": 10}, "val": 0}
   1012 | {"j": {"k": {"val": 11}, "val": 10}, "val": 0}
   1013 | {"j": {"k": {"val": 12}, "val": 10}, "val": 0}
   1014 | {"j": {"k": {"val": 13}, "val": 10}, "val": 0}
   1015 | {"j": {"k": {"val": 14}, "val": 10}, "val": 0}
・
・
・
test=# 
</pre>

インデックスなくても結構はやかったです。体感１秒くらい。
explainは以下。当然フルスキャンですね。
<pre>
test=# explain select * from test where val @> '{ "j": { "val": 10 }}'::jsonb;
                         QUERY PLAN                         
------------------------------------------------------------
 Seq Scan on test  (cost=0.00..27885.00 rows=1000 width=92)
   Filter: (val @> '{"j": {"val": 10}}'::jsonb)
(2 rows)
</pre>

ではインデックスをつけてみます。個々のJSON要素ではなくvalカラムに直接指定するだけで全体に張られるようです。
<pre>
test=# CREATE INDEX idxgin ON test USING gin (val);
CREATE INDEX
test=# 
</pre>

張るのに3秒くらいかかりましたね。
ではexplainを見てみましょう。
<pre>
test=# explain select * from test where val @> '{ "j": { "val": 10 }}'::jsonb;
                                QUERY PLAN                                
--------------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=151.75..3310.69 rows=1000 width=92)
   Recheck Cond: (val @> '{"j": {"val": 10}}'::jsonb)
   ->  Bitmap Index Scan on idxgin  (cost=0.00..151.50 rows=1000 width=0)
         Index Cond: (val @> '{"j": {"val": 10}}'::jsonb)
(4 rows)
</pre>
indexが使われてますね。実際実行するとほぼ待ちなしでした。

今回テストにつかったJSONはかなり小さいので、大きくなるとどうでしょうね？今回はこのへんで。
ApacheでIP制限した環境でletsencryptする

# ApacheでIP制限した環境でletsencryptする

## 前提

こんな風に、特定のIPからの接続のみ許可している場合

```apache
<Directory "/var/www/html">
    <RequireAny>
        Require all denied
        Require ip **.**.**.**
    </RequireAny>
</Directory>
```

## Apacheの設定変更

ACMEチャレンジに使われるディレクトリだけ開けておく

```apache
<Directory "/var/www/html/.well-known/acme-challenge">
    <RequireAll>
        Require all granted
    </RequireAll>
</Directory>
```

## 証明書取得


certbotを使う

certbot
https://certbot.eff.org/

```bash
./certbot-auto certonly --webroot  -w /var/www/html -d example.com
```


---

## おまけ

Webサーバーへ一切の接続を許可できない場合、txtレコードを使った認証方法がある
https://www.xmisao.com/2016/04/18/get-free-certification-by-letsencrypt-dns-01-authentication.html

certbotでも対応している
http://letsencrypt.readthedocs.io/en/latest/using.html#manual

```bash
/certbot-auto certonly --preferred-challenges dns-01 --authenticator manual --domain example.com

```

あとは指示されたtxtレコードを追加するだけ
Karabiner-Elements-0.90.92のコンフリクト？

- MacOS Sierra 10.12.3 でPCキーボードを使うためにKarabiner-Elementsを使用している。
- ここ数日（もしかしたら今日？ 2017-03-20）、キーバインドの一部が機能しなくなった。一部の設定は生きている。
- Karabiner-ElementsをQuitすると、システム環境設定で設定した修飾キーの設定は有効になる。
- Karabiner-Elementsの設定を〔Preferences〕→〔Misc〕内の〔Copy the current configuration to the system default configuration〕でシステム設定に書き込んで再起動すると、再起動後、Karabiner-Elementsの設定が使えるようになる。ただし、Karabiner-Elementsを起動すると使えなくなる。
- 現状、〔Copy the current configuration to the system default configuration〕でシステム設定に書き込んで、Karabiner-Elementsは起動しない、という対応で解決できている。