OmniAICreator/Qiita-1.07M huggingface dataset:
Fusion 360でobjファイルを作成しopenFrameworksで読み込む

# 1. 概要

今日はIAMASで神田竜さんのGLSLワークショプがありました。その中でoFでモデルを作成するのは手間が掛かるので、Houdiniで作成しているという話をされていました。
(肝心のGLSLの話ですが、僕には早かったみたいなので、まずはここから。)

Houdiniを覚えるのも良さそうですが、普段Fusion 360を使用しているのでこっちでobjファイルを作成し、oFに読み込んでみました。

# 2. Fusion 360でobjファイルを作成する

まずはモデルを作成します。
図のモデルは70 * 70 * 70 mmで5mmのフィレットをつけた立方体です。
![スクリーンショット 2017-02-13 18.30.04.png](https://qiita-image-store.s3.amazonaws.com/0/94069/7e2d5d6e-4a3d-afb7-bfb8-097ec236acf3.png)

通常、モデルからは3Dプリンタなどで使うstlファイルを作成できるのですが、そのままではobjファイルを作成できないので、環境設定->プレビューに進みます。
[メッシュ]作業スペースにチェックを入れてOKを押します。
![スクリーンショット 2017-02-13 18.30.15.png](https://qiita-image-store.s3.amazonaws.com/0/94069/f9b04c45-1885-4644-74eb-cd14fe7fafe7.png)

モデル->作成->メッシュを作成を選択します。
![スクリーンショット 2017-02-13 18.30.49.png](https://qiita-image-store.s3.amazonaws.com/0/94069/50389a54-9cbe-e743-bcbf-1652b075671d.png)

メニューバーが変わるので、作成->BRepからメッシュを選択します。
![スクリーンショット 2017-02-13 18.31.05.png](https://qiita-image-store.s3.amazonaws.com/0/94069/2b9e5edb-0efb-e25b-6ca6-34aa9c32b5f7.png)

立方体を選択し、OKを押します。
![スクリーンショット 2017-02-13 22.26.39.png](https://qiita-image-store.s3.amazonaws.com/0/94069/5c764e55-2a1b-57b5-20b3-bce50ec1b8fc.png)



左側のメニューでメッシュボディを右クリックしOBJ形式で保存を選択します。
![スクリーンショット 2017-02-13 18.32.37.png](https://qiita-image-store.s3.amazonaws.com/0/94069/1b076ac9-262e-1cff-129c-7335108d1dbd.png)


これでモデルをobjファイルで保存することができました。

# 3. objモデルをopenFrameworksに読み込む

以下のサイトを参照しました。

* [openFrameworksで3Dデータを読み込む - aa develop](http://aa-deb.hatenablog.com/entry/2015/11/24/openframeworks%25e3%2581%25a73d%25e3%2583%2587%25e3%2583%25bc%25e3%2582%25bf%25e3%2582%2592%25e8%25aa%25ad%25e3%2581%25bf%25e8%25be%25bc%25e3%2582%2580/)

objファイルはbin/data/にmodelsというフォルダを作成し、shikaku.objという名前で保存しました。

``` ofApp.h
#pragma once

#include "ofMain.h"
#include "ofxAssimpModelLoader.h"

class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();

    ofxAssimpModelLoader shikaku;
    ofEasyCam cam;
    ofLight light;
};
```

``` ofApp.cpp 
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
  ofBackground(50, 50, 50, 0);
  ofEnableDepthTest();
  ofEnableSmoothing();
  shikaku.loadModel("models/shikaku.obj");
}

//--------------------------------------------------------------
void ofApp::update(){
//  shikaku.drawFaces();
}

//--------------------------------------------------------------
void ofApp::draw(){
  light.enable();
  ofEnableSeparateSpecularLight();
  ofEnableLighting();
  
  cam.begin();
  ofSetColor(255, 255, 255, 255);
  
  shikaku.setScale(0.75, 0.75, 0.75);
  shikaku.setPosition(0, 0, 0);
  shikaku.drawFaces();
  cam.end();
}
```

![スクリーンショット 2017-02-13 19.43.22.png](https://qiita-image-store.s3.amazonaws.com/0/94069/cab3ce99-f275-4cc4-097a-9e5cda20914a.png)

今はまだ黒光りしているだけのこいつをシェーダでかっこよくできるのか…。
【Python】pipとwheel

Pythonのpipとwheelについて纏めてみた。Pythonはパッケージ管理周りがややこしいですよね。

# pipとは？
Pythonのパッケージ（「ライブラリ」や「モジュール」とも呼ぶ）をインストール・管理するためのパッケージ管理システム。pipがパッケージの依存関係を管理してくれるので、ユーザはパッケージの依存関係を一切気にする必要はない。これにより、

```
$ pip install パッケージ名
$ pip uninstall パッケージ名
```

とコマンドを打つだけでパッケージをインストール、および、アンインストールすることができる。[PEP453](https://www.python.org/dev/peps/pep-0453/)により、Python3.4以上ではデフォルトでpipがインストールされるようになっている。なので、Pythonのパッケージのインストール・管理にはpipを使うようにしましょう。

# pipとeasy_installの違いは？
easy_installはpipの一世代前のパッケージング管理システム。諸々の事情があり、現時点（2017年2月）では姿を消しつつある。そんなものが過去にあったと知っておくだけで良いでしょう。pipとeasy_installの違いは[ココ](https://packaging.python.org/pip_easy_install/)に詳しく書かれているので、興味がある人は読んでみるとよいでしょう。

# wheelとは？
Pythonのパッケージの形式（フォーマット）のことを指す。実態はzip形式のアーカイブであり、[PEP427](https://www.python.org/dev/peps/pep-0427/)で定義された。

pipでパッケージをインストールする時は、wheel形式のファイルをダウンロードするところから始まる。逆に、Pythonのパッケージを作って配布したい場合は、wheel形式のファイルを作成する必要がある。

# wheelとeggの違いは？
eggはwheelの一世代前のパッケージの形式。easy_installと同じく、諸々の事情があり、現時点（2017年2月）では姿を消しつつある。そんなものが過去にあったと知っておくだけで良いでしょう。wheelとeggの違いは[ココ](https://packaging.python.org/wheel_egg/)に詳しく書かれているので、興味がある人は読んでみるとよいでしょう。
条件に名前を付けよう

# 条件に名前を付けよう

## こういうコード見たことありますよね？

```js
if (foo === 'foo') {
  // 何らかの処理
}
```

何の変哲もないコードです。
grepしてみましょう。
その条件が何箇所出てくるか確認しましょう。
2つ以上出現するなら、共通化の意味で関数に切り出しましょう。

上記の例で言うなら端的に書けば、下記の様になります。

```js
function isFoo(str) {
  return str === 'foo';
}
```
もっと、具体的に書けば文字列のfooであるだとか、
何らかのタイプがfooであるだとか、
もしかすると、カテゴリがfooなのかも知れません。
そういう場合は冗長ではありますが、isStringFooだとか、isFooTypeだとか、isFooCategoryだとか命名するのが良いかも知れませんね。
場合によってはタイプクラスやカテゴリクラスを作ってそこにisFooを置くべきかも知れません。

そして、この関数を使う箇所は当然こうなりますね

```js
if (isFoo(foo)) {
  // 何らかの処理
}
```

## 本質はそこ(共通化)ではありません

- 条件に名前を付けることにより後世の開発者にも一目でわかりやすくなること
- それにより後世の開発者が畏れずに使えること
- 畏れずに使う人間が増えそのコードの利用頻度が高まることで、その関数の信頼性が高まること
- ひいては、その関数を使うシステム全体の信頼性が高まること

もしかして、名前を付けることが出来ない？
では、その条件は何か間違っていませんか？
何かが不足していませんか？

条件式に少しだけ愛着を持ってコードを書きましょう(後世の開発者のために)
Golangで「エラトステネスの篩」で「1.3秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた

## はじめに

スミマセン完全にネタ投稿です。
詳しくはリンク先を参照。

- [C#で「エラトステネスの篩」で「2.6秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた](https://tail-island.github.io/programming/2016/04/15/lazy-primes.html)
- [Golangで「エラトステネスの篩」で「2.1秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた](http://qiita.com/cia_rana/items/2a878181da41033ec1d8)

golang は Hello World 程度しか書いたことない[^golang]のですが、この素数無限列挙ネタは知っていたので「それほんのちょっとの工夫でさらに1.5倍速できるよ」ということで。アンサーソングというか何というか。

[^golang]: これが golang 初記事です。

## クロージャを用いた実装(改)[^with_channel]

私が追記修正した主な箇所に「// ←ココ」みたいなコメント書いておきました[^please_review]。

[^with_channel]: チャネルを用いた実装も同様の修正で x1.5化 できます（はず）。取り敢えずクロージャの方が速いのでそちらだけ示します。
[^please_review]: golang に関しては超初心者なので、私が書き足した部分に関して「もっとこう書いた方が良いよ」という Suggest があればコメントなり編集リクエストなりいただければありがたいです。

```go:prime_generator_with_clojure_ex.go
package main
import (
	"fmt"
)
 
type PrimeGenerator struct {
	Next func() uint32
}
 
func NewPrimeGenerator() *PrimeGenerator {
	primeGenerator := PrimeGenerator{}
 
	multiples := map[uint32]uint32{}
	var num uint32
	var d uint32	// ←ココ
	primeGenerator.Next = func() uint32 {
		if num == 0 {
			num = 1
			return 2
		}
		if d == 0 {	// ←ココ
			d = 4
			return 3
		}
 
		for ;; {
			num += d
			d = 6 - d
			var k uint32 = 2	// ←ココ
 
			factor, hasFactor := multiples[num]
			if hasFactor {
				delete(multiples, num)
				// ↓ココ
				if (num + factor) % 3 == 0 {
					k = 1
				}
			} else {
				factor = num
			}
 
								// ↓ココ
			for newNum := num + (factor << k); ; newNum += factor << k {
				_, hasNewFactor := multiples[newNum]
				if !hasNewFactor {
					multiples[newNum] = factor
					break
				}
				k ^= 3	// ←ココ
			}
 
			if !hasFactor {
				return num
			}
		}
	}
 
	return &primeGenerator
}
 
func main() {
	n := 1000000
	primeGenerator := NewPrimeGenerator()
	for i := 1; i < n; i++ {
		primeGenerator.Next()
	}
	fmt.Printf("%d番目の素数: %d", n, primeGenerator.Next())
}
```

### 結果

ideone: https://ideone.com/cunq6q （1.32s）

## 簡単に解説

[元記事](http://qiita.com/cia_rana/items/2a878181da41033ec1d8) の prime_generator_with_clojure.go では、`num` にどんどん `2` を足すことで奇数をどんどん生成し、それを篩にかけています。
でも奇数って、3回に1回は3の倍数になります。（3より大きい）3の倍数は当たり前ですが素数ではありません。それを毎回篩にかけるのはもったいない。

そこで、`num = 1` から始めて、`num += 4`、`num += 2`、`num += 4`、`num += 2` … と繰り返すと、`1, 5, 7, 11, 13, …` となり、3の倍数をうまく除いて奇数を列挙できます！
この仕組みを利用したのが、先ほどの prime_generator_with_clojure_ex.go と言うわけです[^howtosieve]。
チェックする数値の個数が 2/3 に減るので、速度は理論上 x1.5[^x1_6]、ということです。

[^howtosieve]: 実際には`newNum`を算出する際にも一工夫必要です。詳しくはコードと[参考](#参考)に挙げた私の過去ブログ記事による解説等を参照してください。
[^x1_6]: 実測値は（たまたまですが）約x1.6 になっていますね。

## 参考

+ [汎用的でけっこう速い素数無限列挙](http://antimon2.hatenablog.jp/entry/2012/06/18/231118)（5年前に私が書いたブログ記事、↑とほぼ同等のコードを Ruby で書いています）
+ [汎用的で省メモリかつかなり速い素数無限列挙](http://antimon2.hatenablog.jp/entry/2012/06/19/221335)（↑の翌日に書いた記事、少し詳しい解説とさらに高速な別のコード提示）
+ [上限を決めずに素数を生成の高速化(Ruby版)](http://log.ttsky.net/article/19515687.html)（↑↑のさらに元とした記事。2006/06/19 なので、論文 [The Genuine Sieve of Eratosthenes](https://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf) よりもさらに3年前ですね）
IntelliJ IDEA(Win x64)使いに捧ぐフォント指定不具合の解消法

#先に結論
 [OpenJDK x64](https://github.com/ojdkbuild/ojdkbuild/releases)を%IDE_HOME%\jre64に導入する。

#何が問題？
WindowsでIntelliJ IDEAをお使いのみなさま、UIやEditorのフォントに指定すると表示が壊れるものがいくつかあることはご存じでしょうか。

[Noto Sans CJK JP](https://www.google.com/get/noto/)とか、、、
![Noto Sans CJK JP](http://i.imgur.com/6K2DIEW.png)

[Source Han Code JP](https://github.com/adobe-fonts/source-han-code-jp)とか・・・
![Source Han Code JP](http://i.imgur.com/30l3khw.png)

誤ってApplyやOKを押そうものならUIが異次元に突入します。
![UI](http://i.imgur.com/PDzGCOU.png)

※やっちゃったときは%USERPROFILE%\\.IntelliJIdea[2016.3 適宜読替]\config\options\ui.lnf.xmlを直接書き換えましょう(c_c)

```xml:ui.lnf.xml
<application>
  <component name="UISettings">
    <!-- これを修正します -->
    <option name="FONT_FACE" value="Noto Sans Mono CJK JP Regular" />
    <option name="HIDE_TOOL_STRIPES" value="false" />
    <option name="SHOW_MEMORY_INDICATOR" value="true" />
    <option name="OVERRIDE_NONIDEA_LAF_FONTS" value="true" />
  </component>
</application>
```

この問題はWindows x64版のみで発生しているもので、x86、Mac、Linux版では起きていないようです。
それらとの違いを調べた結果、「**Windows版IntelliJ IDEAの起動にOracle JDKを使用した場合**」に発生することがわかりました。
※IntelliJ IDEA x86版は%IDE_HOME%\jreにあるOpenJDK x86版(built by JetBrains)で起動しています。

#解決方法
1. OpenJDK x64のWindows向けバイナリを手に入れます。
私は[こちら](https://github.com/ojdkbuild/ojdkbuild/releases)のzip圧縮のものを使わせていただきました。
※ JetBrains社の[OpenJDK x64版](https://bintray.com/jetbrains/intellij-jdk/openjdk8-windows-x64/_latestVersion)もあるそうです。 @q1701 さんより情報をいただきました。

1. 解凍したファイル群を%IDE_HOME%\jre64に配置します。
参考:[IntelliJ IDEA Support](https://intellij-support.jetbrains.com/hc/en-us/articles/206544879-Selecting-the-JDK-version-the-IDE-will-run-under)
1. 祈りをこめてIntelliJ IDEA(idea64.exe)をダブルクリック！

※ここで導入するJDKはIntelliJ IDEAの起動に用いるもので、開発時に指定するJDKとは別のものです。

#後書き
今まで気になっていたけど使えなかったプログラミング向けフォントを指定できる喜びを分かち合いましょう！
UnityのiOSビルドで出力されるXcodeプロジェクトの設定自動化。ファイル毎のARC無効設定を追加する

# Xcodeプロジェクトの設定変更を自動化（コンパイルフラグの追加）
UnityのXcodeプロジェクト出力時、あるファイルのARC無効設定を追加する必要が出てきたのでメモ。
基本的には[Enable BitcodeをNoにするやり方](http://qiita.com/unsoluble_sugar/items/4096b37c8ea045d48b2e)と同じ。

[PBXProject](https://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html)を使ってプロジェクト設定を書き換えることで、コンパイルフラグの追加も自動化できる。

```csharp
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
#if UNITY_IOS
using UnityEditor.iOS.Xcode;
#endif

public static class MyBuildPostprocess
{
	[PostProcessBuild(999)]
	public static void OnPostProcessBuild( BuildTarget buildTarget, string path)
	{
		if(buildTarget == BuildTarget.iOS) {
			string projectPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";

			PBXProject pbxProject = new PBXProject();
			pbxProject.ReadFromFile(projectPath);

			string target = pbxProject.TargetGuidByName("Unity-iPhone");
			string fileGuid = pbxProject.FindFileGuidByProjectPath("Libraries/Plugins/iOS/NativeDialogManager.mm");
			List<string> flags = new List<string>() {"-fno-objc-arc"};
			pbxProject.SetCompileFlagsForFile(target, fileGuid, flags);

			pbxProject.WriteToFile (projectPath);
		}
	}
}
```
調べてみるとフレームワークの追加やInfo.plistの追加もできる模様。積極的に活用していきたい。
# 参考
[Unity - Scripting API: PBXProject](https://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html)
AmazonDashButtonをアナログにハックして注文ミスを防ぐ

最近快適な髭剃り生活のためにAmazonDashButtonを使い始めましたが、
いかんせんボタンのマークが同じメーカーだと全て同じなので間違えそう。

キャンセルしたりしていてはたいそう手間なので、
工夫をして注文ミスを未然に防いでみました。

AmazonDashButtonの使い方の記事ならこちらをどうぞ
http://qiita.com/ma2shita/items/b2fbaabf398db4324275

#最初の改善案
![IMG_0379.JPG](https://qiita-image-store.s3.amazonaws.com/0/114709/e54dd59a-bfab-2c31-cd99-d4a35b4dc4a0.jpeg)
こんな感じ。とりあえず分かれば良いか。という超妥協案。付箋に文字だけ。超ダサい。
ということで、さすがにこれは辞めて別の案を検討しました。

#完成図
![IMG_0448.JPG](https://qiita-image-store.s3.amazonaws.com/0/114709/245dece7-b7a9-fb7b-4590-52e46deb175f.jpeg)
このようにラベルシールを貼り付けて、シェービングクリームなら泡の画像、替刃なら刃の画像を貼ってみました。これなら、模様替えをしたり間違えて置いたりしても注文間違えはしません。

#手順解説
完成図のように至るには、
1. 画像を決める
2. ラベルシールを用意する　
3. イラストレーター等で印刷用ファイルを作る 
4. 印刷して、カットして貼り付ける 
という手順になります。

1.はAmazonの該当商品ページから、好きな画像を持ってくるだけなので省きます。

#ラベルシールを用意する
ラベルシールは既に角丸のシール状に均等にカットしてあるものと、一枚なりのものと二種類ありますが、カットしてあるものだと画像が切れないように合わせる手間があるので少し面倒くさいです。ここでは一枚なりのもので考えます。

![71PzT1tEkIL._SL1500_.jpg](https://qiita-image-store.s3.amazonaws.com/0/114709/1f76da3d-2ddf-f758-c70d-f0e2aa5d54a9.jpeg)
(https://www.amazon.co.jp/エーワン-ラベルシール-ノーカット-20枚-28409/dp/B0000ACBP8/ref=sr_1_1?ie=UTF8&qid=1486560775&sr=8-1&keywords=a4ノーカットラベル)

#イラストレーター等で印刷用ファイルを作る
####1. A4でドキュメントを作成する
![スクリーンショット 2017-02-08 21.31.45.png](https://qiita-image-store.s3.amazonaws.com/0/114709/1a919c6c-9338-bcc9-8068-6a5b9528c90f.png)

####2. 直径19mmの円の図形を作成する(AmazonDashButtonのボタン溝内側直径が19mm)
![スクリーンショット 2017-02-08 22.42.28.png](https://qiita-image-store.s3.amazonaws.com/0/114709/3345e9af-dd4c-733e-f84c-bbd07d7a746f.png)

####3. 画像を貼り付ける
![スクリーンショット 2017-02-08 22.50.21.png](https://qiita-image-store.s3.amazonaws.com/0/114709/0f4f178f-586e-259a-2654-fb8c5b4a40be.png)
どうせ後でカットして貼るので、こーんなにはみ出してても大丈夫です。

#印刷して、カットして貼り付ける
出来上がったシールの不要部分をカットして貼り付けると、最初にも出したように
![IMG_0448.JPG](https://qiita-image-store.s3.amazonaws.com/0/114709/590e6d28-ad05-062f-1a20-5a321fe24cdd.jpeg)
完成です。これで注文ミスを防ぐことができます。

#洗面所に取り付けてみた
![IMG_0447.JPG](https://qiita-image-store.s3.amazonaws.com/0/114709/a93041c5-7fc3-b303-e3e2-2d373b2e999f.jpeg)
指定したロールに属するロールを再帰クエリで検索する

## 指定したロール名に属する、全てのロール名を検索する例。
以下のSQLでは user_x というロール名が包含する全てのロール名を検索する。

```
WITH RECURSIVE t AS (
  SELECT usesysid as roleid FROM pg_user WHERE usename = 'user_x'
UNION ALL
  SELECT member as roleid FROM pg_auth_members pam JOIN t ON (pam.roleid= t.roleid)
) SELECT pu.usename FROM t JOIN pg_user pu ON (t.roleid = pu.usesysid);
```

## 指定したロールIDに属する、全てのロールIDを検索するSQLの例。
以下のSQLでは 16396 というロールidが包含する全てのロールidを検索する。

```
WITH RECURSIVE t AS (
  SELECT usesysid roleid FROM pg_user WHERE usesysid = 16396
UNION ALL
  SELECT member as roleid FROM pg_auth_members pam JOIN t ON (pam.roleid= t.roleid)
) SELECT roleid FROM t;
```
難易度の高いスケジュール作成のやり方

# スケジュールに意志を込める
納期と品質、立ちはだかる優先度。
その時君は何をすべきか。

---

# アジェンダ

+ 今日の狙い
+ 意志とは何か?
+ なぜ意志をこめるのか
+ 誰の意志をこめるのか
+ 基本のスケジュール
+ どうやって意志を込めるのか
+ まとめ

---

# お願いごと
+ これは社内勉強会用の資料です。
+ 対話しながら進めようと思います。
+ ゆっくり進めます。
+ 疑問質問あったらそのタイミングで手をあげてください。
+ 途中退出可。

---

# 今日の狙い

---

# 今日の狙い

+ プロジェクトを始める時の第一歩
+ スケジュールを作る時の第一歩

これらを知ること。

※運用部分は今回は言及しないです。 

---

# 意志とは何か?

---

# 意志とは

1.【意志】 どうしても、これをしよう、またはしまいという積極的な心ぐみ。「―が強い」「―薄弱」。強いはっきりした意向。 「神の―」
  
2.【意思】 しようとする考え。思い。 「―表示」

引用:https://goo.gl/u9lAlz

---

# 「〜〜したい」という強い心。

+ 3月にリリースしたい。
+ 30代男性にうけるゲームをつくりたい。
+ 仲の良い5人でつくりたい。
+ 予算1000万円でつくりたい。
  
などなど

---

# 意志 = 動機

---

# なぜ意志をこめるのか

---

# PJとしては必然

---

### 意志がなければ実行する必要はない

---

# 補足
納期や予算や盛り込む機能など、
与えられた状態と要求されている成果物との差を埋める。

---

### その為に意志を持つ

---

# 我々はなぜここにいるのか。by インセプションデッキ 

---

# 疑問に思う人いますか?

---

# 誰の意志をこめるのか

+ ステークホルダー
+ モチベーションのある人
+ 正しい情報を持っている人
+ 意志を持ってい無さそうな人にもヒアリング

など

---

# どうやって意志を込めるのか

---

# 意志の込め方、流れ

+ 基本のスケジュールを作る。
+ "誰の意志"の意志を明らかにしておく。
+ 現実と照らして懸念点を出す。
+ 実現可能な方法を模索する。
+ 論理的に説明できるようにする。
+ "誰の意志"と議論し合意を得た状態にする。

---

# ポイントの説明していく

---

### 最後に「議論」を置いているが、最後だけでなく流れをチームで行う。

---

# 基本のスケジュールを作る
+ ガントだろうがスプリントだろうがカンバンだろうかどんな方法でもよい。
+ いきなり意志を込めない、込めすぎない。
+ 対処すべき問題を隠さない。
+ 可能な限り詳細にする。

---

# "誰の意志"の意志を明らかにしておく。

+ これが成功条件である。
+ 簡単にブレるようなものは避ける。
+ 極力、詳細に言語化する。（以後、更新は可、変更は避ける。）

---

# 現実と照らして懸念点を出す。

+ 解消しなければいけない課題。
+ 意志を調整する条件になる。
+ よく忘れられるので注意。
+ 見積もりしきれない作業もここで出す。

---

# 実現可能な方法を模索する。

+ "誰の意志"以外は自由に考えること。自分で制約を課さないこと。
+ 制約外の方法、ありとあらゆることを考える。
+ やりきれれば、意志が込められた状態に近づく。
+ 意志と現実とを限りなく近づける。

---

# 論理的に説明できるようにする。

+ 意志と現実とをの差を明らかにする。
+ 今後の方針を正しく判断するために必要。
+ 説明がないのは、意志がない状態。
+ 経験や実績（数値）などが説明を補強する。

---

# "誰の意志"と議論し合意を得た状態にする。

+ 議論=説明しあう。
+ 互いの説明、意志を尊重しあう。
+ 衆愚にならないこと（意志を削る事も重要）。
+ 合意を得るのが難しい場合は、意志を抽象化したり具体化したりして議論する。
+ チームとして意志が込められた状態の完成。
+ プロジェクト、スケジュール、チームの礎

---

# まとめ

「こうありたい」という意志を持つこと。
意志を実現する方法を常に考えること。

---

*Where there is a will there is a way*
*意志あるところに道はひらける。*

-Abraham Lincolnほか-
Swift で「千反田える」❷

千反田えるね

```swift
(1...1000).forEach { (x) in
    let s = String(x).unicodeScalars.reversed().enumerated().map({ (i, y) -> String in
        y.value == 48 ? "" : "\(y.value == 49 && i != 0 && i < 4 ? "" : ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"][Int(y.value - 48)])\(["", "十", "百", "千", "万"][i])"
    }).reversed().joined()
    print("\(s)反田\(["えー", "びー", "しー", "でぃー", "いー", "えふ", "じー", "えいち", "あい", "じぇい", "けい", "える", "えむ", "えぬ", "おー", "ぴー", "きゅー", "あーる", "えす", "てぃー", "ゆー", "ゔぃー", "だぶりゅー", "えっくす", "わい", "ぜっど"][(x-1)%26])")
}
```
<img width="1072" alt="Screen Shot 2017-02-13 at 7.47.37 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/163219/8d1f88f0-2444-ce2c-8fe6-46a872044eb7.png">
[Ruby Silver対策]試験範囲メソッドチートシート作ってみた(Hash)

# [Ruby Silver対策]試験範囲メソッドチートシート作ってみた(Hash)

[前回](http://qiita.com/UltraBirdTech/items/50489e39461b3658aea0)と[前々回](http://qiita.com/UltraBirdTech/items/5ae3ce20fd77f2cf4a35)の続き。

こうやって[Ruby公式資格教科書](http://gihyo.jp/book/2012/978-4-7741-5001-7)を参考に作ってはみるものの、模擬試験を受けると公式教科書に乗っていないメソッドも出てくる罠。
分かってはいたが・・・公式教科書って書いてあるのに・・・泣

とりあえず破壊的と非破壊的の区別と、同じ意味のメソッドをおさえればなんとかなりそう。

## Hash
<img width="541" alt="Ruby_Hash_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/99413/65ceeff0-d0ca-4b67-27a0-85b8abb61612.png">
C++ Builder > TByteDynArray型変数 を String型に変換する

```txt:動作環境
C++ Builder XE4
```

TCP/IP通信をIndyで行おうとしていて、TByteDynArrayをString型に変換する必要があった。

以下に変換方法を見つけた。

http://www.cyberforum.ru/cpp-builder/thread1676838.html

やり取りの詳細は言語(ロシア語)が分からないため不明であるが、コードで行っていることは理解した。

実際に実装したコードは以下。

```Unit1.cpp
...
	TByteDynArray byteArray;
	IdTCPClient1->Socket->ReadBytes(byteArray, len);
	String str = TEncoding::GetEncoding(932)->GetString(byteArray);
...
```

932のコードはSJIS。
strに文字列を取得できた。

関連 http://qiita.com/7of9/items/5a2e979961b4b01b2701

上記の処理の場合、byteArrayの途中に`0x00`が入っていると、そこまでの読込みしか
Linux(Debian)でwebページのキャプチャをURLから自動的に作成する

Xvfb、Firefox、ImageMagickを使います。インストールはyumやらaptやらで簡単に入りますので割愛。
シェルから下記のコマンドを実行します。
firefox起動時に何かしらエラーがでると思います。今回はsoundなんたらが足りないエラーがでたので、aptで追加しました。

```perl
export DISPLAY=:1.0
Xvfb :1 -screen 0 1280x2048x24 & #縦に大きめに取得するため縦を2048に

firefox -createprofile capture #プロフィール作成
firefox -width 1100 -height 2000 -p "capture" & #作成したプロフィールでfirefox起動 こうしないとwidth、heightが使えなかったので

firefox http://www.connan.jp
sleep 3;import -window root -silent connan.png #3秒待って取得
```

ポイントはプロフィールの作成です。削除の仕方がわからなかったので、誰か教えてください。
サイズを変更する場合は、capture2みたいな感じで増やしてました。プロフィールのリセットもできるはず。
丸ごと１ページ取得みたいなこともできそうな気がするけど、今回はこれで十分。

後はperlなり、phpなりでURLでループすれば、数百枚のキャプチャも楽にいけちゃいます。

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/24113/c3e8d308-72ea-ad07-5482-3d560c867754.png)
forループの練習問題（数字でピラミッドを作る）　  上級・解答編

#問題
下記のリンクの練習問題の解答（PHPで記述）になります。
http://qiita.com/takuya-kodama/items/5a1dd8da56e7a87ec58f

解答よりも良いコードがありましたらコメント等で教えていただければと思います！

#解答

```answer.php
<?php

#問題１
for($a = 1 ; $a <= 3; $a++){
  for($b = 4; $b >= $a+1 ; $b--){
    echo $b-$a;
  }
  echo "<br />";
}

#問題２
for($a = 3 ; $a >= 1 ; $a --){
  for($c = 2 ; $c >= $a ; $c --){
    echo "*";
  }

  for($b = 1 ; $b <= $a ; $b ++){
    echo $b;
  }
  echo "<br />";
}

#問題３
$x = 6;
for($a =1 ; $a <= 3 ; $a ++){
  for($b = 1 ; $b<= $a ; $b++){
    echo $x;
    $x --;
  }
  echo "<br />";
}

#問題４
for($a = 4 ; $a >= 1 ; $a--){
  for($b = 3 ; $b >= $a ; $b--){
    echo "*";
  }
  for($c = 1 ; $c <=$a ; $c++){
    echo $c;
  }
  for($d = $c-2 ; $d >=1  ; $d --){
    echo $d;
  }
  echo "<br />";
}


#問題５
for($a = 1 ; $a <= 9 ; $a ++){
  if($a <= 5){
    for($b = 4 ; $b >= $a ; $b --){
      echo "*";
    }
    for($c = 1; $c <= $a ; $c++){
      echo $c;
    }
    for($d =$c -2 ; $d >= 1 ; $d--){
      echo $d;
    }
    echo "<br />";
  }
  else if($a >=6 ){
    for($e = 6 ; $e <= $a ; $e++){
      echo "*";
    }
    for($f = 1 ; $f <=10-$a  ; $f++){
      echo $f;
    }
    for($g = $f-2 ; $g >=1  ; $g --){
      echo $g;
    }
  echo "<br />";
  }
}

#問題６
for($a = 5 ; $a >= 1 ; $a --){
  for($b = 2 ; $b <= $a; $b ++){
    echo "*";
  }
  for($c = 5 ; $c >= $a ;$c --){
    echo $c;
  }
  for($d = $c+2 ; $d <= 5   ; $d ++){
    echo $d;
  }
  echo "<br />";
}


?>

```
GoogleChromeのメモリ消費を抑える（試験運用版機能を利用）

Chromeのアドレスバーに
**chrome://flags/**
を入力すると試験運用版機能の一覧が表示される。
↓
一覧中の
**タブのメモリを自動解放する Mac, Windows**
を「有効」に変更
↓
利用してないタブのメモリを解放してくれます。
タブをたくさん開くことが多いので、Chromeが使っているメモリ量がぐっと減りました。
※メモリが解放されたタブは休止状態となり、再度タブを開くとリロードされます。

機能自体は試験中のものなので利用する際は自己責任でお願いします:smiley:
forループの練習問題（数字でピラミッドを作る）　  上級編

#はじめに
この練習問題は下記記事の続編として作成しました。
そのため、やや難しい問題となっております。
初級・中級編を解いた後にやってみると問題にスムーズに入れると思います。

**初級・中級編**
http://qiita.com/takuya-kodama/items/32edabf2c27c4b4690a0


#練習問題
ではさっそく練習問題にチャレンジしてみましょう！
問題は全部で６問あります。

```
問題１
321
21
1

問題２
123
*12
**1

問題３
6
54
321

問題４
1234321
*12321
**121
***1

問題５
****1
***121
**12321
*1234321
123454321
*1234321
**12321
***121
****1

問題６
****5
***545
**54345
*5432345
543212345
```

#解答
解答は下記のリンクに載せております。
http://qiita.com/takuya-kodama/items/926f280b2119486ebce4
NSQ で Balancing と Bloadcast を使い分ける

オライリー の Golang 本で NSQ を知った。
この中で NSQ でメッセージングを行っていたのだが、いざ自分で使ってみて Consumer を複数起動したときに、Producer 1 に対して Consumer 1 しか通信していなかった。
そしてきれいにバランシングしていた。

これはそもそも NSQ の正常な動作っぽい。

[Guillaume's Thoughts: First look at NSQ](http://blog.charmes.net/2014/10/first-look-at-nsq.html)

要は、Topic と Channels は２つのモード、 `broadcast` と `balancing` で動作する。
Producer は Topic にしかひもづかない、
Consumer は Topic -> Channel にひもづく、
というのがまず基本。
その上で、Consumer でのチャンネル名の付け方で `broadcast` と `balancing` がわかれる。

**Balancing**

チャンネル名を同じにする

- Consumer1 subscribe to mytopic / mychannel
- Consumer2 subscribe to mytopic / mychannel
- Consumer3 subscribe to mytopic / mychannel
- Producer1 published to mytopic

**Broadcast**

チャンネル名を異なるものにする

- Consumer1 subscribe to mytopic / mychannel1
- Consumer2 subscribe to mytopic / mychannel2
- Consumer3 subscribe to mytopic / mychannel3
- Producer1 published to mytopic

これで Producer が Publish するとブロードキャストするのか、バランシングするのか挙動を柔軟にかえることが出来ます。
もちろん、 `broadcast` と `balancing` をまぜることも可能性です。

## 参考URL
[Golang / go-nsqからnsqを利用してみる - Qiita](http://qiita.com/qwm0/items/289b332f76f83a95a0ca)


おわり。
【備忘録】DataGridのセルに対してStyle設定

初めての投稿になります．
N番煎じ(というかそもそも投稿するようなことでも無い)と思いますが，備忘録として…

##セルの内容をツールチップに表示
セルのマウスオーバー時にDataGridTextColumnの内容をツールチップに表示したい！ということで定義したStyle．

```MainWindow.xaml
<Window.Resources>
	<Style x:Key="SelfToolTip" TargetType="TextBlock">
		<Setter Property="ToolTipService.ToolTip" 
				Value="{Binding Text, RelativeSource={RelativeSource Self}}" />
	</Style>
</Window.Resources>
```

ツールチップの表示内容(Value)はTextBlockのTextに設定．
これでツールチップに自身の内容を表示するようになります．

##セルの内容で背景色と文字色を変更
セルの内容に応じてそのセルの背景色と文字色を変更したい！ということで定義したStyle．

```MainWindow.xaml
<Window.Resources>
	<Style x:Key="DangerColorSet" TargetType="TextBlock">
		<Style.Triggers>
			<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" 
						 Value="Danger">
				<Setter Property="Background" Value="Yellow"/>
				<Setter Property="Foreground" Value="Red"/>
			</DataTrigger>
		</Style.Triggers>
	</Style>
</Window.Resources>
```

上記StyleではTextBlock(TargetType)のText(Path)が"Danger"の場合に背景色が黄色に，文字色が赤色に変化します．

あとは適用したいDataGridTextColumnのElementStyleに設定したKeyを指定してあげればOK．
`ElementStyle="{StaticResource SelfToolTip}"`とか
`ElementStyle="{StaticResource DangerColorSet}"`みたいな．

##さいごに
初めまして傍猫といいます．そのまま「はたねこ」と読みます(どうでもいいね)
今後備忘録として少しずつでも投稿していこうと思います．
基本的にWPF(XAML,C#)に関する投稿が多くなると思いますが，機会があれば別の言語に関しても投稿していきたいと考えています．

ご指摘等していただけると嬉しいのでぜひよろしくお願いいたします．
git-lfsでコンフリクトしたらどうなるか

git-lfsで、コンフリクトさせてみると以下のようなファイルができます。

```
version https://git-lfs.github.com/spec/v1
<<<<<<< HEAD
oid sha256:143976a5f15427e0f66e4285092df0691ba234ffdcf1fbea0927d4b055630471
size 11434893
=======
oid sha256:2b91d9f8ec063a318089974bfb19893f61752c6126449b137b5b531b562ebabf
size 11566529
>>>>>>> origin/master
```

で、この状態で、新旧のバイナリを比較してみてみたいですよね？

```shell-session
$ GIT_LFS_SKIP_SMUDGE=1 git checkout --theirs conflict.mp3
```

まずはこれでポインタファイル(最初に引用したgit-lfsのバージョン、oid、sizeが入ったファイル）のコンフリクトしてない状態にしておいて、次のコマンドを起動します。そうすると、lfsのファイル置き場にファイルが入ります。

ポインタファイルはテキスト処理的に作ってもOK（そっちの方がワークフォルダをいじらなくてすむ）

```shell-session
# バイナリファイルの実態の置き場を作る
$ mkdir -p .git/lfs/objects/2b/91
# ここでダウンロード発動
$ git lfs smudge --info conflict.mp3 < conflict.mp3 > .git/lfs/objects/2b/91/2b91d9f8ec063a318089974bfb19893f61752c6126449b137b5b531b562ebabf
```

最初のファイルの両方のoidをコピーしてくれば、ファイルの実態にアクセスできるので、比較できますよね。

ワークファイルをがんがん書き換えてよければ、単純に次のコマンドをそれぞれ叩いてファイルを取得すればOK

```shell-session
# リモートのファイルを取得
$ git checkout --theirs conflict.mp3
# 手元のファイルを取得
$ git checkout --ours conflict.mp3
```

このコマンドを実行した瞬間にダウンロードが発生します。
SDN Hubのインストール


http://www.adoc.co.jp/blog/e000209.html
こちらのサイトを参考にSDN Hubのインストールを進めていたところ、エラーが出たので自分なりの解決方法をまとめました。

(参考にしたサイトはzipでダウンロードしてましたが)[github](https://github.com/sdnhub/SDNHub_Opendaylight_Tutorial)から最新版をcloneします。

```sh
$ git clone https://github.com/sdnhub/SDNHub_Opendaylight_Tutorial.git
$ cd SDNHub_Opendaylight_Tutorial
```

ここで作業をします。
## `maven clean install`が通らない

以下のようなエラーが出ました。

```sh
kato770@kato770-VirtualBox:~/SDNHub_Opendaylight_Tutorial-master$ maven clean install
[INFO] Scanning for projects...
Downloading: http://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/odlparent/odlparent/1.6.1-Beryllium-SR1/odlparent-1.6.1-Beryllium-SR1.pom
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR] The project org.sdnhub.odl.tutorial:main:0.6.0-SNAPSHOT (/home/kato770/SDNHub_Opendaylight_Tutorial-master/pom.xml) has 1 error
[ERROR] Non-resolvable parent POM for org.sdnhub.odl.tutorial:commons:1.2.0-SNAPSHOT: Could not transfer artifact org.opendaylight.odlparent:odlparent:pom:1.6.1-Beryllium-SR1 from/to opendaylight-release (http://nexus.opendaylight.org/content/repositories/opendaylight.release/): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target and 'parent.relativePath' points at no local POM @ org.sdnhub.odl.tutorial:commons:1.2.0-SNAPSHOT, /home/kato770/SDNHub_Opendaylight_Tutorial-master/commons/parent/pom.xml, line 8, column 11 -> [Help 2]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException
```

以下のようにパスを通したら解決しました。

```sh
$ export M2_HOME=~/apache-maven-3.2.5/
$ export PATH=${M2_HOME}/bin:${PATH}
```
## `Could not resolve dependencies`と言われる
上でインストールを開始することができたのですがインストール中にまた問題がおきました。Download中途中でFailureして落ちました。

この問題は以下のStackOverflowに解決策がありました。

http://stackoverflow.com/questions/36561406/maven-dependency-error-when-i-start-to-install-mvn-nsu/37322101#37322101

書いてあるとおり、`~/.m2/settings.xml`がないことによる問題でした。
`wget -q -O - https://raw.githubusercontent.com/opendaylight/odlparent/master/settings.xml > ~/.m2/settings.xml`をそのまま実行すれば解決できました。

## インストール成功
無事にインストールが成功しました。
![Screenshot from 2017-02-13 19:24:03.png](https://qiita-image-store.s3.amazonaws.com/0/130930/e0a95fbd-64f9-8f7e-4733-eb9c65a9c9ce.png)

## 実行環境
* Ubuntu14.04
* Java1.8.0
* Maven3.2.5

## 参考
* http://www.adoc.co.jp/blog/e000209.html
* http://blog.beaglesoft.net/entry/%3Fp%3D762
* https://github.com/sdnhub/SDNHub_Opendaylight_Tutorial/issues/10
* http://stackoverflow.com/questions/36561406/maven-dependency-error-when-i-start-to-install-mvn-nsu/37322101#37322101
google custom search apiでニュース検索する方法

【忘備】

+ 以下のパラメーターで検索するとニュース検索をすることができる。
  + searchType:image
  + imgType:news
+ 画像検索なのが直感的じゃないのでよく間違える
+ responseのitems.linkは画像のURLを指すようになるので items.image.contextLinkでページURLを取得するようにする。
【用語解説】わかりにくいSQLの句・文・式の違い

文章を書いている時に、句・文・式で迷ったのでメモ。

ほぼ[コレ](https://en.wikipedia.org/wiki/SQL#Syntax)の和訳となります。

![1000px-SQL_ANATOMY_wiki.svg.png](https://qiita-image-store.s3.amazonaws.com/0/155509/2ae7f925-7a1c-2e80-4d05-df39292de78d.png)

## 句 (clause)
節ともいう。
文、又はクエリの構成要素。

 - UPDATE句
 - FROM句
 - WHERE句
 - EXISTS句
 
等。
省略可な句もある。
上の画像もやっているが、これで改行すると個人的にスッキリする



## 文 (statement)

命令文ともいう。

一つの実行の単位となるSQL。
文の末尾には';'を付けることができる(製品によっては付けないといけない)

 - SELECT文
 - UPDATE文

×FROM文「FROM文 SQL」で検索すると、
もしかして:FROM句 SQL と出る。
WHERE文というのもたまに見かけますが厳密には間違っている。

そのまとまりが実行できるなら、文と称しても問題ない。

## 式 (experssion)

スカラ値などを表す

 - '1','東北'など
 - CASE式
 - 条件式(true/false/unknownが決まる)述語ともいう(後述)

### 述語 (Predicates)

論理演算の結果(true/false/unknown)を返す。
条件式の中などで使用。


### 補足

EXISTS式というとかなり違和感があるが、Boolean型を返すので、
間違った表現ではない。
一般的にあまり使われないが、調べてみたところ製品のドキュメントなどにはたまに使われている。

参考:["EXISTS式"で検索](https://www.google.co.jp/?gws_rd=ssl#q=%22EXISTS式%22%E3%80%80sql)


# まとめ

大きさでイメージするなら

文 > 句 > 述語 ≧ 式

日頃の会話などでは適当でいいけど、やや複雑なことが書いてあるテキストなどを読み解くときは、基本的な語句の意味をきちんと理解したうえで読みたい。

画像の出展:https://en.wikipedia.org/wiki/SQL
参考:https://oshiete.goo.ne.jp/qa/7956618.html
【Pandoc】他の.mdファイルへのリンクを.htmlに書き換える

[Pandoc](http://pandoc.org/)はMarkdownをHTMLやMS Wordに変換できるツールです。
http://pandoc.org/
http://sky-y.github.io/site-pandoc-jp/users-guide/

今回、Pandocを使って出力したHTMLファイルのリンク先のMarkdownもHTMLに変換したい場合、
リンクが`.md`のままなのでリンクつながらないという問題があり、`.md`のリンクを`.html`に変換する方法を調べたので投稿します。

参考
http://qiita.com/takada-at/items/187923e57071c0aa73a7
http://stackoverflow.com/questions/40993488/convert-markdown-links-to-html-with-pandoc


# やりたいこと
Markdownで

```md
[Document](./document.md)
```
などと書いた箇所のリンクが

```html
<a href="./document.md">Document</a>
```

と変換されますが、これを

```html
<a href="./document.html">Document</a>
```

という形にしたいです。

# 手順1. panfluteをインストール
Pythonのpanfluteというパッケージをインストールします。
http://scorreia.com/software/panflute/index.html

# 手順2. `.py`ファイルを作成する
[こちら](http://stackoverflow.com/questions/40993488/convert-markdown-links-to-html-with-pandoc)に書いてある通り、
下記のpyファイルを作成します。
（ファイル名は何でもいいですが、今回は「convertlink.py」とします）

```py:convertlink.py
# coding:utf-8
import re
import panflute as pf

def action(elem, doc):
    if isinstance(elem, pf.Link):
        matches = list(re.finditer(r'(\.md)', elem.url))
        if matches:
            m = matches[-1]
            elem.url = elem.url[:m.start(1)] + '.html' + elem.url[m.end(1):]
            return elem

if __name__ == '__main__':
    pf.run_filter(action)
```

# 手順3. Pandoc実行時に引数`--filter`に、作った`.py`ファイルを指定する
[こちら](http://qiita.com/takada-at/items/187923e57071c0aa73a7)を参考にしました。

```bash
pandoc input.md --filter=./convertlink.py -t html5 -o output.html
```

# 結果

Markdownで

```md
[Document](./document.md)
```
などと書いた箇所のリンクが

```html
<a href="./document.html">Document</a>
```


に変換されていれば成功です。
ColdFusion でメソッドチェーン的なもの



ColdFusion でメソッドチェーン的なものが出来ると気づいたので。

サンプルは下記を参考に
http://qiita.com/t_ishida/items/bae7e62950d81f427f13


cfml形式で

```cfm:Friends.cfc

<cfcomponent> 

<cfset this.message = "" >
<!---
<cffunction name="init"> 
  <cfset this.message = "">
  <cfreturn this >
</cffunction>
--->

<cffunction name="wai" > 
  <cfset this.message &= "わーい" & chr(13) & chr(10)  >
  <cfreturn this >
</cffunction>

<cffunction name="sugoi"> 
  <cfset this.message &= "すごーい" & chr(13) & chr(10)  >
  <cfreturn this> 
</cffunction>

<cffunction name="tanoshii"> 
  <cfset this.message &= "たのしー" & chr(13) & chr(10)  >
  <cfreturn this> 
</cffunction>


<cffunction name="friends"> 
<cfargument name="skill" required="yes" type="string" >
  <cfset this.message &= "君は#arguments.skill#がとくいな、フレンズなんだね!!" & chr(13) & chr(10) >
  <cfreturn this> 
  
</cffunction>

```

```cfm:output.cfm
<cfset writeDump(new Friends().wai().sugoi().tanoshii().friends("●●").toString()) >

```

```
わーい すごーい たのしー 君は●●がとくいな、フレンズなんだね!!
```

もしくは　cfscript形式で

```cfm:Friends.cfc
<cfscript>
component{

  this.message = "";

  /*
  public Friends function init(){
    this.message = "";
    return this;
  }
  */

  public Friends function wai(){
    this.message &= "わーい" & chr(13) & chr(10);
    return this;
  }


  public Friends function sugoi(){
    this.message &= "すごーい" & chr(13) & chr(10);
    return this;
  
  }


  public Friends function tanoshii(){
    this.message &= "たのしー" & chr(13) & chr(10);
    return this;
  
  }

  public Friends function friends(required string skill){
    this.message &= "君は#arguments.skill#がとくいな、フレンズなんだね!!" & chr(13) & chr(10);
    return this;
  
  }
  
  public string function toString(){
    return this.message;
  }

}
</cfscript>

```


```cfm:output.cfm
<cfscript>
writeDump(new Friends().wai().sugoi().tanoshii().friends("●●").toString());
</cfscript>
```

```
わーい すごーい たのしー 君は●●がとくいな、フレンズなんだね!!
```
[JAWS-UG CLI] EC2 # EC2インスタンス (ログイン元アドレスの取得)




前提条件
========


1. 事前作業
===========

```bash:EC2インスタンス:
netstat -n|grep ':22 ' |awk '{print $5}' | sed 's/:.*$//'
```

結果(例):

  xxx.xxx.xxx.xxx




2. ログイン元アドレスの変数設定 (ローカル)
==========================================

```bash:変数の設定(ローカル):
FOREIGN_ADDR='<事前作業で表示されたIPアドレス)'
```

```bash:変数の設定(ローカル):
VPC_SG_CIDR="${FOREIGN_ADDR}/32" \
        && echo ${VPC_SG_CIDR}
```


3. 事後作業
===========


完了
====
よく見かける「$:.unshift "./lib"」とは何か

最近Rubyを勉強していて、よく見かける`$:.unshift "./lib"`が何を意味しているのかよくわからなかったので調査。

### 「$:」とは
まず、先頭の「:$」の意味からしてよくわからず…
これは**組み込み変数の'$LOAD_PATH'の別名**とのこと。

**$LOAD_PATH**が何かといいますと、requireがファイルを読み込むときに検索するディレクトリの名前を含む配列になります。
irbを起動して`>>p $LOAD_PATH`で配列の内容を確認できます。

### requireでの検索先の追加
ということで、`$:.unshift "./lib"`は難しいことは何もなくて、ただ単にrequireで読み込むファイルの検索先を配列に追加しているだけでした。
ただ、pushじゃなくunshiftを使うのは何故なのかはわかりませんでした。。。:sob:

### スクリプトファイルからの相対パスの取得
ちなみに、自分が見ていたファイルでの検索先の追加は
`$:.unshift(File.join(File.dirname(__FILE__), 'lib'))`
という感じで書かれていて、こう書くことで対象のファイルから参照先の階層を指定できてファイル名変更があった時など便利な気がする。
xcode8で「an internal error occurred source editor functionality is limited」というエラーが発生したときの対処方法

上記エラーが発生すると下記の症状が発生した。

* ソースを編集するとシンタックスハイライトが無効になる。
* ソースを編集するときのオートインデントなどの入力補助機能が無効になる。
* 補完は動いてはいるが、何かが微妙な感じになっている。
* エラーがある箇所のソース上で表示、修正候補の提示などが無効になる。

一応以下の手順で回復した模様。

* 手順1：ビルドエラーになっている箇所をコメントアウトするなどにより、正常にビルドできる状態にする。
* 手順2：Xcodeを終了する。
* 手順3：`~/Library/Developer/Xcode/DerivedData`を削除する。
* 手順4：Xcodeを起動する。

※私の環境では、手順1を実施せずに、手順2〜4だけ実施しても回復しなかった。
[JAWS-UG CLI] S3 #16 S3バケットへの設定ファイルの配置



前提条件
========


S3
--

S3(conf)バケットへのアクセス権


0. 準備
=======


1. 事前作業
===========


1.1. AMI設定情報ディレクトリの指定
----------------------------------

```bash:変数の指定:
DIR_CONF_AMI='config-ami-handson-20170213'
```


1.2. S3バケットの指定
---------------------

```bash:変数の指定:
S3_BUCKET_NAME="conf-${AWS_ID}"
```


2. S3への転送
=============

```bash:変数の確認:
cat << ETX

  DIR_CONF_AMI:   ${DIR_CONF_AMI}
  S3_BUCKET_NAME: ${S3_BUCKET_NAME}

ETX
```

```bash:コマンド:
aws s3 sync ${DIR_CONF_AMI} s3://${S3_BUCKET_NAME}/${DIR_CONF_AMI} \
        --exclude ".*" \
        --delete
```

結果(例):

      upload: config-apache-redmine/sample-index.html to s3://conf-${AWS_ID}/config-ami-handson-20170213/database.yml
      upload: config-apache-redmine/sample-index.html to s3://conf-${AWS_ID}/config-ami-handson-20170213/httpd-redmine.conf


3. 事後作業
===========

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/${DIR_CONF_AMI}/
```

結果(例):

      2017-02-13 01:23:45         195 database.yml
      2017-02-13 01:23:45         513 httpd-redmine.conf


完了
====
[JAWS-UG CLI] EC2 # ユーザデータの作成 (Redmine 3.1.1)


前提条件
========


0. 準備
=======


0.1. 設定情報用バケット名の指定
-------------------------------

```bash:変数の設定:
S3_BUCKET_CONF="conf-${AWS_ID}" \
        && echo ${S3_BUCKET_CONF}
```

```bash:変数の設定:
S3_BUCKET_LOG="log-${AWS_ID}" \
        && echo ${S3_BUCKET_LOG}
```


0.2. EC2設定情報ディレクトリの指定
----------------------------------

```bash:変数の設定:
DIR_CONF_EC2='config-ec2-handson-20170213'
```

```bash:コマンド:
mkdir -p ${DIR_CONF_EC2}
```


0.3. AMI設定情報ディレクトリの指定
----------------------------------

```bash:変数の設定:
DIR_CONF_AMI='config-ami-handson-20170213'
```


0.4. Redmineのバージョンの指定
------------------------------

```bash:変数の設定:
VERSION_REDMINE='3.3.1'
```


1. 事前作業
===========

```bash:変数の設定:
FILE_INPUT="${DIR_CONF_EC2}/userdata.bash" \
        && echo ${FILE_INPUT}
```


2. 作成
=======

```bash:変数の確認:
cat << ETX

        FILE_INPUT:      ${FILE_INPUT}
        S3_BUCKET_CONF:  ${S3_BUCKET_CONF}
        S3_BUCKET_LOG:   ${S3_BUCKET_LOG}
        DIR_CONF_AMI:    ${DIR_CONF_AMI}
        VERSION_REDMINE: ${VERSION_REDMINE}

ETX
```

```bash:コマンド:
cat << EOF > ${FILE_INPUT}
#!/bin/bash
yum -y update
yum -y install ruby23 ruby23-devel
yum -y erase ruby20
yum -y install make gcc gcc-c++ automake autoconf
yum -y install zlib-devel libcurl-devel openssl-devel postgresql-devel
yum -y install httpd httpd-devel
yum -y install ImageMagick ImageMagick-devel ipa-pgothic-fonts
gem install bundler --no-rdoc --no-ri

# sync conf
aws s3 sync s3://${S3_BUCKET_CONF}/${DIR_CONF_AMI} /tmp/${DIR_CONF_AMI}

# get redmine
cd /tmp/${DIR_CONF_AMI}/
wget http://www.redmine.org/releases/redmine-${VERSION_REDMINE}.tar.gz
tar xzf redmine-${VERSION_REDMINE}.tar.gz
mv redmine-${VERSION_REDMINE} /var/lib/
cd /var/lib/
ln -s redmine-${VERSION_REDMINE} redmine

# setup redmine
cd /var/lib/redmine/
cp /tmp/${DIR_CONF_AMI}/database.yml /var/lib/redmine/config/
/usr/local/bin/bundle install \
  --without development test mysql sqlite \
  --path vendor/bundle
/usr/local/bin/bundle exec rake generate_secret_token

# setup passenger
/usr/bin/gem install passenger --no-rdoc --no-ri
/usr/local/bin/passenger-install-apache2-module --auto
/usr/local/bin/passenger-install-apache2-module --snippet > /tmp/http-passenger.conf

# setup apache
cat /tmp/${DIR_CONF_AMI}/httpd-redmine.conf /tmp/http-passenger.conf > /tmp/redmine.conf
mv /tmp/redmine.conf /etc/httpd/conf.d/
chown -R apache:apache /var/lib/redmine-${VERSION_REDMINE}
ln -s /var/lib/redmine/public /var/www/html/redmine

# start apache
service httpd start
chkconfig httpd on

# setup database (only 1st time)
#cd /var/lib/redmine/
#RAILS_ENV=production bundle exec rake db:migrate
#RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

aws s3 cp /var/log/cloud-init-output.log s3://${S3_BUCKET_LOG}/redmine-${VERSION_REDMINE}-$(date +%Y%m%d-%H%M%S)

# clean up
rm /tmp/http-passenger.conf
rm -R /tmp/${DIR_CONF_AMI}
EOF

cat ${FILE_INPUT}
```


3. 事前作業
===========


完了
====
ESXi5.xのバックアップとスナップショット


一定の変更かけるごとに、スナップショット取ってるから安心！とおもったら
そんなわけなかったのでメモ

#### メモ

+ スナップショットはバックアップではなく、スナップショットを切った時点から、別ファイルに差分を書き込み始める
+ スナップショットを切るごとに、ファイルが新しく作成され、新しいファイルに差分が書き込まれ始める (ex. vm-000001.vmdk vm-000002.vmdk)

    [ESXi / ESX における仮想マシン スナップショットについて](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1033239)
    [vSphere 環境でスナップショットを使用するベスト プラクティス](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1038295)
    [仮想マシンがスナップショットを使用しているかどうかを判断する](https://kb.vmware.com/selfservice/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=1004343)


+ 稼働しながらバックアップを取るには最適
    スナップショットを作成した時点で、元のディスクには書き込まれなくなるため、データが破損する恐れがない、たぶん

#### 準備

+ SSHログインを有効にする
    1. vSphereClientより、[ホーム]→[インベントリ]と移動
    2. [構成]タブを選び、セキュリティプロファイルを選択
    3. サービスのプロパティより、SSHを選び、有効化 

#### 作業

1. スナップショット作成
    vSphereClientより、バックアップを取る対象のサーバを選び、スナップショットを作成
        ** 対象サーバの[設定の編集]→[ハードディスク]でファイル名が(vm-000001.vmdk)のようになっていればスナップショット上で動作している **
        
2. バックアップ
    SSHでログイン後
    /vmfs/volumes/datastore[n]/VMNAMEの対象ファイルをコピー
    
3. スナップショット削除(マージ)
    vSphereClientより、バックアップを取る対象のサーバを選び、スナップショットマネージャからスナップショットを削除
    
#### 次にやりたいこと
GUIが必要ない部分
   +  スナップショット作成
   +  コピー
   +  スナップショットの結合

をCLIで行う(vim-cmdのオプションを調べる)


#### 参考にさせて頂きました。

http://qiita.com/rayymo0/items/e84865ec6f82ef68de14
http://blog.seeds-std.co.jp/entry/717.html