OmniAICreator/Qiita-1.07M huggingface dataset:
Swift3でPython3を呼び出してみた！

#はじめに
Swiftのバージョンが3になってからのPythonの呼び出しについての記事がなかったので自分で参考ページを調べてとりあえずやれるところまでやってみました。
[参考ページ](https://github.com/ndevenish/Site-ndevenish/blob/master/_posts/2016-06-20-using-python-with-swift.markdown)　※１年ほど前の記事なので注意！

#Xcode(Swift側)での操作
1.Creat a Xcode projectでmacOSのApplicationのCocoaApplicationを選択して
、プロジェクトを作成しましょう。

2.そして次に生成されたプロジェクトフォルダ内にあるAppDelegate.swiftの記述されている"NSApplicationMain"を消しましょう。
<img width="493" alt="スクリーンショット 2017-07-06 17.02.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/924a7500-f4f6-bc02-9461-bec1de099292.png">

3.プロジェクト内に"main.swift"という名前でファイルを作成しましょう。
※ちなみにファイル名を"Main.swift"という名前にしたらエラーを吐かれました。
そして以下のコードを記述しましょう。
（[参考ページ](https://github.com/ndevenish/Site-ndevenish/blob/master/_posts/2016-06-20-using-python-with-swift.markdown)のコードを書くとエラーを吐くので対応）

```swift
import Cocoa

let path = Bundle.main.path(forResource: "Bridge", ofType: "plugin")
guard let pluginbundle = Bundle(path: path!) else {
    fatalError("Could not load python plugin bundle")
}
pluginbundle.load()

NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)

```
#Python3側の操作
1.ターミナルで以下のコマンドを実行

```
$ pip3 install pyobjc py2app
```

2.Xcodeのファイルパスが色々と面倒なので作成したXcode project内にPythonファイル及びフォルダを作成しましょう。

3.フォルダの構成とpythonファイルは以下のとおり
構成：setuptools/py2app
py2appフォルダ内に"Bridge.py"と"setup.py"を作成

```py3:Bridge.py
"""Bridge.py. The main Python-(Swift) plugin bundle entry module"""
import logging

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

logger.info("Loaded python bundle")
```
```py3:setup.py
"""Setuptools setup for creating a .plugin bundle"""
from setuptools import setup


APP = ['Bridge.py']
OPTIONS = {
  # Any local packages to include in the bundle should go here.
  # See the py2app documentation for more
  "includes": [],
}

setup(
    plugin=APP,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
    install_requires=['pyobjc'],
)
```

4.その後ターミナルで以下のコマンドを実行

```
python3 setup.py py2app -A
```
[参考ページ](https://github.com/ndevenish/Site-ndevenish/blob/master/_posts/2016-06-20-using-python-with-swift.markdown)では

```
python setup.py py2app -A
```
となっていましたがエラーを吐きました。なのでpython3で実行コマンドを行ってください。

実行が成功するとターミナルの実行結果の最後に"Done!"と表示されます。

そうするとsetuptools/py2app/のフォルダ内に"build"と"dist"というフォルダが生成されています。そして以後記述しますが"dist"のフォルダ内に"Bridge.plugin"が生成されています。
<img width="408" alt="スクリーンショット 2017-07-06 17.35.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/5e415367-58a9-7f0f-0ce0-2f855c2b54a2.png">

5.生成された"dist"フォルダ内にある"Bridge.plugin"をXcodeのプロジェクト内に統合しましょう。 XcodeのプロジェクトでAdd Files to ~~~を選択して、"Bridge.plugin"を追加するだけ。

#実行
Xcode projectを実行してみましょう。
こんな感じにならOK!
<img width="397" alt="スクリーンショット 2017-07-06 17.48.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/de0622d6-acae-2fe1-147b-605d1c5b1491.png">
ちなみにBridge.pyのlogger.infoがコンソールに出力されているはずです。

#とりあえず今回はここまで！
[参考ページ](https://github.com/ndevenish/Site-ndevenish/blob/master/_posts/2016-06-20-using-python-with-swift.markdown)はまだ項目があるので引き続き行っていきます。
【Unity】ShaderLabのプロパティ属性まとめ

# はじめに
ShaderLabのプロパティ属性をよく忘れてしまうので、備忘録もかねて属性を軽くまとめてみました。

# 空白を入れる
**[Space]**を使うことでフィールドの間に空間を挟むことができます。

```shader:Spaceサンプル
Properties
{
	_MainTex ("Texture", 2D) = "white" {}
	[Space]
	_A("A", Float) = 1.0
	_B("B", Float) = 1.0
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/39a893a2-a4fe-74e6-5256-698263804648.png)


<br>
Spaceに数値を指定すると空間の幅を変えることができます。

```shader:Spaceに数値を指定するサンプル
Properties
{
    _MainTex ("Texture", 2D) = "white" {}
    [Space(100)]
    _A("A", Float) = 1.0
    _B("B", Float) = 1.0
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/9a04ed85-d930-15a4-4096-1c2822c84d43.png)



# TilingとOffsetを非表示にする
以下のようなプロパティを記述すると、インスペクターにテクスチャの設定フィールドが表示されます。

```shader:サンプル
_MainTex ("Texture", 2D) = "white" {}
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/89e659be-7001-0152-7886-65e221cae321.png)


<br>

これに **[NoScaleOffset]**をつけると **TilingとOffsetが非表示になります**。

```shader:NoScaleOffsetサンプル
[NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/eb6a1df8-3652-6f4c-ebb2-75ce1bf80869.png)

# チェックボックスでパラメータを設定する
以下のようなプロパティを書いた場合、数値入力フィールドが表示されます。

```shader:サンプル
_IsHoge ("Is Hoge", Float) = 0
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/4622f90d-ad0e-6d87-da0c-b7053b297a76.png)


**[MaterialToggle]**をつけるとパラメータをチェックボックスで設定できるようになります。

```shader:MaterialToggleサンプル
[MaterialToggle] _IsHoge ("Is Hoge", Float) = 0 
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/d9b342cd-6079-f3ee-5fc1-00861317e139.png)



チェックが入っているときは**1**が、入っていないときは**0**が設定されます。


参考: https://forum.unity3d.com/threads/shader-properties-no-bool-support.157580/

# チェックボックスでシェーダーコードを切り替える
以下のようなコードをプロパティに記述するとインスペクター上からマクロが設定できるようになります。

```shader:マクロ設定サンプル
[Toggle(FILL_WITH_RED)]
_Hoge("Fill With Red", Float) = 0
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/7e1f7257-da66-2035-9a56-e59eb8309a80.png)


これを利用することで以下のようなシェーダーコードの切り替えが可能になります。

```shader:シェーダーコードを切り替えるサンプル
#ifdef FILL_WITH_RED
    チェックボックスがONならこちらが実行される
#else
    チェックボックスがOFFならこちらが実行される
#endif
```

```#pragma shader_feature FILL_WITH_RED``` と書いておく必要があります。

参考: https://gist.github.com/keijiro/22cba09c369e27734011

# プロパティをインスペクター上で非表示
[HideInInspector] をつけるとプロパティが表示されなくなります。

```shader:HideInInspectorサンプル
[HideInInspector] _MainTex ("Texture", 2D) = "white" {}
```

参考: https://unity3d.com/jp/unity/whats-new/unity-4.1
PHPでアクセス元のIPが一定レンジ内のIPに合致するかチェックするメソッド

アクセス元のIPをチェックし、合致する場合はtrueを返してくれるだけの単純なメソッドを書いた。

```php:usage
$ipAddress = array('10.1.192.0/24', '10.1.4.0/23', '172.20.244.0/24');//例１ どれかに合致してるのかチェック
$ipAddress = '10.1.192.0/24';//例２ 一つの場合はstringでもいいのよ

if (permissionIp::judgeIpAddress($ipAddress)) {
    //合致
}
```

```php:permissionIp.php
class permissionIp
{
    /**
     * アクセス者が引数で与えられたIPアドレスに合致しているかを調査
     * @param array or string $ipAddress
     * @return boolean
    */
    static public function judgeIpAddress($ipAddress)
    {
        if (! is_array($ipAddress)) {
            $ipAddress = array($ipAddress);
        }

        $sepRemoteIp = explode('.', $_SERVER['REMOTE_ADDR']);

        foreach ($ipAddress as $judgeIp) {
            $tmp = explode('/', $judgeIp);
            $sepIp = explode('.', $tmp[0]);
            if (isset($tmp[1])) {
                $subnet = (int)$tmp[1];
            } else {
                $subnet = 32;
            }
            if (count($sepIp) != 4 || count($sepRemoteIp) != 4) {
                return false;
            }

            if ($subnet >= 24 && $subnet <= 32) {
                $add = pow(2, (32 - $subnet));

                if ($sepRemoteIp[0] == $sepIp[0] &&
                $sepRemoteIp[1] == $sepIp[1] &&
                $sepRemoteIp[2] == $sepIp[2] &&
                $sepRemoteIp[3] >= $sepIp[3] && $sepRemoteIp[3] < ($sepIp[3] + $add)) {
                    return true;
                }
            } elseif ($subnet >= 16 && $subnet <= 23) {
                $add = pow(2, (24 - $subnet));

                if ($sepRemoteIp[0] == $sepIp[0] &&
                $sepRemoteIp[1] == $sepIp[1] &&
                $sepRemoteIp[2] >= $sepIp[2] && $sepRemoteIp[2] < ($sepIp[2] + $add) &&
                $sepRemoteIp[3] >= 0 && $sepRemoteIp[3] < 256) {
                    return true;
                }
            } elseif ($subnet >= 8 && $subnet <= 15) {
                $add = pow(2, (16 - $subnet));

                if ($sepRemoteIp[0] == $sepIp[0] &&
                $sepRemoteIp[1] >= $sepIp[1] && $sepRemoteIp[1] < ($sepIp[1] + $add) &&
                $sepRemoteIp[2] >= 0 && $sepRemoteIp[2] < 256 &&
                $sepRemoteIp[3] >= 0 && $sepRemoteIp[3] < 256) {
                    return true;
                }
            }
        }
        return false;
    }
}
```
Rails5.1とwebpackerでデプロイしたときにassetsのパスが一致しない問題を解決した

## 対象者
・Rails5.1
・webpacker v2
・サーバが複数台構成でサーバごとにアセットのプリコンパイルする

## これがなんで問題か
複数台のサーバで、ダイジェストが付いたアセットを吐き出すのだけど、ダイジェストが一致しない！

これは、複数台構成では困る。
ロードバランサーが、振り分けた方にそのダイジェストが付いたアセットがなければ、404を返してしまう！

## 解決手順
### 1.アセット(例えばCSS)の中身が全く同じかを確認する
アセットの中身が違えば、ダイジェストが変わってしまうのは当然なので、とりあえず一緒になるように頑張る！

私の環境では、CSSが404になっていたので、CSSの差分を見てみました。
本番のCSS２つにアクセスして、適当なツール(Chromeの開発者ツールのpritty print)でミニファイされたCSSを整形して、diffを取ると **ソースマップのリンクが差分となっていました!**

そもそも、本番環境でソースマップを入れる必要はないので、`config/webpack/production.js` から、

```js
// Note: You must restart bin/webpack-dev-server for changes to take effect

/* eslint global-require: 0 */

const webpack = require('webpack')
const merge = require('webpack-merge')
const CompressionPlugin = require('compression-webpack-plugin')
const sharedConfig = require('./shared.js')

module.exports = merge(sharedConfig, {
  output: { filename: '[name]-[chunkhash].js' },
  devtool: 'source-map',
  stats: 'normal',

  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      minimize: true,
      // sourceMap: true, <- ここをコメントアウト

      compress: {
        warnings: false
      },

      output: {
        comments: false
      }
    }),

    new CompressionPlugin({
      asset: '[path].gz[query]',
      algorithm: 'gzip',
      test: /\.(js|css|html|json|ico|svg|eot|otf|ttf)$/
    })
  ]
})

```

しました。とりあえず、それで私の環境ではCSSの差分はなくなりました。

### 2.差分がないのに、ダイジェストが一致しない
本当はこっちの方が問題です。普通、ファイルに差分がなかったら、ダイジェストが異なるはずはないと思うのですが、webpackerがコンパイルすると、どうもダイジェストが一致しない。

私は、サーバサイドのエンジニアで、webpackerとか全く詳しくなかったですけど、とりあえずwebpackが命名してるところを探そうと思いました。`config/webpack/production.js`を見ても、cssの命名をしてそうにはなかったのですが、`config/webpack/`を見ていると`shared.js`が怪しそうでした。

これが、`rails new`で準備した環境に、`rails webpack:install` で生成されて一部分を取り出した、`shared.js` です。


```js
...
  plugins: [
    new webpack.EnvironmentPlugin(JSON.parse(JSON.stringify(env))),
　　　　　　　　// ↓ ここでプロダクションだったら、ExtractTextPluginに '[name]-[hash].css'　を渡すようになっている
    new ExtractTextPlugin(env.NODE_ENV === 'production' ? '[name]-[hash].css' : '[name].css'),
    new ManifestPlugin({
      publicPath: output.publicPath,
      writeToFileEmit: true
    })
  ],
...
```

ここでプロダクションだったら、`ExtractTextPlugin`に `[name]-[hash].css`　を渡すようになっているのですが、このhashをどうやってつけているのかを調べるために,`ExtractTextPlugin`でググりました。

そうすると、[あるレポジトリ](https://github.com/webpack-contrib/extract-text-webpack-plugin)にたどり着きました。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/0b4b6388-afc0-26e2-1b35-c562bd5e65af.png)

**あれ、[name],[id] and [contenthash] ・・・🤔**
`[hash]`なんて記述がなくて、`[contenthash]`になっていました。なんでや・・・。

ドキュメントにないオプションを指定してるような気がしたので、とりあえず、`[hash]`ではなく`[contenthash]`にしてみました。

そしたら、あっさりダイジェストが一致して、404が出ることはなくなりました。
`bin/rails webpack:install`で吐き出す設定ファイルが間違ってるなんて誰がおもいつくんや・・・

ひょっとしたら、どっかのバージョンで`[hash]`から`[contenthash]`に変わったのかもと思って、v1のドキュメントも見てみたけど、`[contenthash]`の記述しか見つからず・・・。


何故`[hash]`になっているかの理由はわかりませんでしたが、とりあえず解決したので良しとします。

(一番の謎は、`[hash]`でも、ちゃんとダイジェストが付いているところ・・・よくわからん)

## まとめ

- `config/webpack/production.js`を弄って、ソースマップは出さないようにする！

- `config/webpack/shared.js`を弄って、`[contenthash]`にする!


この謎の問題に2,3時間溶かしてしまったorz
推測するのではなく、ちゃんと観測する！
Swaggerで自動生成したnodejs-serverにCORSを許可する方法

フロントエンド開発にSwagger Editorから自動生成できるサーバーをローカルで利用しようとしたらCORS制約で通信が出来なかったことがきっかけで記事を書いています。

ローカルでSwagger Editorから自動生成されたAPIサーバーのソースコードに手を加えてCORSを許可する方法を記載しています。
対象サーバーはnodejs-serverです。
※Swagger 2.0仕様でダウンロードしたAPIサーバーです。

## パッケージ「cors」をインストール
「cors」というパッケージを導入します。
https://www.npmjs.com/package/cors

`npm install cors --save`

## ソースコードを編集して「cors」を適用する
ダウンロードしたフォルダの「index.js」を編集します。
※ この方法は全てのリクエストを許可する設定です。細かい設定はcorsのドキュメントを参照してください。
https://www.npmjs.com/package/cors

```diff

'use strict';

var app = require('connect')();
+ var cors = require('cors');  // ここを追加します。
var http = require('http');
var swaggerTools = require('swagger-tools');
var jsyaml = require('js-yaml');
var fs = require('fs');
var serverPort = 8080;

// swaggerRouter configuration
var options = {
  swaggerUi: '/swagger.json',
  controllers: './controllers',
  useStubs: process.env.NODE_ENV === 'development' ? true : false // Conditionally turn on stubs (mock mode)
};

// The Swagger document (require it, build it programmatically, fetch it from a URL, ...)
var spec = fs.readFileSync('./api/swagger.yaml', 'utf8');
var swaggerDoc = jsyaml.safeLoad(spec);

// Initialize the Swagger middleware
swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) {
+  app.use(cors()); // ここを追加します。

  // Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
  app.use(middleware.swaggerMetadata());

  // Validate Swagger requests
  app.use(middleware.swaggerValidator());

  // Route validated requests to appropriate controller
  app.use(middleware.swaggerRouter(options));

  // Serve the Swagger documents and Swagger UI
  app.use(middleware.swaggerUi());

  // Start the server
  http.createServer(app).listen(serverPort, function () {
    console.log('Your server is listening on port %d (http://localhost:%d)', serverPort, serverPort);
    console.log('Swagger-ui is available on http://localhost:%d/docs', serverPort);
  });
});
```

## サーバー起動
後は残りのパッケージをインストールして、通常通りサーバーを起動するのみです。

```
npm install
npm start
```
HoloLensの開発環境構築(2017/07/06)

Hololensの環境構築にとまどったのでメモ(2017/07/06)

#Unityのインストール
1.最新版のUnityをダウンロードして実行(https://unity3d.com/jp/get-unity/update)
2.使用OSのbit数を選んでNext
![スクリーンショット (2).png](https://qiita-image-store.s3.amazonaws.com/0/139482/5a36b739-d041-d7f3-60f5-18789d2bc304.png)
3."Unity"と"Windows Store .NET ~"を最低限選択してNext
![スクリーンショット (3).png](https://qiita-image-store.s3.amazonaws.com/0/139482/1894686d-7b05-9245-a5a1-00bdcada017c.png)
4.そのあとは指示に従ってインストールを終える。
(既にUnityをインストール済みの場合)

#VisualStudioのインストール
1.最新版のVisualStudioをダウンロードして実行（無償のCommunityでOK）(https://www.visualstudio.com/ja/downloads/)
2.指示に従ってインストールする(既にインストール済みの場合は"Visual Studio installer"を起動)
3."ユニバーサルWindowsぷらとフォーム開発"と".netデスクトップ開発"を最低限選択しインストール
![スクリーンショット (4).png](https://qiita-image-store.s3.amazonaws.com/0/139482/87810be0-0d08-e7ec-56d1-e498fed30b69.png)

#魔法のregファイルの実行
魔法のregファイルを落としてきて実行(https://goo.gl/S3xGR7) (魔法の中身は下記に記述)

#Hololensエミュレーターのインストール
Hololensエミュレーターをダウンロードしインストール(http://go.microsoft.com/fwlink/?LinkID=823018)

#buildと実行
1.build Settingを選択
![スクリーンショット (5).png](https://qiita-image-store.s3.amazonaws.com/0/139482/8c8528d7-69ac-f7a7-f970-69644b8fcca8.png)
2.チェックボックスをこのようにしbuild
![スクリーンショット (6)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/139482/b4b35336-04aa-77cd-1bd0-ea280d26ce4c.jpeg)
3.appフォルダを作成し出力する
![スクリーンショット (7).png](https://qiita-image-store.s3.amazonaws.com/0/139482/b7997104-3f7d-39b4-e119-cc779ccc9cac.png)
4.app/~.slnをダブルクリックで実行
5.チェックボックスをこのようにして実行
![スクリーンショット (8)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/139482/a9f5bbf1-f9f0-6c2d-fb50-9b5f7e498da9.jpeg)
6.動いた！
![スクリーンショット (9).png](https://qiita-image-store.s3.amazonaws.com/0/139482/885431fa-e64b-094d-967b-523b6e67756d.png)


#魔法の中身
レジストリをいじるファイル
[~MicrosoftSDKs\windows\v10.0] : visualstudioのバージョンをだましてビルドさせる奴(visualstudio 2017 (15.1)を使う場合これをやらないとbuildが通らない)
[~Microsoft\Analog]の2つ : hololensエミュレーターをインストールするために必要(二つ目は64bitの場合のみ)

#参考文献
[Visual Studio 2017 (15.1) インストール後に Unity で Windows Store App 向けビルドが通らないときの対処](http://blog.xin9le.net/entry/2017/04/23/194631)
[Install the tools](https://developer.microsoft.com/en-us/windows/mixed-
reality/install_the_tools)
[HoloLensのエミュレータを起動し、Unityでアプリを作るまでの手順メモ](http://magicbullet.hatenablog.jp/entry/HoloLensEmulator)
Zendeskの問い合わせフォームをWebサイトへ設置する

# 概要・目的
- Webサイトに問い合わせフォームを設置、そこからZendeskチケットを作成する
- Zendeskのことはよく知らない

# 手順

## Zendeskアカウントを取得
- https://www.zendesk.co.jp/
- "Zendeskを無料トライアル"ボタンがあるのでそこから登録します
- 会社名を入れるようなフォームになっていますが大丈夫です。（なにが）
- これで自分だけのZendeskで30日トライアルできます

※なんでもトライアルできるのが当たり前になりました。試せなければ開発者は使わない（使えない）→利用者へも届かないという流れを感じます。

## ウィジェット利用の準備
画面の指示通り進めるだけなので、手順にする必要もないぐらい簡単です。

- サイドメニューの歯車（管理）→チャネルセクション→ウィジェットをクリックします
- "Web Widgetを入手する"をクリックします
- ボタンの色とフォームタイトルを選択します（あとで変更できるので適当でも大丈夫です）
- "コードスニペットをWebサイトに追加して、Web Widgetを使い始める"→"やってみましょう"
- Web Widgetを追加する→スニペット→クリップボードにコピー→完了
- "Web Widgetを使用する準備ができました"と表示されて終わり

下記のようなコードが生成されます

```html
<!-- Start of shinsaka Zendesk Widget script -->
<script>/*<![CDATA[*/window.zEmbed||function(e,t){var n,o,d,i,s,a=[],r=document.createElement("iframe");window.zEmbed=function(){a.push(arguments)},window.zE=window.zE||window.zEmbed,r.src="javascript:false",r.title="",r.role="presentation",(r.frameElement||r).style.cssText="display: none",d=document.getElementsByTagName("script"),d=d[d.length-1],d.parentNode.insertBefore(r,d),i=r.contentWindow,s=i.document;try{o=s}catch(e){n=document.domain,r.src='javascript:var d=document.open();d.domain="'+n+'";void(0);',o=s}o.open()._l=function(){var e=this.createElement("script");n&&(this.domain=n),e.id="js-iframe-async",e.src="https://assets.zendesk.com/embeddable_framework/main.js",this.t=+new Date,this.zendeskHost="shinsaka.zendesk.com",this.zEQueue=a,this.body.appendChild(e)},o.write('<body onload="document._l();">'),o.close()}();
/*]]>*/</script>
<!-- End of shinsaka Zendesk Widget script -->
```

おそらくサイトによって`this.zendeskHost="shinsaka.zendesk.com"` 部分が変化するだけかと。親切にhtmlコメントがありますが、実質的にワンライナーscriptになっています。

## サイトへ設置
生成されたコードをWebサイトページの head要素に配置します。具体的には `<head>` と `</head>` の間に貼り付けます。

# 確認
## Webページの表示
- 設置したWebページを開くと、右下にサポートボタンが表示されます。
- クリックすると問い合わせフォームが表示されます。

![zendesk_wedget.png](https://qiita-image-store.s3.amazonaws.com/0/53115/e90fae41-431c-59a5-486a-dbeb2681662a.png)

## 問い合わせ入力・送信

- 必要項目を入力し、送信します

![zendesk_wedget2.png](https://qiita-image-store.s3.amazonaws.com/0/53115/ace18fc2-54e1-c301-ede7-c2bee4331147.png)

## チケット作成
- Zendeskサイトを確認するとチケットが作成されていることが確認できました


![zendesk_wedget3.png](https://qiita-image-store.s3.amazonaws.com/0/53115/a9df9122-e1ab-7c70-dd5c-169c5b74f4e0.png)

# フォーム（ウィジェット）の設定変更
- Zendesk側の管理機能（サイドメニューの歯車（管理）→チャネルセクション→ウィジェット）より設定を変更するだけでボタン色やラベルぐらいは変更できるようです。
- Webサイト側の変更不要なのはとても良いですね。

![zendesk_wedget4.png](https://qiita-image-store.s3.amazonaws.com/0/53115/ee16584e-e80c-304c-786d-133822535a4b.png)
SwiftのstructのメモリレイアウトサイズをdSYMから取り出す


## 環境

Xcode 8.3.2 (Swift 3.1)

## 動機

EXC_BAD_ACCESS on devices if nested structs are used with Xcode 8.3 and Swift 3.1
https://bugs.swift.org/browse/SR-4432

このバグを踏んだ。
コンパイルは通るがランタイムでその周辺を実行したときにクラッシュする系。(さいわい、最適化により回避されるので、デバッグ端末(しかもarm64に限る)でしか発生しない。)

内容は追っていないが、仮説としてstructのサイズが大きくなったとき、というのがあり、実際にBox化などでstructのサイズを減らすことで回避できた。

structサイズがトリガーとなる仮説に基づき、あるアプリで使っているstructを大きい順に並べたい。(4Kを超えているものがあればアプリ実行してみて確認したい)

## メモリレイアウトサイズの取り出しかた

dSYMに含まれているDWARFファイルを `dwarfdump` する。
structのメモリサイズ順に並べる全部入りのワンライナー:


```
f=path-to-.dSYM/Contents/Resources/DWARF/*; for a in $(dwarfdump -arch arm64 "$f" | grep 'TAG_structure_type' | cut -f1 -d:); do dwarfdump --debug-info=$a $f | grep -E '(AT_name|AT_byte_size)' | paste -d, -s - | awk '{print strtonum($5) "\t" $2}'; done | sort -g | uniq
```

### 出力例

```
:
721	"_TtRTC..."
721	"_TtTC..."
1185	"_TtRTC..."
1185	"_TtTC..."
2134	"..."
2134	"Optional"
2139	"Result"
2139	"_TtRGO..."
4537	"..."
4537	"_TtRV..."
```

最大で4537バイトのstructがあることがわかる。
(nominal以外の合成型も出現する)


### 解説

ただのgrep,awk芸だが‥

`dwarfdump` すると含まれている各 `TAG_*` が出力される。
`struct` がほしいので `TAG_structure_type` だけ取り出す (でいいのか?)。
`TAG`の行にアドレスがあるので、それを各々 `dwarfdump` に渡して、 `AT_name` と `AT_byte_size` を取り出して1行にして `awk` 整形、ソートする。


### 課題


`dwarfdump` で `TAG_structure_type` でフィルタしてその `AT_name` と `AT_byte_size` だけ取り出したい、みたいなオプションの書き方は分からなかった。


### demangle

結果表示のなかでmanglingされている名前を戻したい場合は `swift-demangle` を使う。

`xcrun swift-demangle ...`


## 他の方法

### `MemoryLayout<T>.size` をつかう

なんらかの方法で `T` を収集し、デバッガで実行すればよいが、`import` が必要だったり、遅かったり、ある数以上実行すると返ってこなくなったりで、使いづらかった。

コード内で `print(MemoryLayout<T>.size)` するには、可視性の問題があった。

### アプリの実行ファイル・frameworkのバイナリから取り出す

structのメモリレイアウトサイズは、実行バイナリに入っているのだろうか・・・?
リソース

###ソースコードとリソースが分離されている
Androidアプリはソースコードから分離された、画像、オーディオ、テキストなど、アプリの外観に関連するあらゆるリソースが必要。
アクティビティのレイアウトに関する情報もすべてxmlファイルに分離されている。
main.javaファイルだけ書いて、あとはライブラリを読み込めば動くでしょ？なんてことはない。
###さまざまなデバイスに対応するため
リソースを分離することで、さまざまなデバイスに対応できるようになっている。
AndroidOSの根本的で重要な方針であり、今までのOSにはない概念であり特徴である。
そういえばHTMLの属性って「"」か「'」どっちで囲めばいいの？

#結論から言えば

>Attributes are placed inside the start tag, and consist of a name and a value, separated by an "=" character. The attribute value can remain unquoted if it doesn’t contain space characters or any of " ' ` = < or >. Otherwise, it has to be quoted using either **single or double quotes.** The value, along with the "=" character, can be omitted altogether if the value is the empty string.

>```html:sample
<!-- empty attributes -->
<input name=address disabled>
<input name=address disabled="">

><!-- attributes with a value -->
<input name=address maxlength=200>
<input name=address maxlength='200'>
<input name=address maxlength="200">
```
>[W3C勧告 HTML5.1 HTMLの簡単な紹介 より](https://www.w3.org/TR/html51/introduction.html#a-quick-introduction-to-html)


結論から言えば、**どちらでもOK。**

しかしなぜ、``"ダブルクオーテーション"``の方が普及率が高いのか……
W3C勧告にダブルクオーテーションが使用されているから、というのが有力かなーと思っているのですが……
調べてみましたが、結局結論に至れず。うーん…
画像取り込み時、ValueError

初投稿。
Kerasにて、画像分類を行う途中で発生した恥ずかしいエラーをメモ的に残す。

```test.py 
Using TensorFlow backend.
data/train/xxxxx/001.jpg
(3, 120, 120)
data/train/xxxxx/002.jpg
(3, 120, 120)
data/train/xxxxx/003.jpg
(4, 120, 120)
data/train/xxxxx/004.jpg
(3, 120, 120)
data/train/xxxxx/005.jpg
(3, 120, 120)
data/train/xxxxx/006.jpg
(3, 120, 120)
data/train/xxxxx/007.jpg
(3, 120, 120)
data/train/xxxxx/008.jpg
(3, 120, 120)
data/train/xxxxx/009.jpg
(3, 120, 120)
###################################
Traceback (most recent call last):
  File "test.py", line 74, in <module>
    history = model.fit(images_list, Y, epochs=5, batch_size=10, validation_split=0.1)
  File "/usr/lib64/python3.6/site-packages/keras/models.py", line 870, in fit
    initial_epoch=initial_epoch)
  File "/usr/lib64/python3.6/site-packages/keras/engine/training.py", line 1435, in fit
    batch_size=batch_size)
  File "/usr/lib64/python3.6/site-packages/keras/engine/training.py", line 1311, in _standardize_user_data
    exception_prefix='input')
  File "/usr/lib64/python3.6/site-packages/keras/engine/training.py", line 127, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (36, 1)
```

RGBの3次元を扱う想定が、4次元になっているのがいた模様。
そういえば、png→jpgにした画像あったなと、恥ずか悲しいエラー。
IFTTTでtwitterと連携させてslackに天気予報チャンネルを作る

#ことの発端は
我が家にテレビや新聞がないんですが。
わざわざiphoneのウェザーニュースみるのもなーと思いつつ、そういえば会社でslack使ってるしここで天気予報見れたら便利じゃん！
てな感じで天気予報を送るチャンネルを作りました。

#原理としては
特定のtwitterのアカウントがツイートしたら、そのツイートをチャンネルに送る仕組みです。
今回は[Yahoo!天気・災害 @yahoo_weather](https://twitter.com/Yahoo_weather)を連携させてみます。

#slackの準備
##1.チャンネルを作る
個人宛にも出来るみたいですが、せっかくなのでチャンネルを作ります。
チャンネル名は適当に**#weather_report**とかで。
プライベートでもパブリックでもOK。

##2.アプリケーション連携
「+Add an app or custom integration」をクリック。
するとSlackのAPPDirectoryを開くので、「IFTTT」を検索→連携。
コンテンポラリーなアイコンが目印です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/0e508a5d-6511-d48a-1241-5d855dd27bd8.png)


#IFTTTの準備
##アカウント作成orログイン
https://ifttt.com/ にアクセス。
文字のでかさが分かりやすさ満載って感じで好き。
「Get started」から開始します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/7562d441-f309-1330-a17b-64d6dc2b46fc.png)

googleアカウントやfacebookアカウントから連携ログインさせることが出来るので、お好きな方法でOK。
アカウントが無ければ「sign up」からアカウントを作成します。

##アプリを連携させる
今回はmazunokoさんの『指定したユーザーのツイートをSlackにPost』を使います。
https://ifttt.com/applets/472247p-slack-post

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176912/992c4e32-9e89-f954-5716-df23ffe3ac9d.png)


「Turn on」をクリックすると、設定画面にいきます。

![post.png](https://qiita-image-store.s3.amazonaws.com/0/176912/c7b46f81-57df-20c4-9fac-ef6c200c2de5.png)


**『指定したユーザーのツイートをSlackにPost』**
アプリの名前になります。わかりやすいものを入力しておくと後々便利。
そのままでもOKです（自分はそのままで複数登録してどれがどれだかわからなくなった）。

**『Username to watch』**
ポストする対象のユーザーIDを入力します。
今回は**@Yahoo_weather**を入力しておきます。

**『Post to Channel』**
ポストする先のチャンネルを選びます。
連携したSlackに登録されてるチャンネルが全て出ているはずなので、その中から任意のチャンネルを選択。
最初に作っておいた**#weather_report**へポストさせる設定にします。


これでSAVEすればOK。
思い出しながら書いたので初期設定のあたりがあいまいですが大体こんな感じでslack＆twitter天気予報の完成です。
twitterのつぶやきから少しラグはあるようですが（時間は未計測）、今はとりあえずこれで十分かなーという感じですね。
地名を送ったらその場所の天気予報を送り返してくれるbotとか作りたいなーと思いつつ。
マニフェストファイル

AndroidOSはアプリのマニフェストファイルを読むことで、アプリのコンポーネントの存在を認識する。
マニフェストファイルですべてのコンポーネントを宣言し、アプリプロジェクトのルートへ置いておく。
パーミッション、最小API、ハードウェア機能、APIライブラリなどの宣言もこのマニフェストファイルで宣言する。
アプリを起動させると、android.intent.action.MAINとandroid.intent.category.LAUNCHERを指定したActivityが起動される。
AndroidOS、アプリ連携

#誰でも別のアプリを起動できる
AndroidOSのシステムの根本的な方針として、どのアプリからでも別のアプリを開ける。
例えばカメラアプリ、すでにカメラ機能を備えたアプリが端末内に存在することを想定して、自分でカメラ機能を開発する代わりに、自分のアプリから別のカメラアプリを起動することによって要件を満たす。
#起動の方法
特定のコンポーネントを開始するインテントを指定するメッセージを、OSに対して発行する。
システムがメッセージを受けて、コンポーネントをアクティベートする。
#起動できるコンポーネント
アクティビティとサービスとブロードキャストレシーバの、3つのコンポーネントは、インテントと呼ばれる非同期メッセージによってアクティベートされる。
アクティビティとサービスは、インテントが行うアクションを定義し、インテントによってアクティベートされる。
#同一アプリ内のコンポーネントの起動
同じアプリに関連付けられたコンポーネントも同じで、インテントによって個別のコンポーネント同士を、実行時に結び付ける。
#開始するには
Activityを開始するには、IntentをstartActivity()へ渡す。
Serviceを開始するには、IntentをstartService()へ渡す。
[AWS] Webサーバーを構築

## 概要
AWS(Amazon EC2)でWebサーバーを構築する方法です。
EC2のインスタンス設定を行うことでwebサーバーを構築することができます。

## EC2のインスタンス設定
最初にEC2のインスタンスを設定します。インスタンスは仮想サーバーのことです。
初期状態では、FTPクライアントでの接続ができなかったり、Apachもインストールされていないため、必要なパッケージをインストールします。

### 1. インスタンスの作成する
EC2には、サーバーも自分で立ち上げることができます。
最初にAmazon EC2 コンソールを開いて、「インスタンスの作成」をクリックします。

#### 1-1. AMIの選択
「Amazon Linux AMI 2017.03.1 (HVM), SSD Volume Type」を選択します。

#### 1-2. インスタンスタイプの選択
「t2.micro」を選択します。

#### 1-3. インスタンス作成の確認
「起動」をクリックします。

#### 1-4. キーペアの作成
「新しいキーペアの作成」を選択し、「キーペア名」を入力します。
キーペアのダウンロードをクリックし、ファイルをダウンロードします。
インスタンスの起動をクリックします。

### 2. インスタンスにssh接続する
インスタンスを用意しても、簡単にsftp接続などは設定をする必要があります。
そのため、まずはssh接続できるように設定します。

#### 2-1. ダウンロードしたキーの場所を変更
ダウンロードしたキーをrootの「.ssh」のフォルダに移動します。
隠しファイルが非表示になっている場合は、表示にしてから移動、もしくはターミナルから移動します。

#### 2-2. ダウンロードしたキーの権限を設定
ターミナルから下記のように入力してキーの権限を400に設定します。
（パスは適時書き換えてください。）

```
chmod 400 ~/.ssh/mykeypair.pem
```


#### 2-3. インスタンスに接続
ターミナルから下記のように入力してssh接続します。

```
ssh -i ~/.ssh/MyKeyPair.pem ec2-user@{IP アドレス}
```
初めての場合は

```
Are you sure you want to continue connecting (yes/no)?
```
と聞かれるのでyesを入力します。
すると、

```
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|
```
上記の表示がされると、接続完了です。
終了したい場合はexitと書けばssh接続が終了します。

### 3. Apachのインストール
Apachをインストールします。

#### 3-1.インストール
下記のコマンドを入力し、Apachをインストールします。

```
sudo yum -y install httpd
```

#### 3-2. 起動
下記のコマンドを入力し、Apachをインストールします。

```
sudo service httpd start
```

#### 3-3. インスタンスが起動したらApachも起動
インスタンスを起動したら自動的にApachが起動するようにします。

```
sudo chkconfig httpd on
```

#### 3-4. 確認
下記のコマンドを入力し、きちんと設定できているか確認します。

```
chkconfig --list httpd
httpd          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

### 4. sftpの接続を許可する

標準ではec2ユーザーはファイルのアップロードができないので、権限を変更します。


```
sudo su
chmod -R 755 /var/www/html
chown -R ec2-user /var/www/html
```




### 5. HTTPの表示を許可する

インスタンスのページの説明タブから「セキュリティグループ/launch-wizard-1」をクリックします。
次に「インバウンド」のタブから「編集」をクリックし、httpを追加します。

## 確認
IPv4 パブリック IPでアクセスすることで画面が表示されます。
## 参考情報

### 用語説明
|用語  |説明  |
|---|---|
|IPv4 パブリック IP  |インターネットから到達可能な IPv4 アドレス  |

### 参考サイト
Linux 仮想マシンの起動
https://aws.amazon.com/jp/getting-started/tutorials/launch-a-virtual-machine/

AWS EC2でWebサーバーを構築してみる
http://qiita.com/Arashi/items/629aaed33401b8f2265c
-enable-bridging-pch をDebugだけONにしてみる

## これはなに
- Swift.orgに下記の記事が上がっている
 - [Faster Mix-and-Match Builds with Precompiled Bridging Headers](https://swift.org/blog/bridging-pch/)  
- 要するに `Bridging-Header.h` をプリコンパイルしてビルド時間を改善するオプションを試験的に追加したという内容
- [Twitterのハッシュタグ検索](https://twitter.com/search?l=&q=%23SwiftBridgingPCH&src=typd&lang=ja) すると効果があったという声もちらほら見えるけど、実際のところどうなのかよくわからない
- そして `-enable-bridging-pch` についてのブログや記事が Swift.org 以外に見当たらない
- また [Xcodeのリリースノート](https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW1)を検索してもそれらしい項目も見つからない

## `-enable-bridging-pch` をDebugだけONにしてみる
- Swift.orgには Xcode 8.3 Beta から利用できると書いてるのでリリースノートにはないけど、最新の8.3.3でも利用できるのではないか？
- 試しに `-enable-bridging-pch` をDebugだけONにしてみる

`-enable-bridging-pch` をDebugだけON |
--- |
<img src="https://qiita-image-store.s3.amazonaws.com/0/37385/a6c49574-882e-7bae-1c66-dda100e8f8e2.png" width="640"/> |

- ONにすると `Bridging-Header.h` をプリコンパイルしているログが表示される

Build時のログ |
--- |
<img src="https://qiita-image-store.s3.amazonaws.com/0/37385/bbad3e17-79a4-f2dc-d007-02d14fae1bb3.png" width="640"/> |

## ビルド時間は短くなったのか？
- 初回のビルド時間はプリコンパイル分の約5秒だけ長くなったが（おそらく誤差の範囲）、２回目以降のビルドは少し速くなった気もする
- SwiftとObjective-Cの両方を使用したプロジェクトを開発していると、数行コードを修正した後にビルドすると、全ソースをビルドして時間がかかるがその頻度が減った
- リリースするアプリには影響ないのでONにしたまま開発している
- 現状では問題は起きていない

## まとめ
- SwiftとObjective-Cの両方で開発しているプロジェクトでは、試しに `-enable-bridging-pch` をDebugだけONにしてみると良いかも
- 情報が少ないので利用者がいたら、コメントくれると嬉しいです
Androidのコンポーネント

##Androidのコンポーネントは4種類ある。
1. Activity
2. Service
3. ContentProvider
4. BroadcastReceiver

###Activity
GUIを提供するコンポーネント
1つのActivityが1つの画面を担当し
Activityを遷移させることで画面遷移させる

###Service
バックグラウンドで動作するコンポーネント
UIを持たない

###ContentProvider
共有データを管理するコンポーネント
アプリ間でデータを共有するときに使う

###BroadcastReceiver
システム全体のブロードキャストアナウンスに応答するコンポーネント
Intentを受信するためのコンポーネント
OSからの通知、アプリ間の通知、同一アプリ内のコンポーネント間の通知、いずれにも使われる
Serviceの状態について

#Serviceの状態
Serviceは基本的に2つの状態がある
StartedとBound
起動要因により状態が変わり、状態により終了条件が変わる
###Startedとは
startServiceによって起動された時にStarted状態となる
呼び出し元が消えてもServiceは動き続ける
Service自身が自分をClose処理する必要がある
例えば、ファイルのダウンロードなど、自身で動作完了が判断できる時に使う
###Boundとは
bindServiceによって起動された際にBound状態となる
呼び出し元が生き続ける限りServiceも生き続ける
呼び出し元とunBindになるか、呼び出し元が消えると、Serviceも消える
Bound状態のServiceはクライアントサーバ形式のInterfaceを持ち、バインドされたコンポーネントとプロセス間通信ができる
こんなキャストが通るならphp7がやっぱいいなと思った

これエラーにしてくれないんだということがあったので書いておこうかなと。。

こんなクラスがあって

```php
class Hoge
{
	  /**
     * @param int $id
     */
    public function setHogeId($id)
    {
        $this->hogelId = (int)$id;
    }

    /**
     * @retunr int $id
     */
    public function getHogeId()
    {
        return $this->hogelId;
    }
}
```

こう動かすとエラーも何も起きないんですね

```php
$id = [1, 2];

$hoge = new Hoge();
$hoge->setHogeId($id);

var_dump($hoge->getHogeId()); // => int(1)
```

やっぱphp7が使えるものなら ↓のように書きたいですね。。

```php
    /**
     * @param int $id
     */
    public function setHogeId(int $id)
    {
        $this->hogelId = $id;
    }

    /**
     * @retunr int $id
     */
    public function getHogeId(): int
    {
        return $this->hogelId;
    }
```

そもそもsetHogeId()に配列が入ってしまうような途中処理が悪いのだけど
それを検知できなくて他で思うように動かずハマりました。。
chromeエクステンションでjsonpを読み込みメモ

jsonpが利用できるのに読み込んでくれない
`because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem: chrome-extension-resource:".`
コンソールにこんなエラーがでるとき

# js側

```javascript:
$.ajax({
  type: 'GET',
  url: 'http://localhost:4000/jsonのパス',
  dataType: 'jsonp',
  jsonp: 'callback'
})
.done(function(data){
  console.log("成功");
})
.fail(function(data){
  console.log("エラー");
});
```

# manifest.jsonにいかを追記

```javascript:
"content_security_policy":"script-src 'self' http://localhost:4000; object-src 'self'",
```

#参考
http://noumenon-th.net/programming/2016/03/24/jsonp_jquery/
https://stackoverflow.com/questions/36622181/how-to-fix-chrome-extension-inline-javascript-invocation-error
vagrantでCoreOSを使ってみる

## 概要
CentOS7などを使って見たが、カーネルが3.10と古かったりしたので、
Dockerで使うにはカーネルのバージョンアップが必要だったりと割と面倒なところがあり、
調べていたら、CoreOSなるものがあると知ったので、使ってみる。

## 事前準備
- [VirtualBox](https://www.virtualbox.org/) のインストール
- [Vagrant](https://www.vagrantup.com/) のインストール

## vagrantファイルを用意
下記ドキュメントを参考にVagrantfileを用意する

- [Running CoreOS Container Linux on Vagrant](https://coreos.com/os/docs/latest/booting-on-vagrant.html)

```sh:ターミナル(Mac)
$ mkdir -p ~/Documents/Vagrant/coreos/
$ cd ~/Documents/Vagrant/coreos/
$ git clone https://github.com/coreos/coreos-vagrant.git .
```

### 共有フォルダを設定
host(Mac)とguest(CoreOS)の間で共有フォルダを設定する。

**フォルダ作成**

```sh:ターミナル(Mac)
$ mkdir -p ~/Documents/Vagrant/coreos/opt/
```

**Vagrantfile修正 (22行目付近)**

```ruby:Vagrantfile
$shared_folders = {'./opt/' => '/home/core/opt'}
```

## Cloud-Configの設定
「user-data.sample」の中身を参考に、「user-data」ファイルを作成する。

### Docker-Composeを追加
Docker-Compose（1.14.0）をインストールする。

```sh:ターミナル(Mac)
$ vi ~/Documents/Vagrant/coreos/user-data
```

```ruby:user-data
#cloud-config

coreos:
  units:
    - name: install-docker-compose.service
      command: start
      content: |
        [Unit]
        Description=Install docker-compose
        ConditionPathExists=!/opt/bin/docker-compose

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/mkdir -p /opt/bin/
        ExecStart=/usr/bin/curl -o /opt/bin/docker-compose -sL "https://github.com/docker/compose/releases/download/1.14.0/docker-compose-linux-x86_64"
        ExecStart=/usr/bin/chmod +x /opt/bin/docker-compose
```

## 仮想マシンの起動

```sh:ターミナル(mac)
$ vagrant up
$ vagrant ssh
```
※起動途中に共有フォルダ（NFS）の関係でMacの管理者パスを聞かれるので入力する。

## 各種バージョンを確認

```sh:ターミナル(CoreOS)
# kernel
$ uname -r
4.11.6-coreos-r1

# git
$ git --version
git version 2.13.0

# docker
$ docker --version
Docker version 17.05.0-ce, build 89658be

# docker-compose
$ docker-compose --version
docker-compose version 1.14.0, build c7bdf9e
```

ひとまず、問題ないようです。

## 参考資料

- [Booting On Vagrant](https://coreos.com/os/docs/latest/booting-on-vagrant.html)
- [Github - Coreos Vagrant](https://github.com/coreos/coreos-vagrant)
- [Docker Compose to CoreOS](https://stackoverflow.com/questions/29086918/docker-compose-to-coreos#41101311)
- [CoreOSに入門した](http://deeeet.com/writing/2014/11/17/coreos/)
jdk8でjava.util.concurrent.ConcurrentHashMap.keySet()がjava.lang.NoSuchMethodErrorになる

Java8で `ConcurrentHashMap#keySet()` の戻り値が変わって互換性が無くなったので、jdk8でコンパイルは通るけど実行時にエラーになることがある。

- Java8
https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/ConcurrentHashMap.html

- Java7
http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/ConcurrentHashMap.html

バージョンアップに合わせてコード修正するか、jdk7でコンパイルしよう。

## 参考

https://gist.github.com/AlainODea/1375759b8720a3f9f094
SSMS(SQL Server Managment Studion)のクエリエディタータブの表示が長いので短くする


ツール→オブションから「テキストエディター」の「エディターのタブとステータスバー」を選択。
**「ファイル名を含める」以外**をFalseに変更すればOK
（「ファイル名を含める」までFalseにすると、画像のようには短くならないので注意）



![Kobito.IsUDFw.png](https://qiita-image-store.s3.amazonaws.com/0/41877/5afac4ee-e730-d1d0-fdd8-7c0c6137f8d6.png "Kobito.IsUDFw.png")

次から開くタブは、以下のように短くなる。

![Kobito.bLcmq3.png](https://qiita-image-store.s3.amazonaws.com/0/41877/e76ae9c0-e3cf-7b22-f12f-07ef4259b941.png "Kobito.bLcmq3.png")
nginx => 13: Permission Denied

# 概要
nginxを初めて使ってみましたが、
色々ハマりどころがあったため、メモを兼ねて投稿します。


# Owner問題
これはnginxに限った問題ではないかもしれませんが、
使用するフォルダがnginxの実行ユーザになっている必要があります。

例えば、centosの場合だと

> /var/lib/nginx

などですね。

ここがうまくいっていないと
ダウンロードの処理などを入れた時に

> failed (13: Permission denied) while reading upstream

というエラーがnginxから吐き出されます。


## 解決手法

> sudo chown -R [nginxの実行ユーザ名] /var/lib/nginx

ここはもしかしたらOwnerを変えすぎなのかもしれませんが、
そこまで検証をしていません。
もしそういう指摘などありましたら、コメントください。

Permission deniedになったものが他にもあった気がするのですが、
思い出せないので思い出した時に追記します。
pythonでgpsreadを使っているとたまにRequestErrorが発生する


表題の通り、下記のエラーがたまに発生する。
結論を先に書くと、access_tokenの有効期限が１時間だったので、それ以降に同じ発行内容でアクセスするとエラーが発生していただけだった。

```

response.status_code, response.content))
gspread.exceptions.RequestError: (401, '401: b\'<HTML>\\n<HEAD>\\n<TITLE>Unauthorized</TITLE>\\n</HEAD>\\n<BODY BGCOLOR="#FFFFFF" TEXT="#000000">\\n<H1>Unauthorized</H1>\\n<H2>Error 401</H2>\\n</BODY>\\n</HTML>\\n\'')

```

プログラムの処理の内容的には、スプレッドーシートの管理表をもとに定期的にクエリを発行し、クエリ実行完了後に管理表をアップデートする、というもの。
１と３でアクセスする際に使用するaccess_tokenは同じものを使用していたので、２の処理に時間がかかったりして１時間を超える場合、エラーが発生していた。
なので今回は、tokenの発行から特定のシートの取得までの処理を独立させて、都度実行するように変更


1.スプレッドシート読み込み
2.クエリ実行
3.スプレッドシート上書き

※独立させた処理はここまで

```python
def get_worksheet():
    doc_id = 'スプレッドシートのDocumentID'
    scope = ['https://spreadsheets.google.com/feeds']
    path = os.path.expanduser("Google Drive APIを有効化した際に発行されたjsonファイルのpath")
    credentials = ServiceAccountCredentials.from_json_keyfile_name(path, scope)
    client = gspread.authorize(credentials)
    gfile = client.open_by_key(doc_id)
    worksheet = gfile.sheet1
    return(worksheet)

```


ちなにみ、最初からrefresh_tokenを発行しておけば、いちいち再発行する必要がないので、何時間も連続してアクセスする必要の場合はそちらを使う方がベター。
Ubuntu bashのプロンプトHack!!!!（gitブランチ表示）

# bashをもっと便利にしたい
普段はWindows+vagrant+Ubuntu14.04をベースに色々な環境を整えて開発することが多い今日この頃。
簡単な作業ならWindowsでやるんですけど、その際はGit for Windowsに付属してくる、
Git Bashを使って作業します。

[Git for Windows](https://git-for-windows.github.io/)
↑本家のサイト

Windowsで作業するときのCLIは色々選択肢があって、
どれも一長一短な感じがあります。（Powershell、Git bash、~~コマンドプロンプト~~）

最近はGit bashに落ち着いてる感じです。
Unixの感覚に近いし、最低限必要なものはプリインストールされてます。
Git bashで特に便利なのが、gitのディレクトリ内にいるときにプロンプトに現在のブランチが表示されるところですね。

```
user@hoge MINGW64 ~/hoge/git (master)
```
↑こんな感じ
これは便利ですね。いちいちgit branchコマンド打たなくて済みます。
これをLinuxの仮想マシン側でもやりたいわけです。

# 調べてみた
結構簡単に実現できます。

~/.bashrcに下記を追記してください。

```
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi
if [ -f /etc/bash_completion.d/git-prompt ]; then
    export PS1='\[\033[01;32m\]\u@\h\[\033[01;33m\] \w$(__git_ps1) \n\[\033[01;34m\]\$\[\033[00m\] '
else
    export PS1='\[\033[01;32m\]\u@\h\[\033[01;33m\] \w \n\[\033[01;34m\]\$\[\033[00m\] '
fi
```

bash_completionがインストールされている必要がありますが、
Ubuntuは最初からインストールされているのでこれを追記するだけで大丈夫です。

あとは、
```
・git bashを立ち上げ直す
・source ~/.bashrc
```
のどちらかをすれば反映されます。

# 便利だね
けっこう有名な方法だけど、備忘かねて記事にしておきます。
セルフホストのWCFサービスをマルチスレッドにする

```
ConcurrencyMode = ConcurrencyMode.Multiple
```

属性に上を付けてるのになんか直列で動いてるっぽい。
調べてみたら、セルフホストの場合は

```
UseSynchronizationContext = false
```
なんてのもいるらしい。

##参考
[http://d.hatena.ne.jp/sixpetals/20140204/p1](http://d.hatena.ne.jp/sixpetals/20140204/p1)

[https://social.msdn.microsoft.com/Forums/vstudio/en-US/593df2bb-9505-49f2-92e9-e6e925d95830/how-to-increase-the-concurrency-of-restful-wcf-service?forum=wcf](https://social.msdn.microsoft.com/Forums/vstudio/en-US/593df2bb-9505-49f2-92e9-e6e925d95830/how-to-increase-the-concurrency-of-restful-wcf-service?forum=wcf)
CoffeeScriptのススメ

CoffeeScriptは、代表的なAltJS(JavaScriptの代用品)です。AltJSとしては、ほかにはTypeScriptが有名です。
Railsでは、標準でCoffeeScriptが使えるようになっているので、積極的に使うようにすると生産性があがるかも知れません。
CoffeeScriptの文法は、RubyやPythonに似ています。ブロック構造で制御構造を表すところは、PythonやHamlに似ています。
ES6(次世代JavaScript)の登場でAltJSの方向性が不透明になったり、GoogleがTypeScriptを正式採用したりといろいろ話題に事欠かないですが、小規模なアプリ開発でJavaScriptを多用する場合は選択肢の一つとして持っておいて損はないです。

## JavaScriptとの大きな違い

### 行末のセミコロン`;`および関数呼び出し時の引数のカッコ`()`が不要（つけてもよい）

```js:JavaScript
alert('Hello, world!');
```

```coffeescript:CoffeeScript
alert 'Hello, world!'
```

### ブロック構造はインデントで表現するので、波カッコ`{}`が不要

```js:JavaScript
if (a == true) {
  alert('a is true!');
} else {
  alert('a is false!');
}
```

```coffeescript:CoffeeScript
if a == true
  alert 'a is true!'
else
  alert 'a is false!'
```

### `===`演算子はもう必要ありません

```js:JavaScript
if (a === null) {
  alert('a is null!');
}
```

```coffeescript:CoffeeScript
if a == null
  alert 'a is null!'
```

### 関数定義はアロー演算子(`->`,`=>`)を用いる

```js:JavaScript
function f(x) {
  return true;
}
```

```coffeescript:CoffeeScript
f = (x) ->
  true
```

### アロー演算子を用いると、JQueryで多用されがちなコールバックが簡潔に書ける

JavaScript

```js:JavaScript
$(document).ready(function() {
  $('#button').click(function() {
    alert('Button is pushed!');
  )};
});
```

```coffeescript:CoffeeScript
$(document).ready ->
  $('#button').click ->
    alert 'Button is pushed!'
```

## ほかの違い

クラスが定義できたり、ブロック構造全体の戻り値を利用できたり、`return`文が必要なかったり、~~ただのテンプレートエンジンと割り切るには~~あまりにも多くの機能を持っています（もはや異なる言語）。特に、JavaScriptでは煩雑になりがちなArray.eachの処理やHash.eachの処理を簡潔に書ける点はそれだけとってもJavaScriptから乗り換える価値があると思います。

## 欠点

ブラウザがCoffeeScriptを実行するのではなく、Railsの場合アセットパイプラインでプリコンパイルされたJavaScriptが実行されます。そのため、デバッグがしづらいという欠点があります（ソースコードの行数と生成されたJavaScriptの行数が異なるため）
ChromeやFirefoxでは、アドオンを利用することによりCoffeeScriptのデバッグにも対応可能なようです。

欠点ではありませんがグローバルスコープは原則使えません。
変数名の前に@をつけると擬似的にグローバルスコープ(当該Windowにバインドされたローカル変数)が使用できます。
また、ローカルスコープから変数の値が外に漏れることもありません。（クロージャが自動的に生成されます）

みんな大好き三項演算子が使えません！`if`-`then`構文を用いて書き直します(`if`-`then`ブロックが最後に評価した値を返す性質を用います)。

```js:JavaScript
a = (a === null) ? 'null' : a + ' hello';
```

```coffeescript:CoffeeScript
a = if a == null then 'null' else a + ' hello'
```

複数行でもOK!

```coffeescript:CoffeeScript
a = if a == null then
  'null'
else
  a + ' hello'
```

## その他のメリット

JavaScirptの代替品なので、Rails以外でも使えます。たとえば、node.jsではCoffeeScriptを用いて記述することが一般的に行われています。
この場合、Gulp.jsなどを用いてコンパイルします。サーバサイドがnode.jsの場合、サーバサイドの記述にもCoffeeScriptを用いることができるわけです。
React.createClassからReact.Componentにしたときのメモ


## import
### React.createClass
```html
<script src="//fb.me/react-0.13.3.js"></script>
<script src="//fb.me/JSXTransformer-0.13.3.js"></script>
```

### React.Component
```js
import * as React from 'react';
import * as ReactDOM from 'react-dom';
```

## クラス宣言
### React.createClass
```js
let MyComponent = React.createClass({
	//
});
```

### React.Component
```js
class MyComponent extends React.Component {
	//
}
```

## Status
### React.createClass
```js
getInitialState() {
    return {
		//
    };
  },
```

### React.Component
```js
  constructor(props) {
    super(props);
    this.state = {
    	//
    };
  }
```

## thisのバインド

### React.createClass
必要なし

### React.Component
```js
  constructor(props) {
    super(props);
    this.updateStatus = this.updateStatus.bind(this);
    this.save = this.save.bind(this);
    
	//
  }
```

## Render
### React.createClass
```js
React.render(<MyComponent />, document.getElementById("bar"));
```

### React.Component
```js
ReactDOM.render(<MyComponent />, document.getElementById("bar"));
```

## 参考
http://qiita.com/cubdesign/items/ee8bff7073ebe1979936
Android Gradle 3.0以上で出力するapkのファイル名を変更する



## 3.0以前の設定方法と3.0以降で発生する問題

これまでGradle上で出力するapkのファイル名を変更するときは、下のような設定を記述していました。

```gradle:app/build.gradle
android {
    applicationVariants.all { variant ->
        if (variant.buildType.name.equals("release")) {
            // releaseビルドのみ、ファイル名にVesionNameとビルド時間を付与
            variant.outputs.each { output ->
                if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                    def versionName = variant.versionName
                    def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
                    def newName = "apk_v${versionName}_${date}.apk"
                    output.outputFile = new File(output.outputFile.parent, newName)
                }
            }
        }
    }
}
```

しかしこの設定、Android Gradle 3.0（自分は`3.0.0-arpha5`にて確認）だと、`output.outputFile`が読み取り専用のプロパティとなってしまうためエラーが起きてしまいます。

```log
* What went wrong:
A problem occurred configuring project ':app'.
> Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=release, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED in 0s

```

## 解決策

`variant.outputs.each` ではなく `variant.outputs.all` とし、`outputFileName`に出力したいファイル名を設定することで解決できました。

```gradle:app/build.gradle
applicationVariants.all { variant ->
    if (variant.buildType.name.equals("release")) {
        // releaseビルドのみ、ファイル名にVesionNameとビルド時間を付与
        variant.outputs.all {
            def versionName = variant.versionName
            def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
            def newName = "apk_v${versionName}_${date}.apk"
            outputFileName = newName
        }
    }
}
```

ただしこの場合だと、apk以外のファイルを出力させている場合は上書きしてしまうかもしれません。よりよい変更方法がありましたらコメントもしくは編集リクエストお待ちいたしております。

## 参考

[Android Gradle 3.0.0-alpha2 plugin, Cannot set the value of read-only property 'outputFile' - Stack Overflow](https://stackoverflow.com/questions/44239235/android-gradle-3-0-0-alpha2-plugin-cannot-set-the-value-of-read-only-property)
mod_wsgiで動かす時に、UnicodeDecodeErrorが出てしまう

# 概要
ファイルを読み込むというPythonコードを動かす際のトラブル。
mod_wsgiでApacheから動作させる際に、ターミナルでは普通に動作していたが、Apacheで動作させると`UnicodeDecodeError`に遭遇した。
結果的には、ロケールの設定が問題だった。
少しハマったので、備忘録として残す。
（UbuntuのApacheで動かしているためRHEL系だとディレクトリ構成などは若干異なると思います。）

# エラー内容

```text
[Thu Jul 06 10:50:28.381851 2017] [wsgi:error] [pid 6935] [hogehoge]     for line in fin:
[Thu Jul 06 10:50:28.381858 2017] [wsgi:error] [pid 6935] [hogehoge]   File "/usr/path/to/python/encodings/ascii.py", line 26, i
n decode
[Thu Jul 06 10:50:28.381862 2017] [wsgi:error] [pid 6935] [hogehoge]     return codecs.ascii_decode(input, self.errors)[0]
[Thu Jul 06 10:50:28.381882 2017] [wsgi:error] [pid 6935] [hogehoge] UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not i
n range(128)
```

このように、Pythonでよくやる`for line in fin`として、日本語が記述されたファイルを読み込もうとするだけで、エラーが発生する。
エラーは、`UnicodeDecodeError`なので文字コード周りでコケていそうということがわかる。

# 対策
Apacheの設定が原因だった。
システムは`LANG="en_US.UTF-8"`となっており、ターミナルでデバッグする際は、こちらが適用されている。
Apacheで動作させると、`/etc/apache2/envvars`に記載されている環境変数の設定が適用される。
今回の場合は、ここで`export LANG=C`となっていた。
これを上記のものと揃えて`export LANG="en_US.UTF-8"`とすると動作する（コメントには、`export LANG`で`/etc/default/locale`を読みに行くと書いているがうまく動作しなかった。）

# その他
チェックしたこと
- `import sys;sys.getdefaultencoding()`でutf-8かどうか確認
Processing3.3.4でコンソールが2行しか表示されない問題

Processing3.3.4でコンソールが2行しか表示されない問題への対策メモ

preferences.txtのconsole.linesを2から500に変える
preferences.txtはMacの場合は`/Users/USER_NAME/Library/Processing/preferences.txt`にある
もしくはProcessingのPreferencesから下の方にあるリンクで開ける
**注) preferences.txtはProcessingを一度終了してから開いて編集する**

```diff
chooser.files.native=true
console.auto_clear=true
console.chars=40000
console.font.size=12
console.length=500
- console.lines=2
+ console.lines=500
```

3.3.5では直ってるみたい

参考 https://github.com/processing/processing/issues/5110#issuecomment-307647547
昼休み暇だからpngデータをxlsxに変換するやつ作った

どうぞご査収ください

```go
package main

import (
	"fmt"
	"github.com/loadoff/excl"
	"image"
	"image/png"
	"io"
	"os"
)

// 001.png を好きなpngデータに置き換えてね!!
func readerPNG() io.ReadCloser {
	f, err := os.Open("001.png")
	if err != nil {
		panic(err)
	}
	return f
}

// excel は alpha チャネルが一番先頭にくる。(ここが一番ハマった)
func getRGBAString(img image.Image, x, y int) string {
	c := img.At(x, y)
	r, g, b, a := c.RGBA()
	return fmt.Sprintf("%02X%02X%02X%02X", (a >> 8), (r >> 8), (g >> 8), (b >> 8))
}

func main() {
	w, _ := excl.Create()
	s, _ := w.OpenSheet("Sheet1")

	reader := readerPNG()
	defer reader.Close()

	img, err := png.Decode(reader)
	if err != nil {
		panic(err)
	}

	// なんか設定して置かないと、背景色設定時におかしくなる(よくわかってない)
	for x := img.Bounds().Min.X; x < img.Bounds().Max.X; x++ {
		s.SetColWidth(2.6, x+1)
	}

	for y := img.Bounds().Min.Y; y < img.Bounds().Max.Y; y++ {
		r := s.GetRow(y + 1)
		for x := img.Bounds().Min.X; x < img.Bounds().Max.X; x++ {
			c := r.GetCell(x + 1)
			c.SetBackgroundColor(getRGBAString(img, x, y))
		}
	}
	s.Close()

	// 好きなファイル名にしてみよう!!
	w.Save("test.xlsx")
}
```

元画像
![001.png](https://qiita-image-store.s3.amazonaws.com/0/12550/c2d23f94-3c00-6b3f-58e4-08b5e7ae6882.png)

生成物(イメージ)
![002.png](https://qiita-image-store.s3.amazonaws.com/0/12550/50749b57-6e29-8101-da48-519fea3ea27c.png)
Run Command(SSM)でJavaクラスモジュールからの出力の文字化け対応

# 前提
Run Commandを用いてEC2インスタンス上に配置してあるbashスクリプト経由でJavaのクラスモジュールを実行する。

# 現象
Run Commandの結果に出力される日本語（マルチバイト文字）がすべて?に置き換わってしまう。

# 確認作業
Javaクラスモジュールを呼び出しているbashスクリプトで以下を実行すると空文字が返ってくる。
`echo $LANG`

Javaクラスモジュール内からデフォルトエンコーディングを確認してみる。
`System.out.println(System.getProperty("file.encoding"));`
結果は `ANSI_X3.4-1968` が返ってきた。

# 対策
Javaクラスモジュールを呼び出しているスクリプト内に以下を記述する。
`export LANG='ja_JP.UTF-8'`
Kobito を使ってみて困ったこと

今更ながら「Kobito」を使って Qiita の投稿を行ってみました。
基本的には Qiita から直接行う場合と相違なく、Markdown で気軽に書けるのでいい感じだったのですが、何点か困ったことがあったのでまとめます。

> 2017/07/13 困ったことを追加しました

## タグの付け方がわからない
これは自分だけかもしれないのですが、記事に対してタグ付けしようと思ったらどこに入力すればよいのか分からなくて困りました。

Qiita ではタイトルのすぐ下にあり分かりやすかったのですが、Kobitoは一番下にあります。
デカデカと__タグをスペース区切りで入力...__とはありますが、タイトルの下に．．．という思い込みからか30分位彷徨いましたｗ

ググっても全然出てこないことろを見ると、他の方は困ってないのかも。

## コードのシンタックス部分の表示が投稿後に崩れる
正確には Code 記述をする際のファイル名に半角スペースを含むものを入力していると、Kobito 上では崩れていない表示が Qiita 投稿時に崩れます。

```
 ```properties:Android Studio\bin\idea.properties
```

こういうやつですね。
この「Android Studio」の半角スペースが原因です。

```
 ```properties:Android&nbsp;Studio\bin\idea.properties
```

こう書けば OK です。

まあ、これに関しては、Kobito でうまく表示されたときに「おっ？！いけるの？？」って思いながら投稿したので、ぶち壊れた時はすぐにここが原因だと思いました。

とはいえ、公開後にぶっ壊れた自分の投稿を見るのは心臓に悪いので、できれば Qiita から入力する場合と Kobito から投稿する場合の表示は同じにしてほしいな、と思った次第です。

（あとで気づきましたが、[Markdown記法 チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)のコメント欄に「半角スペースで崩れる問題は改善に努めている」とのことです。）

## タイトルが投稿後にただのテキストに
これも Qiita から入力と Kobito から入力の場合でプレビューに差があるようです。
Markdown でタイトルを付ける時に``` ## タイトル ```とかつけると思いますが、「#」の前に半角スペースが入っていたようで、Qiita 投稿時にタイトルとして認識されませんでした。
Kobito ではうまくプレビューに表示されました。

## 少し困りましたが．．．
それを差し引いても使いやすいので、今後も Kobito から投稿してみようかと。
（この記事も Kobito メイクです）
MessagePack::UnknownExtTypeError: unexpected extension type

td-agentを利用して、ログを転送（forward）していたら、受信側に以下のエラーログが出力された

```
[warn]: emit transaction failed: error_class=MessagePack::UnknownExtTypeError error="unexpected extension type" tag="forward.nginx.error.http.log"
2017-07-06 11:37:59 +0900 [error]: forward error error=#<MessagePack::UnknownExtTypeError: unexpected extension type> error_class=MessagePack::UnknownExtTypeError
2017-07-06 11:37:59 +0900 [error]: suppressed same stacktrace
```

## 原因
送信側と受信側でfluetndのバージョンが違っていた

| 送信側 | 受信側 |
|:----:|:----:|
| fluentd-0.12.35 | fluentd-0.14.18 |

原因がわかれば大したことないけど、わかるまでかなりハマった。