OmniAICreator/Qiita-1.07M huggingface dataset:
AngularJSのコールバック(Promise)について書いてみた。

サーバー側と通信する上で必須なコールバック処理方法を書いてみました。
環境はAngular1.5とjavascriptです。

### 基本の形
コールバック処理で重要なのは非同期処理を操作できるオブジェクトPromiseです。
以下のコードはコントローラーからDI化したpromiseServise.jsのpromiseFunctionを呼び出して
色々処理してくれるのをsingularPromiseControllerは待ってる。という処理です。

待っている部分は～promiseFunction.then( 部分の.thenで待っているよ～という合図になります。

```singularPromiseController.js
angular.module('myApp')
  .controller('SingularPromiseController', SingularPromiseController);
SingularPromiseController.$inject = ['PromiseServise'];

function SingularPromiseController(PromiseServise) {

  function singularPromiseFunction() {
    PromiseServise.promiseFunction.then( //ここでpromiseFunctionの結果を待つ
      function(data) { //resolveなどの引数に入っているオブジェクトがdataに入っている
        console.log('結果', data); 
    });
  }

}
```

そしてpromiseServise.jsではresolve・rejectでsingularPromiseControllerに処理の終了を通知しています。

```promiseServise.js
angular.module('myApp')
  .servise('PromiseServise', PromiseServise);
PromiseServise.$inject = [];

function PromiseServise() {
  var servise = {
    promiseFunction: promiseFunction
  };
  return servise;

  var truthvalue = true;

  function promiseFunction() {
    return new Promise(function(resolve, reject) {
      if (truthValue) {
        var data = "成功";
        resolve(data); //singularPromiseFunctionに成功の結果を通知する
      } else {
        var err = "失敗" //singularPromiseFunctionに失敗の結果を通知する
        reject(err);
      }
    });
  }

}
```

### 応用編（複数待つ場合）
Promiseは複数のコールバック処理を待つ事ができます。
先程のpromiseServise.jsは一切変えずにpluralPromiseController.jsからpromiseServise.jsのpromiseFunctionを複数回呼び出してみます。

重要なのは\$qで、$q.all(配列)とするとpromiseFunctionを全て呼び終わるまで待ってくれます。

```pluralPromiseController.js
angular.module('myApp')
  .controller('PluralPromiseController', PluralPromiseController);
PluralPromiseController.$inject = ['$promise', '$q', 'PromiseServise'];

function PluralPromiseController($promise, $q, PromiseServise) {

  var array = [1,2,3];

  function pluralPromiseFunction(){
    var promiseList = [];

    angular.forEach(array, function(value, key) {
        promiseList.push(PromiseServise.promiseFunction().$promise); //一回のpromiseFunctionの結果をプッシュ
    });

    $q.all(promiseAll).then(function(responseArray) {　//全部呼ぶまで待機
        console.log("結果1", responseArray[0]); 
    });
  }

}
```

### 注意
resolveやrejectに複数のオブジェクトを渡したい時、

```js
resolve(hoge, huga)
```

と書きたくなるのですが、resolveなどは第一引数しか結果を入れられません。
ですので、複数のオブジェクトを渡したい時は配列にオブジェクトをpushして配列をresolveの引数に入れましょう。

```js
resultList.push(hoge, huga);
resolve(resultList)
```
langsheet を使って翻訳データをテーブル一覧表示する

[langsheet][] というモジュールを使うと、翻訳データの入った JSON ファイルを html の table の表現に変換することができます。

例えば、次のような各言語の JSON ファイルを持っていたとします。

英語:

```json
{
  "app.hello": "Hello {name}!",
  "app.form.email": "Mail address",
  "app.form.first_name": "First name",
  "app.form.last_name": "Last name",
  ...
}
```

日本語

```json
{
  "app.hello": "こんにちは {name}さん!",
  "app.form.email": "メールアドレス",
  "app.form.first_name": "名",
  "app.form.last_name": "姓",
  ...
}
```

フランス語

```json
{
  "app.hello": "Bonjour {name}!",
  "app.form.email": "Adresse mail",
  "app.form.first_name": "Prénom",
  "app.form.last_name": "Nom de famille",
  ...
}
```

スペイン語

```json
{
  "app.hello": "¡Hola {name}!",
  "app.form.email": "Correo Electronico",
  "app.form.first_name": "Nombre de pila",
  "app.form.last_name": "Apellido",
  ...
}
```

韓国語

```json
{
  "app.hello": "{name}, 안녕!",
  "app.form.email": "메일 주소",
  "app.form.first_name": "이름",
  "app.form.last_name": "성",
  ...
}
```

これを langsheet でビルドすると以下のような html ページになります。

[<img width="1351" alt="スクリーンショット 2017-08-29 21.39.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/13825/471595dd-bfd8-3351-c6cf-e54efab9016b.png">](https://kt3k.github.io/langsheet/)

翻訳アプリは SaaS 形式のものが多い ([PhraseApp](https://phraseapp.com/), [OneSky](https://www.oneskyapp.com/), [Transifex](https://www.transifex.com/)等) ですが、 小さいアプリなどの場合は SaaS を利用せずに単純に JSON のキーバリューで翻訳文言を管理したい場合もあると思います。そんな場合に、[langsheet][] を利用して、フレーズの ID と言語のマトリックス表示のビューを作ることで、翻訳不整合や翻訳漏れのチェック作業が簡略化できます。

# 使い方

まず npm でインストールします

```
npm install langsheet
```

次に `langsheet.yml` を作成して、ソースとなる JSON のパスを指定してください。

```yaml:langsheet.yml
source: source/i18n/*.json
title: My App Language Data
```

以上を設定した上で、 langsheet コマンドを実行します。

```
npx langsheet build
```

以上で `build/` 以下に index.html が作成され、言語/翻訳一覧テーブルを閲覧することができます。


[langsheet]: https://npm.im/langsheet
最近よく見る斜め背景を作ってみた

##はじめに
最近のwebサイトで背景が「斜め」になっているサイトをよく見る気がします。
[背景 斜め css js]...など検索して一度挫折しました...がやっぱり気になる！!
どんな実装しているのか?? と思い、わからないなりに実装してみました。

参考にしたページ
[斜め背景でカッコいいフロントエンドデザイン](http://qiita.com/sho012b/items/3478ca65fe5b6de0450a)

今回作った[デモ](https://sengokukun.github.io/naname/)

##デモのコード

```html:index.html
<div class="contents">
  <div class="naname naname--left slideOn">
	<div class="naname__bg naname__bg--left slideBox-left"></div>
	<p class="naname__text naname__text--left">TRUNK CAMP</p>
  </div>
</div>
<div class="naname naname--right slideOn">
  <div class="naname__bg naname__bg--right slideBox-right"></div>
  <p class="naname__text naname__text--right">TRUNK CAMP</p>
</div>
.
.
```

leftとrightを交互に配置していきます。


```css:style.css
.contents {
  overflow: hidden;
 }
.naname {
  width: 120%;
  height: 700px;
  position: relative;
  z-index: -1;
 } 
.naname__bg {
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  color: #fff;
  content: ""
 }
.naname__bg--right {
  background-color: orange;
  margin-left: 30%
 }
.naname__bg--left {
  background-color: red;
  margin-left: 60%
 }
.naname__text {
  text-align: center;
  font-size: 90px;
  font-weight: bold;
  color: #fff;
  position: absolute;
  top: 50%;
  left: 50%
 }
.naname__text--right {
  transform: rotate(-5deg) translateX(-65%) translateY(-180%)
 }

.naname__text--left {
  transform: rotate(5deg) translateX(-65%) translateY(-80%)
 }
 .naname--right {
  background-color: #111;
  transform: rotate(5deg);
  margin-left: -50px;
  margin-top: -150px
 }

.naname--left {
  background-color: blue;
  transform: rotate(-5deg);
  margin-left: -50px;
  margin-top: -200px
 }    
```

これで土台を作成(無駄なコードがあったらごめんなさい。。。)
イメージ的に横長の箱をtransformで斜めにして、marginで強引に引っ張ってくる感じ。

##おまけ

```javascript:app.js
$(function() {
	const slideOn = $('.slideOn');
	slideOn.on('inview', function() {
		const slideBoxL = $(this).find('.slideBox-left');
		const slideBoxR = $(this).find('.slideBox-right');
		TweenMax.to(slideBoxL, 1, {
		  "margin-left": '0',
		  delay: .8,
		  ease: Power2.easeOut
		}),
    	TweenMax.to(slideBoxR, 1.5, {
		  "margin-left": '130%',
		  delay: 1,
		  ease: Power2.easeOut
		})
	});
});
```

今回はTweenMaxとinview.jsを使って即席でアニメーションをつけてみました。(これも最近よく見るよね...)

##まとめ
ベストプラクティスかと言われれば、そんな気がしないコードですが、改善改良をして参考程度になると嬉しいです！
ReactiveCollection(UniRx)の中身をInspectorで編集する

## SerializeField書いても出てこない！
Unityでガリガリ書いていると、あぁこの変数SerializeFieldで出てくれればよいのに…と思うことが多いですよね。

またUniRxのReactiveCollectionの中身をデバッグしたい、という話があったのでどうすればよいか調べてみました。

## エディタ拡張を使う
簡単なものであればListに毎回コピーすればよいけど、コスト的に気になるし二重でデータがあるのは気持よくはないね…

というわけで _CustomEditor_ を使えば楽に書けるそうなので、実際にやってみました。

## コード(int型)


```csharp
using UnityEngine;
using UnityEditor;
using UniRx;


public class DebugReactiveCollection : MonoBehaviour {

    private ReactiveCollection<int> intCollection = new ReactiveCollection<int>();

    private void Start()
    {
        // テスト
        intCollection.Add(1);
        intCollection.Add(1);

        // UniRxの処理
        intCollection.ObserveRemove()
            .Subscribe(i => Debug.Log("Remove Item:" + i.ToString()));

        intCollection.ObserveAdd()
            .Subscribe(i => Debug.Log("Add Item :" + i.ToString()));

    }

#if UNITY_EDITOR
    // デバッグ確認用
    [CustomEditor(typeof(DebugReactiveCollection), true)]
    public class intCollectionPreview : Editor
    {
        int additem = 0;

        public override void OnInspectorGUI()
        {
            // 親クラスを参照
            DebugReactiveCollection _drc = (DebugReactiveCollection)target;
            ReactiveCollection<int> _iCol = _drc.intCollection;

            int _count = _iCol.Count;
            if( _count == 0)
            {
                EditorGUILayout.HelpBox("No exist items or No runtime.", MessageType.None);
                return;
            }

            //リストの表示
            for( int i = 0; i < _count; i++)
            {
                EditorGUILayout.BeginHorizontal();
                _iCol[i] = EditorGUILayout.IntField("Item" + i.ToString(), (_iCol[i]));
                if( GUILayout.Button("Delete"))
                {
                    _iCol.RemoveAt(i);
                    EditorGUILayout.EndHorizontal();
                    return;
                }
                EditorGUILayout.EndHorizontal();
            }

            // 追加のGUI
            EditorGUILayout.LabelField(" ");
            EditorGUILayout.BeginHorizontal();
            additem = EditorGUILayout.IntField("Add Index ->", additem);
            if (GUILayout.Button("Add"))
            {
                _iCol.Add(additem);
                EditorGUILayout.EndHorizontal();
                return;
            }
            EditorGUILayout.EndHorizontal();


        }

    }
#endif

}


```

## 動作例
Inspectorに配列を操作するところが出てきた。またUniRxの監視もちゃんとできている。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/180872/7eb63f1e-e33b-6ed9-7654-41de65008828.png)

## おわりに
エディタ拡張の初歩としてもよいと思いますし、ReactiveCollection以外でも使える方法ですので、ぜひ困ったときにやってみましょう。

## 参考
https://anchan828.github.io/editor-manual/web/part1-editorwindow.html
https://gamedev.stackexchange.com/questions/137590/how-to-create-custom-inspector-to-display-generic-stackt-class
LuaをVC2015のプログラムに組み込む

ちょっと迷いましたが、難しくはありませんでした。
調べるほうが困った。

Visual Studio 2015をC++を含めてインストールしてある前提です。

# Luaのソースコードをダウンロードする
公式サイトの「Source」からダウンロードしましょう。
https://www.lua.org/download.html

適当なディレクトリに展開しておきます。

# コンパイルしてstatic libを生成する
いろいろな方法を試しましたが、これが一番楽でした。

1. スタートメニューから「開発者コマンド プロンプト for VS2015」を起動
2. Luaソースコードのsrcディレクトリに移動
3. 以下のコマンドを実行

```bat
cl /MD /O2 /c /DLUA_BUILD_AS_DLL *.c
ren lua.obj lua.o
ren luac.obj luac.o
link /DLL /IMPLIB:lua5.3.0.lib /OUT:lua5.3.0.dll *.obj 
link /OUT:lua.exe lua.o lua5.3.0.lib 
lib /OUT:lua5.3.0-static.lib *.obj
link /OUT:luac.exe luac.o lua5.3.0-static.lib
```

フォルダ内に大量のobjファイルと、lib、static.lib、luac.lib、lua.exe、luac.exeが生成されます。

参考: How to compile Lua 5.3.0 for Windows
https://blog.spreendigital.de/2015/01/16/how-to-compile-lua-5-3-0-for-windows/

#プログラムに組み込む
1. VC2015を立ち上げる
2. ファイル→新規作成→新しいプロジェクト
3. Win32コンソールアプリケーションを選択して次へ
4. 「空のプロジェクト」にチェックを入れ、「SDLチェック」のチェックを外して完了
5. 「ソースファイル」を右クリックして、「追加」→「新しい項目」
6. C++ファイルを適当に生成(ここではSource.cpp)
7. 以下の記述をする

```C++:Source.cpp
#include <stdio.h>
#include <stdlib.h>
#include "lua.hpp"
#pragma comment(lib,"lua5.3.0-static.lib")

int main()
{
	lua_State* L = luaL_newstate();
	luaL_openlibs(L);

	if ( luaL_dostring(L, "print('Hello World'") )
	{
		printf("%s\n", lua_tostring(L, -1));
	}

	lua_close(L);
}

```

その後、「Source.cpp」と同じフォルダに、Luaソースコードのsrcディレクトリから以下のものをコピーする

+ lualib.h
+ luaconf.h
+ lua.hpp
+ lua.h
+ lauxlib.h
+ lua5.3.0-static.lib

ビルドして実行し、Hello Worldが出ればOK

参考: WindowsでVisual StudioでLua
http://tima620.hatenablog.com/entry/2014/03/07/051052

#メモ

```
'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
```

が出た場合、とりあえずReleaseビルドにすると治ることがある。
(Debugビルドでlibを生成していないためと思われる、が、一度Releaseビルドにすると、Debugビルドに切り替えてもエラーが出なくなる。)

#その他
Luaの実行環境を作りたい人はこっち
http://qiita.com/gpsnmeajp/items/486a77d3c3e92e61ed7c

#リンク

参考: 第 5 回: Lua を組み込み用の言語として利用する方法 (関数編)
http://www.ie.u-ryukyu.ac.jp/~e085739/lua.hajime.5.html
mimesis使ってみた

# [mimesis](https://github.com/lk-geimfari/mimesis)
テストデータ作成ライブラリ。
聞きなれない単語だけど、「擬態」とかそういう意味があるらしい。
fakerとかも有名だけど、fakerよりも高速らしい。

# install
```py
pip install mimesis
```
# usage
プロバイダーからテストデータを作成するのが基本。
プロバイダーには、人に関するもの(Personal)、住所に関するもの(Address)、食べ物に関するもの(Food)など結構たくさん種類がある。

## 基本的な使い方
```py3
from mimesis import Personal

# プロバイダにロケールを指定してインスタンス作成
personal = Personal(locale='ja')

# プロバイダからデータを取得
print(personal.full_name(gender='male'))
```

## Genericを使う
Genericは複数のプロバイダを使用するときに、いちいちプロバイダごとにロケール指定してインスタンスを作成するのが面倒なときに使える。

```py3
from mimesis import Generic

generic = Generic(locale='ja')

# Genericを通してプロバイダからテストデータを作成する
print(generic.personal.full_name())
```

## Schemaを使う
Schemaを使うとlistのオブジェクトとしてテストデータを作成してくれる。
Schema.loadメソッドに欲しいデータの形式を指定して使用する。

```py3
from mimesis.schema import Schema

schema = Schema('ja')
data = schema.load(schema={
    "name": "personal.full_name",
    "email": "personal.email"
}).create(itertions=2)
```

```json:結果
[{'name': '秋葉 高木', 'email': 'lorriane_2938@yandex.com'}, {'name': 'ちはる 市川', 'email': 'delisa_7119@gmail.com'}]
```

# まとめ
その他、いろんなプロバイダがあるので普通のテストデータ作るには機能としては十分かと。
ただ、本家サイトのドキュメントが貧弱なんでフル機能使おうと思ったらコード読まないといけないかも。
テキストに関するプロバイダText.sentenceとか、なぜか歴史系の文章返してきて面白い・・・
springのxml設定ファイルのbean定義を別のxmlで上書き

springの[ClassPathXmlApplicationContext](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/support/ClassPathXmlApplicationContext.html)等はjavadocにあるように、複数のbean定義を指定する場合は後のbean定義がそれ以前のものを上書きする、とある。

```xml:src.xml
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="str" class="java.lang.String">
		<constructor-arg value="aaa">
		</constructor-arg>
	</bean>
</beans>
```

```xml:overwrite.xml
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="str" class="java.lang.String">
		<constructor-arg value="bbb">
		</constructor-arg>
	</bean>
</beans>
```

```java
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class XMLConfOverwrite {

	public static void main(String[] args) {
		
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("src.xml");
		System.out.println(ctx.getBean("str"));//aaa
		
		ClassPathXmlApplicationContext ctx2 = new ClassPathXmlApplicationContext("src.xml", "overwrite.xml");
		System.out.println(ctx2.getBean("str"));//bbb
	}

}
```
xibを使ったCustomView

# やり方
<img width="948" alt="skitch.png" src="https://qiita-image-store.s3.amazonaws.com/0/56557/dc0443e1-ed99-7e08-1411-d959127875cc.png">
<img width="825" alt="skitch (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/56557/39599ad5-e125-7453-e917-32907bd381eb.png">


```swift
import UIKit
@IBDesignable
class CustomView: UIView {
  @IBOutlet weak var aView: UIView!
  override init(frame: CGRect) {
    super.init(frame: frame)
      loadXib()
  }
  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    loadXib()
  }
  // 初期化
  fileprivate func loadXib() {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: "CustomView", bundle: bundle)
    let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
    addSubview(view)
    view.translatesAutoresizingMaskIntoConstraints = false
    let bindings = ["view": view]
  
  addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|", options:NSLayoutFormatOptions(rawValue: 0), metrics:nil, views: bindings))
  
  addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|", options:NSLayoutFormatOptions(rawValue: 0), metrics:nil, views: bindings))
  }
  // Xib読み込み時に呼ばれる（ViewControllerのviewDidLoad的なもの）
  override func awakeFromNib() {
    print("awakeFromNib")
  }
  // AutoLayoutなどサブビューのレイアウト適用後に呼ばれる
  override func layoutSubviews() {
    print("layoutSubviews")
  }
}
```

# 参考
https://terakoya.site/ios_dic/ios-dic-customview/
議事録の書き方（時間をかけず、必要なことだけを記録しよう）

# 事前に過去の議事録を確認しておく
* 突然何も予備知識を持たずに参加しても話についていけない。
* 論点・争点を確認しておく
* 利害関係・対立関係を把握しておく
* 専門・特殊用語を確認しておく
GearVR Frameworkでカスタムシェーダーを使う

[GearVR Frameworkのカスタムシェーダーを使うやり方のWebページ](https://resources.samsungdevelopers.com/Gear_VR_and_Gear_360/GearVR_Framework_Project/060_Gear_VRf_Developer_Guide/020_GearVRf_Features/Phong_Shader_Template/GVRShaderTemplate_-_Creating_Custom_Shaders)の内容が古くてそのままやってもエラーで動かなかったのでいろいろ試行錯誤した結果、以下のようにしてうまくいきました。
ソースファイル中に定数文字列でシェーダーコードを書くと読みづらいのでリソースファイルから読み込むようにしました。

まず、res/raw以下にシェーダーを記述したファイルを作ります。

```glsl:res/raw/vertexshader.glsl
precision highp float;
in vec3 a_position;
uniform mat4 u_mvp;

void main()
{
    gl_Position = u_mvp * vec4(a_position, 1.0);
}
```

```glsl:res/raw/fragmentshader.glsl
precision mediump float;
uniform vec4 u_color;
out vec4 fragColor;

void main()
{
    fragColor = u_color;
}
```

次に、`GVRShaderTemplate`を継承したクラスを作り、コンストラクタの中で`setSegment("FragmentTemplate",...)`,`setSegment("VertexTemplate",...)`に各シェーダーのソースコードを渡すようにします。
`GVRShaderTemplate`のコンストラクタ引数には、このシェーダーが取りうるパラメーターを第一引数に、シェーダーのバージョンを第二引数に渡します。
リソースから文字列を読み込むのにKotlinの方が楽だったのでKotlinで実装しました。

```kotlin:ColorShader.kt
import android.content.Context
import org.gearvrf.GVRContext
import org.gearvrf.GVRShaderTemplate
import java.io.InputStream
import java.nio.charset.Charset

class ColorShader(gvr: GVRContext) : GVRShaderTemplate("int u_right", 300) {

    init {
        setSegment("FragmentTemplate", shaderSource(gvr.context, R.raw.fragmentshader))
        setSegment("VertexTemplate", shaderSource(gvr.context, R.raw.vertexshader))
    }

    private fun shaderSource(context: Context, rawRes: Int): String = readTextAndClose(context.resources.openRawResource(rawRes))

    private fun readTextAndClose(inputStream: InputStream, charset: Charset = Charsets.UTF_8): String {
        return inputStream.bufferedReader(charset).use { it.readText() }
    }
}
```

そして、このシェーダーを使って描画したいオブジェクトの`GVRRenderData`に、`setShaderTemplate()`で先ほど作ったクラスを渡します。

```kotlin
// Kotlin
sceneObject.renderData.setShaderTemplate(ColorShader::class.java)
```

```java
// Java
sceneObject.getRenderData().setShaderTemplate(ColorShader.class);
```

それから、このオブジェクトに適用するマテリアルはコンストラクタで`GVRMaterial(gvrContext, GVRMaterial.GVRShaderType.BeingGenerated.ID)`のようにして、シェーダーがまだ設定されていないことを明示することが推奨されています。
pprofでCPUプロファイリングができないバグの回避


## はじめに

`net/http/pprof` を使ってCPUプロファイリングをしようとしているのに、

```
profile is empty
```

とでて、プロファイリングできない。

pprof の使い方は

- [golang の net/http/pprof を触ってみたメモ](http://blog.livedoor.jp/sonots/archives/39879160.html)
- [Go pprof 入門編 (CPU Profile とコマンドラインツール)](http://klabgames.tech.blog.jp.klab.com/archives/pprof1-cpuprofile.html)

などを参考にしてください。

## これはプロファイリングできる

### コード

```go:main.go
package main

import (
	"log"
	"net/http"
	_ "net/http/pprof"
	"runtime"
)

func main() {
	runtime.SetBlockProfileRate(1)
	go func() {
		log.Println(http.ListenAndServe("0.0.0.0:6060", nil))
	}()

	go func() {
		var count int
		for {
			count++
		}
	}()
	var ch chan int
	<-ch
}
```

### コマンド

```bash
go build -o sample
./sample
```

別のターミナルにて

```bash
$ go tool pprof sample http://localhost:6060/debug/pprof/profile
Fetching profile from http://localhost:6060/debug/pprof/profile
Please wait... (30s)
Saved profile in /Users/hogehoge/pprof/pprof.sample.localhost:6060.samples.cpu.001.pb.gz
Entering interactive mode (type "help" for commands)
(pprof) top
25.32s of 25.34s total (99.92%)
Dropped 3 nodes (cum <= 0.13s)
      flat  flat%   sum%        cum   cum%
    23.82s 94.00% 94.00%     23.82s 94.00%  main.main.func2
     1.50s  5.92% 99.92%      1.50s  5.92%  runtime.usleep
         0     0% 99.92%     23.82s 94.00%  runtime.goexit
         0     0% 99.92%      1.52s  6.00%  runtime.mstart
         0     0% 99.92%      1.52s  6.00%  runtime.mstart1
         0     0% 99.92%      1.52s  6.00%  runtime.sysmon
(pprof)
```

ちゃんとプロファイリングできている。

## signal.Ignore() をかますと

### コード

```go:main.go
package main

import (
	"log"
	"net/http"
	_ "net/http/pprof"
	"os/signal"
	"runtime"
)

func main() {
	runtime.SetBlockProfileRate(1)
	go func() {
		log.Println(http.ListenAndServe("0.0.0.0:6060", nil))
	}()

	signal.Ignore() // <- 軽い気持ちで足してみる

	go func() {
		var count int
		for {
			count++
		}
	}()
	var ch chan int
	<-ch
}

```

### コマンド

同様にやると

```bash
$ go tool pprof sample http://localhost:6060/debug/pprof/profile
Fetching profile from http://localhost:6060/debug/pprof/profile
Please wait... (30s)
Saved profile in /Users/hogehoge/pprof/pprof.sample.localhost:6060.samples.cpu.002.pb.gz
Entering interactive mode (type "help" for commands)
(pprof) top
profile is empty # <- ??????????
(pprof)
```

`profile is empty` となってプロファイリングできていない。

## 結論

`pprof`を使うときは `signal.Ignore()` をコメントアウトしよう。

なんでや
ScriptGate に Eval を実装した話(Windows で JavaScript の戻値を取る)

#ScriptGate
[一個前の記事](http://qiita.com/pik/items/dacb1be7ad528d27803a)で ScriptGate という JavaScript と Delphi の相互呼び出しを実現するライブラリを説明しました。
今回は、そこに Eval を追加しました。

# Eval
元々 ScriptGate では JavaScript の関数が呼べるため、以下のようにすれば JavaScript の式を評価できました。

```delphi
FScriptGate.CallScript('eval("alert(\"test\")")');
```

これを動かしてみると… macOS, iOS, Android は正しく動作しましたが Windows だけ動作しませんでした。

## Windows で何故動かないか

ScriptGate では呼び出した JavaScript の関数の戻値を取得できます。
そのため Windows では一般的な [IHTMLWindow2.execScript](https://msdn.microsoft.com/ja-jp/library/hh869591.aspx) を使っていません。

その代わり [IHTMLDocument2.Script](https://msdn.microsoft.com/ja-jp/library/aa752604.aspx) を使っています。

ここには関数名とパラメータを分けて渡す必要があるため、内部で TStringList.CommaText を使って引数をパーシングしました。
そのため、"" が付いているとパラメータを分けられず、実行が失敗していました。

# Eval の追加
上記のように Windows だけ動作が変わってしまうため、Eval を作る事にし実装しました。

```delphi
TScriptGate.Eval(
  const iScript: String;
  const iResultProc: TScriptGateResultProc);
```

第一引数は評価したい式、第二引数は式の戻り値を取得するハンドラです。

例えば、下記の様にすると HTML のソースが取得できます。

```Delphi
FScriptGate.Eval(
  'document.getElementsByTagName("html")[0].outerHTML', 
  procedure (const iResult: String)
  begin
    ShowMessage(iResult); // HTML のソースが入っている
  end
);
```


# Windows で JavaScript 関数の戻り値を取る

Windows で JavaScript 関数の戻り値を取るのは非常に面倒くさい上にウェブに良い文献がありません（特に Delphi ユーザー向けには）。

そこで、Windows で JavaScript 関数の戻り値を取得する方法を簡単に解説します。
[詳しくは、ソース](https://bitbucket.org/freeonterminate/scriptgate/src/933b256ce125b850ad6b8ad9760789d1835cd8ce/Source/SG.ScriptGate.Win.pas)を見て欲しいのですが、簡単な手順は下記の通りです。

##1.関数名とパラメータを別々に用意する
例えば 

```html
<script>
  function Foo(param1) {...}

  Foo("bar");
</script>
```

というような関数なら "Foo" と渡す引数 "bar" を分解して別々に用意しておきます。

##2.DispID の取得
後述の Scrint.Invoke では ID でオブジェクトを指定するため関数の ID が必要です。

Foo 関数の ID を取得するには、下記の様にします。

```delphi
IHTMLDocument.Script.GetIdsOfNames(
  GUID_NULL,
  @Name, // 関数名へのポインタ、ここでは Name には 'Foo' が入っている
  1,
  LOCALE_SYSTEM_DEFAULT,
  @DispID // 結果を受け取る DispID は Integer 型
)
```

これで、Foo 関数を ID で指定できるようになりました。

##3.パラメータ用のメモリを確保
パラメータは TDispParams として渡します。
TDispParams.cArgs に引数の個数を指定し、TDispParams.rgvarg は cArgs * SizeOf(TVariantArg) 分メモリを確保します。

rgvarg は配列なので下記の様にループを回して値を入れていきます。

```delphi
var
  Params: TArray<OleVariant>;
begin
  // Params に引数を入れるコードなど省略

  // メモリを確保
  GetMem(DispParams.rgvarg, DispParams.cArgs * SizeOf(TVariantArg));

  // 値を代入
  for i := 0 to High(Params) do
  begin
    DispParams.rgvarg[i].vt := varVariant or varByRef;
    TVarData(DispParams.rgvarg[i]).VPointer := @Params[i];
  end;
end;
```
ここで、注意したいのは渡す **引数の順序が逆**、ということです。
**引数の順序が逆**です。
大切なのことなので、もう一度いいました。

例えば引数に Foo(1, 2); と渡す場合は 2, 1 と rgvarg に入れなければいけません。

これについては、サンプルコードの多くが１つの引数のみを扱っており、ネット上のどこにも書いていないため非常に苦労しました。

##4.実行

あとは、関数名、引数、戻り値を受け取る OleVariant 型の変数を指定して Invoke するだけです。

```delphi
if
  Doc.Script.Invoke(
    DispIDs,    // Foo の ID
    GUID_NULL,
    0,
    DISPATCH_METHOD,
    DispParams, // パラメータ配列
    @V,         // 結果を受け取る OleVariant
    @ExcepInfo, // 実行時の例外を受け取る EXECPINFO 構造体
    nil)
  = S_OK
then
  CallResult(V); // OleVariant は String にそのまま代入可能
```

ざっくり説明すると、このような感じです。

#まとめ
Android が一番の鬼門かと思いきや Windows もなかなか大変でした。
Pythonで個人的によく使う正規表現モジュールの機能

ちょくちょく忘れるのですが，[公式ドキュメント](https://docs.python.jp/3/library/re.html)は文量多すぎて，毎回調べるのが辛くなってきたので，備忘録的なものを．必要に応じて付け足していく予定．


```python
import re
```

ちなみに，`from sympy import *` とすると，実部を返す`re`関数と被るので注意．

## マッチオブジェクト

マッチした部分を取り出すには……


```python
filename = 'Back_in_the_U.S.S.R.m4a'
m = re.match(r'([\w\.-]+?)\.(\w+)$', filename)
print(m.group(0)) #マッチした箇所全体(m.group()と等価?)
print(m.group(1)) #1番目のグループ
print(m.group(2)) #2番目のグループ
print(m.groups()) #グループ全体をタプルで
```

```:out
Back_in_the_U.S.S.R.m4a
Back_in_the_U.S.S.R
m4a
('Back_in_the_U.S.S.R', 'm4a')
```

`(?P<groupname> )` でグループに名前をつけて，キーワードからアクセス．


```python
filename = 'Back_in_the_U.S.S.R.m4a'
m = re.match(r'(?P<basename>[\w\.]+?)\.(?P<ext>\w+)$', filename)
print(m.group('basename')) #(?P<basename> )にマッチした文字列
print(m.group('ext')) #(?P<ext> )にマッチした文字列
print(m.groupdict()) #名前付きのグループを辞書で
```

```:out
Back_in_the_U.S.S.R
m4a
{'basename': 'Back_in_the_U.S.S.R', 'ext': 'm4a'}
```

# マッチした文字列を置換に利用

例えば $\LaTeX$ の `\ruby{帰謬法}{きびゅうほう}` を `<ruby>帰謬法<rt>きびゅうほう</rt></ruby>` に置換するには……


```python
print(re.sub(r'\\ruby\{(\w+)\}\{(\w+)\}',
             r'<ruby>\1<rt>\2</rt></ruby>',
             r'\ruby{帰謬法}{きびゅうほう}'))
```

```:out
<ruby>帰謬法<rt>きびゅうほう</rt></ruby>
```

`(?P<groupname> )` で名前を付けたグループを使う参照する場合は `\g<groupname>` とします．

```python
print(re.sub(r'\\ruby\{(?P<rb>\w+)\}\{(?P<rt>\w+)\}',
             r'<ruby>\g<rb><rt>\g<rt></rt></ruby>',
             r'\ruby{帰謬法}{きびゅうほう}'))
```

```:out
<ruby>帰謬法<rt>きびゅうほう</rt></ruby>
```

htmlのタグとややこしいですが，同様の結果が返ってきました．


# マッチした部分すべてをリストに

HTMLの`em`要素または`strong`要素の内容を全て取り出すには……


```python
src = r'<em>選択公理</em>を仮定すると，任意の集合に<strong>整列順序を入れられる</strong>．'
re.findall(r'<(em|strong)>(.*?)</\1>', src)
```

```:out
[('em', '選択公理'), ('strong', '整列順序を入れられる')]
```


## マッチした箇所を関数に渡して置換

テキスト内のなんとかcmをなんとかmに直すには……


```python
def cm2m(m): #マッチオブジェクトを引数とする関数を用意
    value = m.group(1)
    return str(float(value)/100) + 'm'
print(re.sub(r'(\d+)cm', cm2m, '271cm + 314cm は 585cm です．'))
```

```:out
2.71m + 3.14m は 5.85m です．
```

わざわざ関数を定義するまでもない単純な処理の場合はlambdaがいいのかなと．


```python
print(re.sub(r'(\d+)cm', lambda m: str(float(m.group(1))/100) + 'm', '271cm + 314cm は 585cm です．'))
```

```:out
2.71m + 3.14m は 5.85m です．
```

## ネストした括弧

再帰を用います．しかし，標準の`re`にはない機能なので，`regex`を．インストールされてなければ `pip install regex` などで．以下は $\LaTeX$ の `\frac{ }{ }` にマッチします（多分）．


```python
import regex
pattern_frac = r'\\frac(?<rec>\{(?:[^{}]+|(?&rec))*\}){2}'
m = regex.search(pattern_frac, r'1 + \frac{\int_{a}^{b} f(x)\,dx }{\sum_{k=1}^{n}a_{k}}')
print(m.group())
```

```:out
\frac{\int_{a}^{b} f(x)\,dx }{\sum_{k=1}^{n}a_{k}}
```
Zabbix 3.4でdocker上のZabbix Serverから監視しやすくなったよ

# 要点

* 同一ホストにおいて、Zabbix Serverをコンテナで動かし、Agentはホストに直接インストールしている構成
* Zabbix 3.4から`zabbix_agentd.conf`の`Server`にCIDR形式(192.168.10.0/24など)が指定できるようになった
* docker上のZabbix ServerのIPアドレスが起動するたびに変わっても大丈夫

## 背景

Zabbix Agentをコンテナとして起動すると、欲しい情報(ホストのネットワークI/Oなど)が取得できないため、Agentはホストに直接インストールして動かしている。
Zabbix 3.2までは`zabbix_agentd.conf`の`Server`には個別にZabbix ServerのIPアドレスを指定する必要があったため、docker上でZabbix Serverを動かしている場合、コンテナを再起動するたびにIPを調べて再設定する必要があった。

## Zabbix Agent 3.4のインストール

Ubuntu Server 16.04 (64bit)の場合。

ウェブサイトからdebパッケージをダウンロード。
私の環境では`libcurl3`が入っていないと怒られたので追加でインストール。

~~~bash
sudo apt-get install libcurl3
wget http://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix/zabbix-agent_3.4.1-1+xenial_amd64.deb
sudo dpkg -i zabbix-agent_3.4.1-1+xenial_amd64.deb

sudo systemctl enable zabbix-agent.service
sudo systemctl start zabbix-agent.service
~~~

dockerコンテナが使用するIPの範囲を`zabbix_agentd.conf`に設定。
docker networkの設定次第ではもっと狭い範囲でも可。

~~~:/etc/zabbix/zabbix_agentd.conf
Server=172.0.0.0/8
~~~

## Zabbix Server 3.4 on docker

タイムゾーンを設定する環境変数が、ドキュメント通り`TZ`から`PHP_TZ`になっている。
気づかずに起動して謎の6時間のずれに悩んだ。

~~~yaml:docker-compose.yaml
version: '2'
services:
  mysql:
    image: mysql:5.7
    restart: always
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - ./data/mysql:/var/lib/mysql
    expose:
      - "3306"
    environment:
      MYSQL_ROOT_PASSWORD: docker
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix

  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-3.4-latest
    restart: always
    volumes:
      - ./data/zabbix:/var/lib/zabbix
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
    ports:
      - "10051:10051"
    depends_on:
      - mysql

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:alpine-3.4-latest
    restart: always
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: Asia/Tokyo
    ports:
      - "80:80"
    depends_on:
      - mysql
      - zabbix-server
~~~

この`docker-compose.yaml`は[dockerでzabbixを動かす](http://take4.hatenablog.com/entry/2016/10/17/160924)を参考にした。

~~~bash
docker-compose up -d
~~~

3.2からアップデートすると、初回にデータベースの変換作業が入るので少し待とう。

## 2020.07.07 追記

Zabbix 4.4のどこかのバージョンから、`zabbix-web-nginx-mysql`コンテナの待受ポートが変更になっているので、上記の`docker-compose.yaml`そのままでは動かなくなってしまった。下記のようにポートを変更する必要がある。

~~~yaml:(4.4以降)
  ports:
    - "80:8080"
~~~
[Unity] ステンシルバッファをImageEffectで利用するシンプルなサンプル

![unity.jpg](https://qiita-image-store.s3.amazonaws.com/0/127402/be77387a-1047-6ad1-cd61-e9fda69afcd7.jpeg)


ImageEffectで、ステンシルバッファを取り出して利用するシンプルなサンプルを掲載します。

# ステンシルを書き込むシェーダー
このシェーダー(マテリアル)をアタッチしたオブジェクトの描画部分をステンシルバッファに書き込みます。
フラグメントシェーダーで赤色を出力していますが、
後ほどImageEffectで上書きされるので、discardしない限り何色でも大丈夫です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/127402/f01dd12d-f8f7-7d11-1fd6-62ae76e1dd1f.jpeg" width=50%>

```hlsl:WriteStencil.shader
Shader "Stencil/WriteStencil" {
	Properties{
		_StencilRef("Stencil Reference", Int) = 1
	}
	SubShader{
		Tags{ "RenderType" = "Opaque" "Queue" = "Geometry" }

		Stencil{
			Ref [_StencilRef]
			Comp Always
			Pass Replace
		}

		Pass{

			CGPROGRAM

			#pragma target 3.0
			#pragma vertex vert
			#pragma fragment frag

			
			
			struct appdata {
				float4 vertex : POSITION;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
			};
			
			v2f vert(appdata v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				return o;
			}
			
			half4 frag(v2f i) : SV_Target{
				return half4(1,0,0,1);
			}
			ENDCG
		}
	}
}
```

# ステンシルバッファを利用するImageEffect

## スクリプト

**`[ImageEffectOpaque]`を指定しなければ、ステンシルバッファを取り出せません**ので注意してください。

```csharp:StencilPicker.cs
using UnityEngine;

public class StencilPicker : MonoBehaviour {

    [SerializeField] private Shader shader;

    private Material material;

    void Awake() {
        if (material == null) {
            material = new Material(shader);
        }
    }

    [ImageEffectOpaque] // !!!!!!!!!!!!!!
    void OnRenderImage(RenderTexture source, RenderTexture destination) {
        Graphics.Blit(source, destination, material);
    }
}

```

## シェーダー
市松模様を描くシェーダーです。
最終的に、ステンシルの書き込まれている領域でくりぬかれます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/127402/19da1b60-95e4-3271-bf19-adc8bcc40938.jpeg" width=50%>

```hlsl:StencilPicker.shader
Shader "ImageEffect/StencilPicker" {
	Properties {
		_MainTex ("Texture", 2D) = "white" {}
		_StencilRef("Stencil Reference", Int) = 1
	}
	SubShader {
	
		Cull Off
		ZWrite Off
		ZTest Always
		
		Stencil{
			Ref [_StencilRef]
			Comp Equal
		}

		Pass {

			CGPROGRAM
			
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata {
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f {
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			v2f vert (appdata v) {
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			sampler2D _MainTex;

			fixed4 frag (v2f i) : SV_Target {
				fixed4 col = fixed4(frac(i.uv * float2(16, 9)),1,1); // 市松模様
				return col;
			}
			ENDCG
		}
	}
}
```

# 結果
ステンシルのリファレンス値を合わせてレンダリングを行えば、以下のような結果になります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/127402/454613c8-5fb1-1075-fdc7-697b16c84092.jpeg" width=50%>
Eclipseでテーマを利用しないをチェックしたら設定が開けなくなった場合の対応


## 環境情報

* OS:Windows10 Creators Update
* Eclipse Oxygen 
* Darkest Darkテーマ
* Darkest Darkテーマ・アイコン・デザイナー

それ以外にもプラグイン多数

## 問題

Eclipse でテーマを設定するpluginをインストールしている状況で、
テーマを利用しない　にチェックを入れて、Eclipse再起動を行うと
再起動後に設定メニューが動かなくなる（設定項目を選んでも右側のペインに何も表示されない）

## 原因

ログ等も出力されていないようなので、原因は不明
直前に実施した操作が、上記であり、元に戻すことで復旧したことから
本件が、トリガーになっていることは確実。
ただし、追加しているプラグインの何が直接関係しているか断定はできていない。
テーマに関するプラグインについては、上記記載の通りであり、このプラグインに関する
設定や情報が、テーマを利用しないという設定に変えることにより悪さをして表示が
おかしくなっている可能性が高い。

## 対応

以下の設定ファイルに、テーマを利用しない　というプロパティの値が書き込まれているので
falseを　trueに戻すことで解決する（そもそも、テーマを利用しない　状態にできていないので
当初の要件は満たせていないが、復旧という意味ではこれで可能）

.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.e4.ui.workbench.renderers.swt.prefs

~~~
eclipse.preferences.version=1
enableMRU=true
themeEnabled=false ⇒ true
~~~
Glideを使って、 Goプロジェクトのパッケージバージョンを管理しよう！

こんにちは！エンジニアのギです。
今回はGoプロジェクトのパッケージバージョンの管理に関して、Glideというツールをご紹介いたします。

## Goのデフォルトパッケージ管理を使うときの問題
Go言語には標準で `go get` という依存関係を解消する便利なコマンドが含まれていて、このコマンドを使うことでリポジトリから１コマンドで簡単にすべての依存パッケージをダウンロードし導入できるようになっています。しかし、このコマンドを使うと、固定なバージョンを設定できないし、依存パッケージの最新バージョンしか導入できないという悩ましい問題があります。

## パッケージのバージョン固定のいくつかツールまとめ
パッケージのバージョン固定の管理ツールはいろんなものがありますが、GitHubのStar数が高いやつをいくつかまとました。

URL | Star数　| 参考
----| -------| -----
[dep](https://github.com/golang/dep) | 4399 | 公式ツール。Alphaバージョンなう
[manul](https://github.com/kovetskiy/manul) | 634 | 
[godep](https://github.com/tools/godep) | 4863 | 
[govendor](https://github.com/kardianos/govendor) | 2350 | 
[gvt](https://github.com/FiloSottile/gvt) | 678 | 
[govend](https://github.com/govend/govend) | 223 | 
[glide](https://github.com/Masterminds/glide) | 5211 | php composerのようなツール
[gom](https://github.com/mattn/gom) | 1276 | 

私はPHPの開発に慣れているので、composerに似たglideというツールを使って開発するのが楽です。
ぎっとはぶでのGit Hub star数も多いので、glideに慣れている方もいると思います。

## [Glide](https://glide.sh/)を使ってみよう

### Glideをインストールする方法

LINUXとかMACなどで以下のコマンドを実行すると、インストールできます。

```
curl https://glide.sh/get | sh
```

Macでは、Homebrewでもインストールできます

```
brew update
brew install glide
```

### パッケージ定義ファイルを作成する方法
Glideは、依存関係の定義ファイルをYAMLで記述します。プロジェクトのルートに以下コマンドを実行すると、定義ファイルが作成されます。

```
glide init
```

### パッケージ定義の設定
上記のコマンドを実行すると、glide.yamlファイルが生成されます。このファイルに一覧パッケージを定義できます。バージョン固定もできます

```
- package: github.com/labstack/echo
  version: ^3.2.1
```

### パッケージの取得と更新
```
glide install
```

### 新しいパッケージの追加
```
glide get github.com/foo/bar#^1.2.3
```

## 最後に
以上です。Glideを軽く紹介いたしました。

Goプロジェクトのパッケージのバージョンを固定したい方は是非Glideを試してみてください！
ここがまだ残念だよ！Affinity Designer@Webデザイン

Fireworks難民の私がたどり着いたAffinity Designer。
その操作感に感動して飛びついて、Webデザイン業務で使い倒してみました。
素晴らしい点は、ググったら色んな人の感想が色々出てくるし、概ね同意。

逆に、実践で使ってみてここが残念だった！って点をメモとして残しておきます。
機能を使いこなしてるわけではないので、あくまで気づいた範囲で。

環境：Windows7 64bit

# 残念！

## フォントの選択がめちゃくちゃ重い
テキストオブジェクトを選択してフォント選択プルダウンを押すと…10秒以上固まる。。
大量のフォントを入れてるつもりは無いんですが…
個人的には基本システムフォントしか使わないので一度選べばあとはコピペでカバーするんですが、ロゴ制作などは非効率極まりないので別ソフトで行ったほうがよいですね。

## シンボル関連の機能がバギー
発生条件がよくわからないのですが、よくクラッシュ＆バグ起こります。
シンボルの入れ子は出来るけれど、危険。
シンボルを複数アートボードでコピペして使いまわしていると、含まれるオブジェクトが遠くにすっ飛んでったりします。。
最悪の場合コピペした時クラッシュします。
元データを別で作っておいて、それをラスタライズしてからシンボル化する事でバグは減りました（0にはならない謎）。

## アートボードがバギー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69733/8de180dc-33b0-e739-9cf6-5940870073b7.png)

アートボードを削除・移動・変形するとクラッシュする事があります。
15個くらいアートボードを作ってたんですが、編集すると必ずクラッシュするアートボードが2個ほど現れました。
アートボード上のオブジェクトを全て消し、影響するのはアートボードのみとした上で操作してもクラッシュ。
一度こうなるとクラッシュ100％です。

## オブジェクトのコピペがバギー
何故でしょうか。
Ctrl+c,Ctrl+vでコピペしたグループオブジェクトが、勝手にシンボル化されてることがあります。。
例えば、装飾付きタイトルをコピペして文字を変えて量産するという事はよくあると思うんですが、コピペ元のタイトルまで変わってしまってることが！
変えたつもりの無い箇所が変わってるって事でかなり厄介です。
その場合、レイヤーパネルを見るとオブジェクトがシンボル扱い（オレンジのマークが付く）になっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69733/7d288575-f25a-d369-3d61-c540d1637d60.png)
コピペは非常に頻繁に行うので、いちいちシンボル化されてるかチェックするのも面倒。
というわけで早く直ってほしいです。

## ファイルが重くなると動作も重くなる
1操作1操作が重くなる。オブジェクトの移動ですら1,2秒かかるように。
Affinity Designerの良さがなくなってしまいます。
（ただPhotoshopよりはマシと思ってしまう。）

## クラッシュすると、作業がふっとぶ
クラッシュにも2タイプあって、リカバリーファイルが残されている時とない時があります。
残されてないほうが、体感としては多いかな。
まぁ、元Fireworksユーザなので保存はマメにしております…笑
とはいえ、ピクセル単位の調整や微妙なカラーの調整作業がふっとんだ時とか、辛いですね。

## 読み取り専用ファイルを編集して保存しても何も通知が無い
何かの拍子にファイルが読み取り専用になってしまったのですが、編集後Ctrl+s押しても何もエラーが出ないんですよね。
保存されてると思いこんで作業してソフトを閉じたら、数時間分の作業が全く残っていない！という大失態を犯してしまいました。


# 要望

## 背景パターン機能が欲しい
背景に柄を敷きたい時は一枚画像にしてマスクする必要があります。
ちょっとメンドイ。

## ページ機能が欲しい
Fireworksユーザはやっぱりページ機能が好き。。
Webページのデザインはアートボードで俯瞰するよりもページが管理しやすいと思う。

# 最後に
致命的な残念ポイントがあるので、バージョンUPするまでは、使用を控えようと思います。
バージョンアップでこれら残念ポイントが早く解決されることを切に願っています。
ただ、それでもPhotoshopやIllustratorよりも気に入ってるので、期待しています！
aws cloudformation deployがいつのまにかロール指定とデフォルトパラメータに対応してた



自分みたいに気づいていない人もいると思うので、残しておく

# ロール指定に対応

--role-arn指定できるようになった
おかげでpackage後create-change-set/execute-change-setをしなくて良くなって嬉しい
--notification-arnsにも対応してる

新しいバージョン

```sh
$ aws --version
aws-cli/1.11.141 Python/3.4.2 Darwin/16.7.0 botocore/1.6.8
$ aws cloudformation deploy help | head -30
DEPLOY()                                                              DEPLOY()



NAME
       deploy -

DESCRIPTION
       Deploys  the specified AWS CloudFormation template by creating and then
       executing a change set. The command terminates after AWS CloudFormation
       executes  the change set. If you want to view the change set before AWS
       CloudFormation executes it, use the --no-execute-changeset flag.

       To update a stack, specify the name of an existing stack. To  create  a
       new stack, specify a new stack name.

SYNOPSIS
            deploy
          --template-file <value>
          --stack-name <value>
          [--parameter-overrides <value> [<value>...]]
          [--capabilities <value> [<value>...]]
          [--no-execute-changeset]
          [--role-arn <value>]
          [--notification-arns <value> [<value>...]]
```

古いバージョン

```sh
$ aws --version
aws-cli/1.11.128 Python/3.4.2 Darwin/16.7.0 botocore/1.5.91
$ aws cloudformation deploy help | head -30
DEPLOY()                                                              DEPLOY()



NAME
       deploy -

DESCRIPTION
       Deploys  the specified AWS CloudFormation template by creating and then
       executing a change set. The command terminates after AWS CloudFormation
       executes  the change set. If you want to view the change set before AWS
       CloudFormation executes it, use the --no-execute-changeset flag.

       To update a stack, specify the name of an existing stack. To  create  a
       new stack, specify a new stack name.

SYNOPSIS
            deploy
          --template-file <value>
          --stack-name <value>
          [--parameter-overrides <value> [<value>...]]
          [--capabilities <value> [<value>...]]
          [--no-execute-changeset]
```


# デフォルトパラメータに対応

ちょっと前はエラー出てたので諦めてたんだけど、久々に試したらできた
デフォルト値のあるテンプレートでcreate-stack/create-change-setを使わずに
deployがやりやすくなって嬉しい

テスト用テンプレート

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  BucketName:
    Type: String
    Default: "example-bucket-name-1234567890"
Resources:
  S3:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref BucketName

```

新しいバージョン

```sh
$ aws --version
aws-cli/1.11.141 Python/3.4.2 Darwin/16.7.0 botocore/1.6.8
$ aws cloudformation deploy --template-file createbucket.yml --stack-name testcreatebucket
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - testcreatebucket
```

古いバージョン

```sh
$ aws --version
aws-cli/1.11.19 Python/3.4.2 Darwin/16.7.0 botocore/1.4.76
$ aws cloudformation deploy --template-file createbucket.yml --stack-name testcreatebucket

An error occurred (ValidationError) when calling the CreateChangeSet operation: Cannot specify UsePreviousValue on Parameters when ChangeSetType is CREATE
```
jsのsort関数（自分用解説）

#sort関数とは
配列をアルファベット順に並べ替える関数。sortの実行後は新しい配列が返されるのではなく、対象の配列が書き換えられる。

#デフォルトでは文字列で比較する
sort関数のデフォルトでは要素を文字列に変換して文字コード順に並び替える。

```javascript
var array = [1975,11,20];

array.sort();

// [11, 1975, 20]
console.log(array);
```

文字と数字が混在する場合、「数字→ローマ字→日本語」の順となる。


```javascript
var array = ["お誕生日",1975,11,"デイヴィー",20,"Havok"];

array.sort();

// [11, 1975, 20, "Havok", "お誕生日", "デイヴィー"]
console.log(array);
```


#数値の昇順・降順でソートするには
sort関数は引数に関数を指定でき、関数でソートのルールを定義できる。
関数を指定すると、配列の要素2つを取り出して関数に引数として渡してソートする。

- 関数の戻り値が正の時　→　引数1を引数2の後ろに並べ替え。
- 関数の戻り値が負の時　→　引数1を引数2の前に並べ替え。
- 関数の戻り値が0の時　→　何もしない。

##昇順
```javascript:昇順（第1引数と第2引数の差）
var array = [1975,11,20];

array.sort(
  function(a,b) {
    // 戻り値が正（a-bの差が正）のとき、aをbの後ろに並べ替え
    // 戻り値が負（a-bの差が負）のとき、aをbの前に並べ替え
    return a - b;
  }
);

// [11, 20, 1975]
console.log(array);
```

```javascript:昇順（第1引数と第2引数を比較）
var array = [1975,11,20];

array.sort(
  function(a,b) {
    if (a > b){
       return 1;
    }else if (a < b){
       return -1;
    }else{
       return 0;
    }
  }
);

// [11, 20, 1975]
console.log(array);
```

```javascript:昇順(三項演算子)
var array = [1975,11,20];

array.sort(
  function(a,b){
    return (a < b ? -1 : 1);
  }
);

// [11, 20, 1975]
console.log(array);
```

##降順
```javascript:降順（第1引数と第2引数の差）
var array = [1975,11,20];

array.sort(
  function(a,b) {
    // 戻り値が正（b-aの差が正）のとき、aをbの前に並べ替え
    // 戻り値が負（b-aの差が負）のとき、aをbの後ろ並べ替え
    return b - a;
  }
);

// [1975, 20, 11]
console.log(array);
```

```javascript:降順（第1引数と第2引数を比較）
var array = [1975,11,20];

array.sort(
  function(a,b) {
    if (a < b){
       return 1;
    }else if (a > b){ 
       return -1;
    }else{
       return 0;
    }
  }
);

// [1975, 20, 11]
console.log(array);
```

```javascript:降順(三項演算子)
var array = [1975,11,20];

array.sort(
  function(a,b){
    return (a < b ? 1 : -1);
  }
);

// [1975, 20, 11]
console.log(array);
```
##逆順（おまけ）
```javascript
var array = [1975,11,20];

array.sort(
  function(a,b) {
    return 1;
  }
);

// [20, 11, 1975]
console.log(array);
```

#参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
https://www.ajaxtower.jp/js/array_class/index6.html
https://so-zou.jp/web-app/tech/programming/javascript/grammar/array/#no21
Bluemix Infrastructure API(Virtual_Guestサービス)

Virtual_Guestサービス・メゾッド
https://softlayer.github.io/reference/services/SoftLayer_Virtual_Guest/
 
Virtual_Guestデータ型
 https://softlayer.github.io/reference/datatypes/SoftLayer_Virtual_Guest/

複数の仮想マシンの作成
createObject　http://sldn.softlayer.com/reference/services/softlayer_virtual_guest/createobject

複数の仮想マシンを削除
deleteObject http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest/deleteObject

コード 

```py

# SoftLayerモジュールを読み込む
import SoftLayer

# ppritモジュールからpprint関数を読み込む
from pprint import pprint

# ポータルのアカウント > ユーザ > ユーザー・プロファイルの編集でAPIアクセス情報を確認し入力
username = ''
key = ''

# 認証情報を渡すことで他のメゾッドで要求されるauthenticate引数は不要に
client = SoftLayer.Client(username=username, api_key=key)

# 空のリスト(SoftLayer_Virtual_Guestクラス追加用)
virtualgest = []

# ホスト名のリスト
hostName = ["ICP-Master", "ICP-Worker", "ICP-Proxy", "ICP-Management"]

# ドメイン名のリスト
domainName = ["tokyo02.com", "tokyo02.com", "tokyo02.com", "tokyo02.com"]

# データセンターの文字列リスト
datacenter = ["dal05", "lon04", "tok02", "wdc01", "mon01", "hkg02"] 
# 2017/9/1
# 'ams01', 'ams03', 'che01', 'dal01', 'dal10', 'dal12', 'dal13', 'dal02',
# 'dal05', 'dal06', 'dal07', 'dal09', 'fra02', 'hkg02', 'hou02', 'lon02', 'lon04', 'lon06',
# 'mel01', 'mex01', 'mil01', 'mon01', 'osl01', 'par01', 'sjc01', 'sjc03', 'sjc04', 'sao01',
# 'sea01', 'seo01', 'sng01', 'syd01', 'syd04', 'tok02', 'tor01', 'wdc01', 'wdc04', 'wdc06',
# 'wdc07'

# OSの文字列リスト
osName = ["WIN_LATEST", "CORE_LATEST", "REDHAT_LATEST", "CENT_LATEST", "DEBIAN_LATEST", "UBUNTU_LATEST"]

# 作成する仮想マシン数
machineNum = 3

# 複数の仮想マシンを作成
if machineNum < 4:
    for i in range(machineNum):
        virtualgest.append(client['Virtual_Guest'].createObject({
            'hostname': hostName[i],
            'domain': domainName[i],
            'startCpus': 1,
            'maxMemory': 1,
            'hourlyBillingFlag': 'true',
            'operatingSystemReferenceCode': osName[i],
            'localDiskFlag': 'false',
            'maxCpuUnits': 'CORE',      
            'datacenter': {'name': '%s' % datacenter[i]}
        }))

# 作成した仮想マシンの情報を表示
pprint(virtualgest)

# 複数の仮想マシンを削除
for i in range(len(virtualgest)):
    results = client['Virtual_Guest'].deleteObject(id = virtualgest[i]['id'])
    print("%s %s" % (results, virtualgest[i]['hostname']))
```


アカウント登録(1ヶ月間無料トライアル付き: 要クレジット登録) 
https://ibm.biz/Bdji5q
Linux Mintに手っ取り早く日本語入力を導入

Linux Mint(18.1)の日本語入力導入に手こずったので、一番簡単にうまく行った方法をメモ。
ibus-mozcを使います。

<h3>１．Language supportから日本語をインストール、設定を"IBus"に</h3>
Menu → System Settings → Input method　を選択

Japanese の横の Install ボタンを押してください。
![Screenshot from 2017-08-29 18-23-55.png](https://qiita-image-store.s3.amazonaws.com/0/87494/fe73ce6f-de57-a3f4-7772-2bb11fe9dcce.png)
＊図はインストール後です。

次に、Language supportの上部にあるInput methodを"IBus"に変えてください。設定を反映させるため、この変更後、<b>一度ログアウトしてください。</b>
<h3>２．IBus PreferencesでMozcを追加</h3>
![Screenshot from 2017-08-29 18-32-42.png](https://qiita-image-store.s3.amazonaws.com/0/87494/85591342-2ddf-f23a-dceb-b2f4d2b0f49c.png)

Menuから"ibus"等と検索してIBus Preferencesを探して選択してください。

![Screenshot from 2017-08-29 18-33-26.png](https://qiita-image-store.s3.amazonaws.com/0/87494/a531132b-a001-20c4-fe0c-5ae112e35291.png)
Input Methodタグを選択し、Mozcが入っているのを確認してください。
入っていない場合は、右のAddボタンを押します。

![Screenshot from 2017-08-29 18-34-48.png](https://qiita-image-store.s3.amazonaws.com/0/87494/014bb8d6-5531-5e21-5453-dc799cc851ca.png)
Addボタンを押すと言語一覧が出てくるのでJapaneseを選択してAddをクリック。
![Screenshot from 2017-08-29 18-35-10.png](https://qiita-image-store.s3.amazonaws.com/0/87494/833a9b35-7a21-3093-3138-f91bea23df5e.png)
さらにウィンドウが出てくるのでMozcを選択してAddをクリック。

これでMozcが使えます！！

<h3>３．Mozcを使う</h3>
すごく分かりづらいのですが、右下にうすーくJPという文字が書いてあるアイコンがあります。
![Screenshot from 2017-08-29 18-32-05.png](https://qiita-image-store.s3.amazonaws.com/0/87494/84c686a5-3952-3b3d-9ae5-044a7065257e.png)
ここを押すと・・・

![Screenshot from 2017-08-29 18-51-10.png](https://qiita-image-store.s3.amazonaws.com/0/87494/596b3397-dd55-5bde-7f3a-ac77dc410b42.png)
こんなのが出てくるので、"Japanese-Mozc"を選択

![Screenshot from 2017-08-29 18-59-13.png](https://qiita-image-store.s3.amazonaws.com/0/87494/83747871-461e-c82e-70cf-f9c018b14f79.png)
すると、ひらがなのアイコンが現れました！！
さらにこのアイコンをクリック→ Input Mode から英字入力(Direct input)、ひらがな入力（Hiragana、初期設定はローマ字入力です）等の切り替えができます。
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第一章 知識をかみ砕く6

# ドメイン駆動設計とデザインパターン
貨物予約アプリケーションの例より
> ポリシーとは、ストラテジーとして知られている設計パターンの別名だ。通常、このパターンが使われるのはルールを置き換える必要のある場合だが、現時点でわかっている限り、その必要はない。しかし、**ここでとらえようとしている概念は、ポリシーの意味と適合している。**このこともまた、ドメイン駆動設計では重要な動機となる。(第一部 第一章 より)

オブジェクト指向といえば、デザインパターンとばかりに、研修・講習で教えられるが、ドメイン駆動設計においては、注意をしないといけないです。

あくまで、デザインパターンでで出てくる動機やパターンの内容は技術的なものとして説明されています。
適用できる状況だからと考えなしに使用しても、より複雑になるだけだったりするし、パターンを知らない人が読んでわからないソースコードになったりしますよね。
(なので、私個人の見解ですが、新人さんや、オブジェクト指向初心者に何の考えもなしに技術的側面だけのデザインパターンを教えるのにはちょっと反対です・・・)

ドメイン駆動設計でのデザインパターンとの付き合い方は、ドメインの深い概念と一致するか、ドメインの問題に適用できるかを考慮して使うことになります。

また、概念がきちんと適用されるのならば、例えばストラテジーパターンをルールの置き換えの必要なしに利用することもありえます。その方がドメインの概念として自然だからです。

この点から、なんでもかんでもデザインパターンを適用するのではなく、どこが重要で、重要な箇所以外をいかに最小限に実装するかは常に考慮しなければいけませんね。

> こうした手の込んだ設計をドメインのあらゆる詳細に適用することを推奨しているわけではない(第一部 第一章 より)

デザインパターンとの付き合い方を考えよう！
n件ずつ順次キャッシュしながらイテレーションするサンプル

「n件ずつキューを取得できる（消費したら消える）」というAPIがあるとき、イテレーションで1件ずつ処理するためのイテレーションクラス実装サンプル。

以下の例では取得した情報を内部でキャッシュしているので、アクセスせずに繰り返しイテレーションすることができる。（ただ、最後に追加のキューがないか調べようとしてしまう）


```py3
class StepCachingIterTest:
    def __init__(self, initial_list, cache_size):
        self.list = initial_list # 本当はアクセス先
        self.cache_size = cache_size
        self.cached_list = []
        self.idx = 0

    def __iter__(self):
        return self

    def __next__(self):
        if len(self.cached_list) < self.idx + 1:
            loaded = self.load_cache(self.cache_size)
            if not loaded:
                self.idx = 0
                raise StopIteration()

        item = self.cached_list[self.idx]
        self.idx = self.idx + 1
        return item

    def load_cache(self, fetch_size):
        '''外部へのアクセス部分'''
        print('load_cache rest: ' + str(len(self.list)))
        if len(self.list) > 0:
            self.cached_list.extend(self.list[0:fetch_size])
            self.list = self.list[fetch_size:]
            return True
        else:
            return False
```

デバッグ用に `print('load_cache rest: ' + str(len(self.list)))` を入れてあるので、読み込みが実行されると表示される。

実際に実行するとこんな感じ。

```
> it = StepCachingIterTest(list(range(1,10)), 3)
> for i in it: 
..   print(i) 
..   
load_cache rest: 9
1
2
3
load_cache rest: 6
4
5
6
load_cache rest: 3
7
8
9
load_cache rest: 0
```