OmniAICreator/Qiita-1.07M huggingface dataset:
2016ウェブ開発で使えるCSS3の無料フレームワーク

# 2016 ウェブ系フレームワーク一覧

https://colorlib.com/wp/free-css3-frameworks/
http://designup.jp/maerial-design-framework-414/

デザイン系が弱いというか面倒なのでフレームワーク選定をしていきたいです。
ある程度的を絞ってフィジビリティは後ほど。

**A. アニメーションを作るのは好きなので、色とかフォームが一発でできる系のもの**
**B. フォームグリッドなどがメインで業務向けのテンプレートがさくっと行けそうなもの**

## Aカテゴリ
### 1 .[Material Framework](http://nt1m.github.io/material-framework/#introduction)

Googleのマテリアルデザイン
CSSのみを利用するのでJSでオリジナルアニメーションなどを実装したいヒトむけかな？

[Material-UI](http://www.material-ui.com/#/)というReact用のコンポーネントがあるのでNodeJSxReactの組み合わせで利用するのにはよいのかも。
NodeJSのサンプルが一発で動きます。
[こちら](https://github.com/callemall/material-ui-webpack-example.git)をクローンするだけで実行可能

### 2.[Materialize](http://materializecss.com/getting-started.html)
NodeJS用のnpm,Ruby Gemでのセットアップが簡単にできます。
あとでrubyに入れてやってみましょう。

2018/08/17
Rubyで実際に使ってみたので[追記](http://qiita.com/MariMurotani/items/e07aaaf4dfb5a92b0839)

## Bカテゴリ
### 1.[Leaf](http://getleaf.com/)
Googleのマテリアルデザインの派生系CSS系のライブラリだがデザインがかっちり決まっているので、データがあってそれをどう表示するかのレイアウトを決めるには良さそう。

### 2.[Bootstrap](http://getbootstrap.com/)
とにかく事例が多いので安定してそうです。
APIのマニュアルが充実してるのと、jquey方式の書き方なので移行しやすそうです。
Vagrant+VirtualBoxで"Warning: Authentication failure. Retrying…"を解決する方法

久しぶりにローカルでVargrant＋VirtualBoxで仮想環境立てた時に

ハマったのでメモがてら...

# まずは必要なもののインストール
### Vagrant
[https://www.vagrantup.com/downloads.html](https://www.vagrantup.com/downloads.html)から最新版をインストール。

### VirtualBox
[https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads)から最新版をインストール。
仮想環境の作成は Vagrant から行う。

# 仮想マシンの作成
今回は CentOS6.5 の イメージファイルを使います。
また、仮想環境の作成先ディレクトリは ~/develop/app としました。

```
$ vagrant box add centos6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
$ mkdir ~/develop/app
$ mkdir ~/develop/app
$ cd ~//develop/app
$ vagrant init centos6.5
```


# 仮想マシンにアクセスする
あとは下記のコマンドで仮想マシンにアクセスできるはず...

```
$ vagrant up
$ vagrant ssh
```

しかし、

```bash
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
```

`default: Warning: Authentication failure. Retrying...`????
どうやら認証が上手く行っていないみたいです。


# 原因と解決法
### 原因
**.sshdディレクトリのパーミッションが不適切だった**

### 解決方法
ゲストOS(今回だとCentOS6.5)の.sshdディレクトリのパーミッションの変更をしましょう

```
$ chmod 0700 /home/vagrant/.ssh
$ chmod 0600 /home/vagrant/.ssh/authorized_keys
$ chown -R vagrant /home/vagrant/.ssh
```


# 最後に
今回の原因以外にもSSHの秘密鍵と、ゲストOSで設定されている公開鍵があっていないことも考えられるのでこれで解決しない場合は下記の記事も参考にしてみてください。
[Vagrantで”Warning: Authentication failure. Retrying…”のエラーが出た時の対処法](http://kiraba.jp/vagrant-error-authentication-failure-retrying/)

参考：
[Vagrant で Ruby on Rails 4 の環境構築](http://qiita.com/Salinger/items/20f466ffe7cc0c04b010)
[vagrant upコマンド実行時にAuthentication failure.エラーが発生する](http://qiita.com/shyse/items/9ec50b868b90f847c75f)
[Vagrantで”Warning: Authentication failure. Retrying…”のエラーが出た時の対処法](http://kiraba.jp/vagrant-error-authentication-failure-retrying/)
Mac + Rails + Eclipse 開発環境/アプリケーションを３分で構築

仕事等で急遽Railsをやることになった方のために。

### 前提条件
Homebrew とEclipseは既にインストール済みとします。

### rbenvを入れる。rubyのバージョンを管理できるようにするため
```
brew update
brew install rbenv ruby-build
```

### 起動時に自動で初期化できるようにしておく
```
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

### 現在 インストール可能なバージョン等を確認
```
rbenv install -l 
```

### 入れたいrubyバージョンを入れる 
```
rbenv install 2.3.1
rbenv rehash
rbenv global 2.3.1
ruby -v
```

### Railsアプリに必要なgemをインストール
```
gem install bundler
gem install rails
rbenv rehash
```

### Eclipse に RadRailsプラグインを入れる。
Help > Install new Software で 以下のアドレスを追加。
```
http://download.aptana.com/studio3/plugin/install
``` 

Aptana Studio 3 plugin をインストールする

### Rails アプリケーションを作る
File > New > Rails ProjectからRailsアプリケーションのひな型がワークスペースに作ることができる。

既存のコード(リポジトリ)がある場合は File > New > Rails Project で出てきた画面のGenerate APPで Clone an existing git project を選ぶ。


### 起動
- Aptanaのツールバーが表示されている場合
aptanaのウィンドウ→ビューの表示→サーバー を選択し、プロジェクトとサーバーのタイプを選び作成

- Aptanaのツールバーが表示できない場合
Run > Rails Console からConsoleを開き、 rails server と打てば localhost:3000でたちあがる。
Cocos2d-x(JS) jsファイル読み込み方法

■Cocos2d-x (JS)のバージョン
cocos2d-x-3.12

■srcフォルダ内のjsファイルは、
project.jsonに定義して読み込まれています。

project.jsonファイルは、index.htmlと同じ階層にあります。

プロジェクトを作成すると最初に作られている、app.js、resource.jsも
project.jsonに定義されています。

jsファイルを追加する場合は、project.jsonに定義します。

project.jsonファイルの
"jsList":[]配列に、追加するjsファイルのパスを記述します。


例：

    "jsList" : [
        "src/resource.js",
        "src/app.js",
        "src/subLayer.js"
    ]


project.jsonファイルについての説明は、
main.jsの冒頭に、コメントとして記載されています。
AppleScriptを使うときに、わざわざスクリプトエディタ開かなくて済むようにAutomatorで保存

「Macでアプリケーションソフトの上部が枠外（画面の外）に出て動かせなくなった時の対処法 【第２弾 AppleScriptを使う】」
http://qiita.com/sararilfy/items/426393fbceb5438162c3


上記で、一発でウィンドウの移動はできるようになったのですが、
いちいちスクリプトエディタ開かないとできなくて面倒だったので、
ダブルクリック一つで実行可能なAutomatorに頼む。

やりかたはAutomatorヘルプに載っていました。
https://help.apple.com/automator/mac/10.10/index.html?localePath=ja.lproj#aut4bb6b2b4f

##1.Automatorを開く
![スクリーンショット 2016-08-16 10.11.13.png](https://qiita-image-store.s3.amazonaws.com/0/40940/d0a9800f-f03e-9c77-da9f-6cc193356f7a.png "スクリーンショット 2016-08-16 10.11.13.png")

##2.「アプリケーション」を選択
![スクリーンショット 2016-08-16 10.18.30.png](https://qiita-image-store.s3.amazonaws.com/0/40940/846c34a5-7ce3-d98e-1325-4181919b178f.png "スクリーンショット 2016-08-16 10.18.30.png")

##3.「ユーティリティ」の「AppleScriptを実行」をダブルクリック
![スクリーンショット 2016-08-16 10.19.15.png](https://qiita-image-store.s3.amazonaws.com/0/40940/eb08c58a-5a7f-81b5-802d-e2a756ef3b49.png "スクリーンショット 2016-08-16 10.19.15.png")


##4.AppleScriptを記入

```
tell application "System Events"
	set position of first window of application process "Adobe Photoshop CC 2015.5" to {0, 44}
	set size of first window of application process "Adobe Photoshop CC 2015.5" to {1920, 1080}
end tell
```

1回再生ボタンをクリックしてテストしてみると良い。
1度アクセス制限外してくださいと怒られる。システム設定の「セキュリティとプライバシー」で設定する。
![スクリーンショット 2016-08-16 10.02.21.png](https://qiita-image-store.s3.amazonaws.com/0/40940/d7e3f4d1-0b83-8326-1348-3e8014e58137.png "スクリーンショット 2016-08-16 10.02.21.png")


##5.「Ctrl」+「s」で保存
![スクリーンショット 2016-08-16 10.20.15.png](https://qiita-image-store.s3.amazonaws.com/0/40940/309b9fe5-0e55-1319-64c5-23c51883348c.png "スクリーンショット 2016-08-16 10.20.15.png")


##6.アプリケーション完成
![スクリーンショット 2016-08-16 10.21.22.png](https://qiita-image-store.s3.amazonaws.com/0/40940/47163d00-f898-0791-7abe-23dbef195f13.png "スクリーンショット 2016-08-16 10.21.22.png")

次回からこれをダブルクリックすれば、
何も開かずに、すぐ実行される！
CFSのvruntimeの状態遷移(メモ)

CFSのvruntimeの挙動、ど忘れしたので、メモ。このメモ書きはCFSのvruntimeの挙動だけしか書いていません。それ以外の箇所(rbtreeやそもそもの仕様)には特に言及しません。

### 大体の感じ
以下の図の通り。厳密な図ではありません。よって、いくつか抜けはありますが、大筋を理解する分には問題ないと思います。

![vruntime.png](https://qiita-image-store.s3.amazonaws.com/0/19975/ae01bf32-2adb-5108-ac17-df00c274a26b.png)

スレッドがfork()されるときに、schedule entityのvruntimeが0に初期化され、その後、cfs queueに突っ込まれます。
このとき、突っ込まれたcfs queue内にあるschedule entityのvruntime最小値(min_vruntime)が足されます。cfs queueにschedule entityを突っ込むときにこれを足すことで、「vruntimeが最小となるスレッドが実行スレッドに選ばれる」CFSの仕様を実現できます。

update_curr()によって、実行状態スレッドのvruntimeが更新されます。スレッド実行時間(delta_exec = now - curr->exec_start;)に諸々を加味した値をvruntimeに足します。

schedule entityがcfs queueから抜かれるとき、vruntimeからmin_vruntimeを引きます。min_vruntimeはあくまでも「該当するcfs queueにとってのみ」意味のある値だからです。
Windows10でiRuby Notebookを確実に動作させる手順(2016/8/16版)


# はじめに

iRuby Notebookは非常に強力なツールなのですが、LinuxおよびMacユーザーには知名度が高いものの、Windowsユーザーはインストールにおけるハードルの高さから利用者が少ないという現状があるようです。
そこで、SciRubyなどのRubyを用いた科学計算の一助になると思われることから、WindowsでiRuby Notebookを使えるようにする手順を整理しました。

# Anaconda(Python)のインストール

Anacondaは、Pythonと科学計算ライブラリをセットにしたパッケージです。これをインストールするとiRuby NotebookのベースになるJupyter Notebookが利用できるようになります。

以下のURLよりダウンロードできます。

https://www.continuum.io/downloads

32bit版と64bit版があるので、インストールされているWindowsにあわせてダウンロードしてください。
ちなみに僕はPYTHON 3.5を利用しました。

# Rubyのインストール

Rubyのインストールにも複数の方法がありますが、ここでは一番簡単なRubyInstaller for Windowsを使用します。

以下のURLよりダウンロードできます。
Anacondaと同じく、32bit版と64bit版があります。

http://rubyinstaller.org/downloads/

# DEVELOPMENT KITのインストール

Rubyのライブラリを追加インストールするために必要になるツールもインストールします。

RubyInstallerのサイトからダウンロードできます。

ダウンロード後、Rubyをインストールしたフォルダに「DevKit」というフォルダを作成して展開します。
展開した後、以下の手順でインストールします。

[32bit版の場合]

```bat:
> cd c:¥Ruby32¥DevKit
> ruby dk.rb init
> ruby dk.rb install
```

[64bit版の場合]

```bat:
> cd c:¥Ruby32-x64¥DevKit
> ruby dk.rb init
> ruby dk.rb install
```

# ZeroMQのインストール

JupyterとiRubyの通信に必要なモジュールとしてZeroMQをインストールします。

以下のURLよりダウンロードします。
しつこいようですが、32bit版と64bit版がありますので、Windowsにあわせてダウンロードしてください。

http://zeromq.org/distro:microsoft-windows

ダウンロード後、ZeroMQのインストールフォルダにあるlibzmq-v90-mt-x_x_x.dllをRubyをインストールしたフォルダのbin配下にコピーしてファイル名をlibzmq.dllに変更します。

[例] 64bit版の4.0.4をインストールした場合
「C:¥Program Files¥ZeroMQ 4.0.4¥bin」の中にあるlibzmq-v90-mt-4_0_4.dllを「C:¥Ruby23-x64¥bin」にコピーし、名前の変更で「libzmq.dll」にする。

# ffi-rzmqのインストール

ZeroMQをRubyで使用するためのGemをインストールします。

```bat:
> gem install ffi-rzmq
```

## 動作確認

コマンドプロンプトで以下のコマンドを実行し、Gemの読み込みに成功すればtrueとなりインストール成功です。

```bat:
> irb
irb(main):001:0> require "ffi-rzmq"
=> true
irb(main):002:0>
```

もし、失敗する場合は、ZeroMQのインストールフォルダのbin配下にある他のdllファイルを同じようにコピー&名称変更して試してみてください。僕の環境では上記手順で成功しました。

# iRubyのインストール

以下のコマンドを実行してインストールします。

```bat:
> gem install iruby
```

# iRubyの実行

以下のコマンドでiRuby Notebookを起動すると、ブラウザが立ち上がりホーム画面が表示されます。

```bat:
> iruby notebook
```

新しいノートブックを作成する時は、画面の右上にある「New」ボタンを押して「Ruby 2.3.1」を選択します。

![VirtualBox_Windows10_MBA_16_08_2016_11_33_55-a.png](https://qiita-image-store.s3.amazonaws.com/0/114240/602d0034-24ff-3166-eb48-dce9b2a3afc9.png)

※ 画面の環境はRubyの32bit版と64bit版が両方入っていますが、通常は「Ruby 2.3.1」一つしか表示されません。

もし、新規作成にてRubyが表示されない場合は、以下のコマンドを試してください。

```bat:
> iruby register --force
```

もし何かお困りのことがあれば [scirubyのslackチーム](https://sciruby-slack.herokuapp.com/)に参加して、気兼ねなくご質問下さい。また、インストール成否のレポートなどを頂けるととても助かります！！

以上で手順は終了です。
Have fun!!
User.where('name = ? OR age = ?', nil, nil) は使えない

`User`モデルの`name`か`age`が `nil`を探す時に少しハマったのでメモ。

```.rb
User.where('name = ? OR age = ?', nil, nil) 
```

は使えません。

```.rb
User.where('name IS NULL OR age IS NULL')
```

を使いましょう。

### 参考

http://stackoverflow.com/questions/5906639/rails-conditional-query-with-nil
CSSアニメーションを作るときはChromeデベロッパーツールのAnimationsが便利


# CSSアニメーションは直感的じゃないから作りづらい

CSSでアニメーションを作るとき`@keyframes`を使います。オブジェクトを拡大縮小するアニメーションなどは次のようなスタイルで指定します。

```css
@keyframes scale-anime {
  0% {
    transform: scale(1);
  }

  33% {
    transform: scale(2);
  }

  66% {
    transform: scale(0.75);
  }

  100% {
    transform: scale(1);
  }
}

.el {
  animation: scale-anime 1s linear;
}

```

1秒間の0%、33%、66%、100%の地点のscale値を指定しているのですが、どのようなテンポでどのようなイージングでアニメーションされるのかわかりづらい。。。

# CSSアニメーションを作るときはChromeデベロッパーツールのAnimationsが便利

Web開発者にはお馴染みのChromeデベロッパーツール。デベロッパーツールの機能の中に「Animations」があり、CSSアニメーションのテンポや尺(時間)を調整できます。

まずは、作成したアニメーションをChromeで表示し、デベロッパーツールを開きます。

![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/55103/039706c7-7464-6481-2d13-c0af4ba1c43c.png)

デベロッパーツールが開いたら、ウィンドウの右上にある「・・・」の中にある「Show console」をクリックしてconsoleを開きます。

![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/55103/52f593c2-813f-faba-2737-43dd60b528bf.png)

consoleが開いたら、consoleの左上にある「・・・」の中に「Animations」があるのでクリックして開きます。

![cap3.png](https://qiita-image-store.s3.amazonaws.com/0/55103/c3d43a94-6c39-f77f-d19c-0adc095beb95.png)

これが「Animations」です。CSSアニメーションが動いていると、自動で一覧にしてくれます。各ポイントを移動すると、その内容が表示されているCSSアニメーションに反映されます。

![cap4.png](https://qiita-image-store.s3.amazonaws.com/0/55103/a59d4751-8270-2486-5ffb-b1e8d5e42ed1.png)

ポイントを前の方にずらして確認。

![cap5.png](https://qiita-image-store.s3.amazonaws.com/0/55103/f9b072a2-73dd-76cd-1566-021981afdad7.png)

# 感覚はつかみやすくなったか...？

アニメーションの調整は秒数やサイズを小数点レベルで調整するので、それをブラウザ上で確認できるのは効率的かと感じました。ですが、現在はアニメーションのテンポや尺の調整が主な機能なようなのでもう少し細かなパラメーターまで調整できるとうれしいですね :open_mouth:
MacにElectronをインストール

Mac端末配下にElectronをインストールした際のメモ
## 環境
Electronをインストールした時の各環境は以下のとおり
* Mac 10.11.6
* Node V6.3.1
* npm 3.10.3
* Electron 1.3.3

Macへのnodeのインストールは[別記事参照](http://qiita.com/hal_99/items/333aece2926a4c4a4940)

## インストール
```
$ npm install -g electron
$ npm install -g electron-packager
```
(2016.08.17補足:electronで作ったアプリを配布するためのelectron-packagerを追加)

上記でインストール完了。nodeとnpmが入っていれば、今回の組み合わせは何も問題ない
which electronでelectronがインストールされた場所を確認して、 $ electronで起動できることを確認(コマンドと起動画面は下記参照)

```
$ electron
```
---
<img width="789" alt="electron起動画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/122213/09c2a016-7cf6-f1e7-62a2-6fad03e4ffc4.png">
ng2-dndを使って、Angular2でドラッグアンドドロップ

Angular2でドラッグアンドドロップ(DnD)を実装するためのライブラリとして、[ng2-dnd](https://github.com/akserg/ng2-dnd)があります。
HTML5のDnD処理に準拠した形で実装されているライブラリで、簡単にDnDが実装できます。

#ng2-dndのインストール
npmコマンドでインストールできます。
`
npm install ng2-dnd --save
`
#ng2-dndを使う準備
最近、Angular2のrc5がリリースされ、NgModuleに使用するディレクティブやプロバイダーを記述できるようになりましたので、そちらのやり方でエントリポイントのtsファイルを記述してみます。

```ts:app.ts
import "core-js";
import "rxjs/Rx";
import "zone.js/dist/zone";

import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
import { Component, NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { DND_PROVIDERS, DND_DIRECTIVES } from "ng2-dnd";// v1.13.0より前 "ng2-dnd/ng2-dnd";

@NgModule({
    declarations: [
      AppBodyComponent,
      DND_DIRECTIVES
    ],
    imports: [BrowserModule],
    bootstrap: [AppBodyComponent],
    providers: [DND_PROVIDERS]
})
class AppModule {
}

platformBrowserDynamic().bootstrapModule(AppModule);
```
ng2-dndを使うためには、declarationsにDND_DIRECTIVES、providersにDND_PROVIDERSを記述します。

index.htmlはこんな感じ。
webpackを使っているので、読込はbundle.jsだけ。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <title>Hello DnD</title>
</head>
<body>
  <app-body>Loading…</app-body>
</body>
<script src="./js/bundle.js"></script>
</html>
```

#ng-dndの記述
めんどいので、エントリポイントと同じapp.tsに今回は記述します。

```ts:app.ts
@Component({
  selector: "app-body",
  template: `
      <!-- ドラッグ側 -->
      <div *ngFor="let drag of drags"
        dnd-draggable [dragEnabled]="true"
        [dragData]="drag">
        <div>
          <div>{{drag}}</div>
        </div>
      </div>

      <!-- ドロップ側 -->
      <div
        dnd-droppable (onDropSuccess)="drops.push($event.dragData)">
        Place to drop
      </div>
      <div *ngFor="let drop of drops">
        {{drop}}
      </div>
  `
})
class AppBodyComponent {
  public drags: Array<string> = [
    "Hello World!",
    "Hello Angular2",
    "Hello DnD"
  ];
  public drops: Array<string> = [];
}
```

ドラッグ側では、`dnd-draggable [dragData]="drag"`を記述。
[dragData]の右辺は、ドロップ側に渡されるデータ($event.dragDataに格納されるデータ)。
ドロップ側では、`dnd-droppable (onDropSuccess)="drops.push($event.dragData)"`を記述。
(onDropSuccess)の右辺は、ドロップ時の処理を設定。今回は直接処理を記述していますが、関数化して記述するのが一般的かと。
ドラッグ側、ドロップ側共にほかにも設定可能な項目がいっぱいありますが、説明は省略。
#結果
webpackを使って、tsファイルをbundle化して実行すると、次の画像のようになります。
上の3つの文字列をPlace to dropにドロップすると、下の文字列が増えていきます。
カーソルが映ってないですが、右側にある半透明な部分がドラッグ中の画像。
![image](https://qiita-image-store.s3.amazonaws.com/0/115996/947beff0-4572-e5f6-1d26-5f731ca9ee16.png)
【Ruby】無からカウンタを生み出す方法

## やりたいこと
デバッグなどのちょっとしたときにカウンタを使いたい場合があると思います。ひとまず、とりあえず、殴り書くとしたらこんな感じでしょうか。

```ruby
c = 0
3.times do # なんらかの繰り返し
  p c += 1
end
# => 1
# => 2
# => 3
```

このときブロックの外にある `c = 0` がなんとなくゆるせへん、というところに本稿は端を発します。

クロージャや便利メソッドを用いたとしても、大抵はブロックの外で準備をする必要があり、本稿で目指すところではありません。目指すところは、その一行を挿入するだけで機能する以下のようなカウンタです(1からでなくてもよい)。

```ruby
3.times do # なんらかの繰り返し
  p # なんらかのすごいカウンタ
end
# => 1
# => 2
# => 3
```

また、無から生み出すということで参考ページの [IQ1450で美少女JSの先輩から、Rubyで無から有を生み出す方法を教わった - Qiita](http://qiita.com/supermomonga/items/79d985f4dfd3603afffe) において設けられている以下の縛りを導入します。

> * 一度宣言・初期化した変数は他の式・文で使用しない
> * 演算子および演算子風のシンタックスシュガーが導入されたメソッド、及び代入、また括弧のみが使用できる

## できたもの

```ruby
3.times do # なんらかの繰り返し
  p $c = !$c && ($c <=> $c) || $c + ($c <=> $c)**($c <=> $c)
end
# => 0
# => 1
# => 2
```

いい感じに最悪になりました。
グローバル変数 `$c` はここで初めて使用されます。
一応 `1` や `0` を使うことも避けています。

## なんだこれ
これはグローバル変数を使用しているので、厳密には参考ページで説明されている「存在しないローカル変数に値を代入しようとしたとき `nil` で初期化される」という仕様を悪用できていません。

とはいえグローバル変数も最初は `nil` なのでいきなり `$c += 1` とすることはできません。そのため `$c` が `nil` のときは `||` の右辺が評価されないようにしています。

グローバル変数は既に `nil` として存在しているとも言えるので無から生成したかと言われると微妙な感じになってしまいましたが、グローバル変数は縛られてなかったので見逃してください。

## おまけ
上記のカウンタをつくる過程で生まれたその他の1行カウンタです。
`0` と `1` は無から生み出せることがわかっているので普通に使っています。
縛りを無視してメソッドも普通に使っています。

```ruby
$c = $c.to_i.succ
```

```ruby
$c = $c ? $c + 1 : 0
```

```ruby
$c = $c + 1 rescue 0
```

他にも縛りを守った上でもっと簡単に書けるよ、という1行カウンタがありましたらぜひコメントにて教えていただけると幸いです。

## 参考ページ
 [IQ1450で美少女JSの先輩から、Rubyで無から有を生み出す方法を教わった - Qiita](http://qiita.com/supermomonga/items/79d985f4dfd3603afffe)
フルスクラッチ(写経)でRadioGroupとRadioButtonを実装してみた

Android 標準で用意されているViewをフルスクラッチで作ってみる(写経)試みをしてみた。

んで、今回はRadioGroupとRadioButtonをフルスクラッチで実装してみた。

とりあえず成果はGithubに置いてあります。

本記事に書いてあることもだいたいREADMEにまとめてます。

https://github.com/operando/FullScratchRadioGroup

# Full scratch RadioGroup and RadioButton

Android 6系のコードをBaseにフルスクラッチでRadioGroupとRadioButton的なViewを写経して実装してみた

「動機、実装前に気になったこと」の部分をカバーできる範囲の最低限の実装になってる


## 動機、実装前に気になったこと


### RadioGroupとRadioButtonみたいにRadioButtonにClickListenerみたいなの設定しなくても、親のListenerに通知が来るって実装はどうやってるのか気になった

* ViewGroup.OnHierarchyChangeListenerを使ってる
 * Viewの階層に変更があると呼び出されることをうまく使ってる
* ViewGroup.OnHierarchyChangeListenerのonChildViewAdded method内で追加されるRadioButtonに対して内部で作ったCompoundButton.OnCheckedChangeListenerを設定してる
 * この内部で作ったOnCheckedChangeListenerのonCheckedChanged method内でRadioButtonのチェック状態やチェックしてるViewのidなどを変更している
* 実際にはCompoundButton.setOnCheckedChangeWidgetListenerに設定してる
 * hideのAPIなので普通には使えない
 * http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/core/java/android/widget/CompoundButton.java#176
 * なんで普通のsetOnCheckedChangeListener使わないのかは、内部で設定してるListenerが上書きされると正常に動作しなくなるからだと思われる
 * javadocにも「This callback is used for internal purpose only.」って書いてあるからやっぱり内部実装用のListenerってことになる
 * hideだったので、FullScratchRadioButtonに同じように内部で使う用のListenerの口を用意してあげた


### RadioButtonにidを振ってなくても各Buttonがそれぞれ別々のButtonとして認識されているのはどうやってるのか気になった

* viewにidが振られていなかったら[View.generateViewId](https://developer.android.com/reference/android/view/View.html#generateViewId%28%29) methodでViewのidを作成して、setIdしてる
* View.generateViewId methodはAPI Level 17から追加されたもので、それ以下のバージョンでどう生成してたのか
 * hashCode methodの戻り値をViewのidにしてた

## 実装してみてわかったこと

* 動的にViewのidを生成するなら[View.generateViewId](https://developer.android.com/reference/android/view/View.html#generateViewId%28%29)を使うのが良さそう
* ViewGroup側で子Viewのクリックイベント等をハンドリングしたい場合に、ListenerをセットしてもいいがListenerが上書きされる危険性はある
 * なので子ViewもCustom Viewにして別口のListenerを作る or setじゃなくてadd Listener的なものがあればそっちにセットするほうがいい
 * 特にRadioGroupとRadioButtonみたいに親と子が密接に関連してるものは
* 親と子が密接？に関連しているViewを作る場合のノウハウを学ぶのに最適だった
* ViewGroup.OnHierarchyChangeListener使えばCustom GroupView作って色々できそう


## 主な実装

* [FullScratchRadioGroup](https://github.com/operando/FullScratchRadioGroup/blob/master/app/src/main/java/com/os/operando/fullscratchradiogroup/widget/FullScratchRadioGroup.java)
* [FullScratchRadioButton](https://github.com/operando/FullScratchRadioGroup/blob/master/app/src/main/java/com/os/operando/fullscratchradiogroup/widget/FullScratchRadioButton.java)


## Link

* http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/core/java/android/widget/RadioGroup.java
* http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/core/java/android/widget/RadioButton.java
* http://tools.oesf.biz/android-4.0.3_r1.0/xref/frameworks/base/core/java/android/widget/RadioGroup.java
 * 後方互換のために読んだ
* https://developer.android.com/reference/android/widget/RadioGroup.html
* https://developer.android.com/reference/android/widget/RadioButton.html
* [カスタムビューでタッチイベントを受け取れない問題](http://android-note.open-memo.net/sub/trouble__cannot_catch_touch_event.html)
 * これが正しいかわからないが、FullScratchRadioButtonをタップしても全くタッチイベントが飛ばなくて仕方なくこれと同じような感じで実装した
 * ちゃんと理由を知る必要がありそう
BeagleBoneのsquidのポートを8080にすると動作しないときの対処法

#症状
DebianをインストールしたBeagleBoneにsquidをインストールしたプロキシサーバ(8080番ポート)に接続できない．
でも，標準のポート番号だとアクセスできる．(ポートを8080にすると接続できない)

#環境
・beaglebonegreen
・debian 8.4
・squid 3.4.8

#原因
BeagleBoneの8080番ポートはApacheがすでに使っていることが原因

ブラウザから`beagleboneのIPアドレス:8080`と入力してwebページが表示されればApacheが動作しています．

#対処法
BeagleBoneに8080番ポートを割り当てるのではなく，8008番ポートを割り当てることで解決されました．

まずは，設定ファイルを開きます

```
sudo vim /etc/squid3/squid.conf
```

次のような行の下辺りに

```
Squid normally listens to port 3128
```

次の行を入力します

```
http_port 8008
```

Esc，:wqで終了

squitd3を再起動します

```
sudo /etc/init.d/squid3 restart
```
IP範囲指定で/22とか/23を/24単位に分割するロジックをPython考えてみた

OSC2015Tokyo/Springでセミナー「全自動Zabbix」を聞いて、ネットアークディスカバリを広いレンジで登録すると探索に時間がかかるので、分割して登録した方がよいと言うお話が…
でも、「レンジを計算して分割するのめんどうだなー」っと…
と言う訳でPythonの勉強がてらIP範囲指定で/22とか/23を/24単位に分割するロジックを考えてみました。

IP分割するロジックです。
これロジックテストなので、変数名とか適当です。(言い訳)
きたないですねーA(^_^;

```py3
import sys

io = sys.argv[1]

tmp = io.split("/")

ip     = tmp[0]
prefix = tmp[1]

tmp = ip.split(".")
o1 = tmp[0]
o2 = tmp[1]
o3 = tmp[2]
o4 = tmp[3]

sum = (int(o1) << 24 | int(o2) << 16 | int(o3) << 8 | int(o4) ) & 0xFFFFFF00
sum = sum >> (32-int(prefix))
sum = sum << (32-int(prefix))

for i in range(0, 2 << (24 - int(prefix) - 1)):
    a = sum | i<<8
    o1 = (a & 0xFF000000) >> 24
    o2 = (a & 0x00FF0000) >> 16
    o3 = (a & 0x0000FF00) >> 8
    o4 = 0

    a = str(o1) + "." + str(o2) + "." + str(o3) + "." + str(o4) + "/24"

    print a
```

実行結果
![adc61fa5e5778d323d28c90526a81b6e.png](https://qiita-image-store.s3.amazonaws.com/0/103473/45421077-14eb-ffdf-ca53-555f474b3dd2.png)

WindowsでPython… A(^_^;



後はZabbixAPIのを使って分割したIPを登録すれば良いわけで…

PythonでZabbixAPI実行するのは下記の記事を見ると簡単にできます。
[PyhtonでZABBIX APIを触ってみる](http://www.zumwalt.info/blog/2012/11/pyhton%E3%81%A7zabbix-api%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/)

記事にも書いてありますが、私も最初はpycurl使ってましたが、urllib2に切り替えました。A(^_^;

PythonでZabbixAPIを使う時、リクエスト用のxxx.jsonを作っておくと便利です。
そのファイルをjson.loadで読み、paramsのauthと各種パラメータを置き換えて投げれば言い訳でプログラム中でリクエストを全て書く必要がありません、便利ですね。
150種類以上のシンタックスに対応した「Boostnote」がアップデートでどんどんいい感じに

![Boostnote.png](https://qiita-image-store.s3.amazonaws.com/0/34809/b75a1d77-8f6c-bf27-4113-785496afcca5.png)

昨年のリリースから使い続けているノートアプリの「Boostnote」
各種アップデートやOSS化など今現在も着実に進化をしていますが、最近のVer0.6.xのアップデートで個人的にかなり嬉しい機能が追加されました。

# Boostnote？
まず、Boostnoteについて少しご説明。

Boostnoteは、”プログラマーの開発に特化したメモ帳”をコンセプトにしているアプリです。

Evernoteなどのメモアプリでは、シンタックスハイライトされない・・、重い・・・、プライベートの情報を混ざって検索性が悪い。等の問題がありますが、Boostnoteなら開発系のメモをサクサクとれて、サクサク検索できます。

![Boostnote_002.png](https://qiita-image-store.s3.amazonaws.com/0/34809/10f0a99c-bf96-6120-1db2-e228b4c38e4c.png)

１５０種類以上のシンタックスに対応しているので最高です。
もちろん、Markdownにも対応しています。

# 新機能「Storageの選択が可能に」（複数PC間で同期できる）
今までのバージョンでは、データを保存するStorageが選択できず固定でしたが、0.6.xから選択可能になりました。


※Google DriveやDropboxなどのオンラインストレージへは現状未対応で、近日対応予定とのことです。

保存先が選択できるようになったことで、PCにインストールしたオンラインストレージの同期ディレクトリを指定することができ、複数のPC間で情報の同期が可能になります。
今までは、複数PC間での情報同期が課題でしたが、これで解決しました。

![Boostnote_001.png](https://qiita-image-store.s3.amazonaws.com/0/34809/7fbda302-6200-ee27-1c00-5e134b65c92d.png)


# Snippetを簡単にコピーできる
この機能は以前からありましたが、便利機能なので紹介します。

ショートカットでBoostnoteのFinderを一時的に表示し、”return”でコピーすることができます。

以下の画像は、Finderを表示し、Snippetを検索（"テスト"で検索）、対象の項目（画像の真ん中の列）を選択し、”return”でコピーしています。
![Boostnote_003.png](https://qiita-image-store.s3.amazonaws.com/0/34809/ea6355d8-ae19-db90-f240-455d64a89128.png)

これで、一番右に表示されている内容がクリップボードにコピーされています。

ためておいたSnipetを簡単に使用することができます。


バージョンアップが頻繁にされているので、今後のBoostnoteにも注目です。

■Boostnote
https://b00st.io/jp/

---
2016-10-17追記：
チーム版の先行登録が開始されました。
http://qiita.com/naitwo2/items/3a1c07e1b4a930e69eaa
minikubeでローカルKubernetes クラスタを作成してみた

## 参考

* [minikubeでローカルKubernetes 1.2/1.3クラスタを5分でつくる方法 - Qiita](http://qiita.com/mumoshu/items/8f55ee830d8e5c172dd4)

* minikubeはKubernetes公式のツール
    * [kubernetes/minikube: Run Kubernetes locally](https://github.com/kubernetes/minikube)

## 導入

* virtualboxが必要。kvmやxhyveなどで動かす場合は別途[driverインストール](https://github.com/kubernetes/minikube/blob/master/DRIVERS.md#kvm-driver)。

```bash:kubectlの取得
curl -Lo kubectl \
  https://storage.googleapis.com/kubernetes-release/release/v1.3.4/bin/linux/amd64/kubectl
chmod +x kubectl
```

```bash:minikubeの取得
curl -Lo minikube \
  https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
```

```bash:クラスタ作成
./minikube start
```

* ~/.minikube/machines/minikubeVM/ に仮想マシンが保存される。

## kubectl

```rb:
kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=8080
kubectl get pods
curl $(./minikube service hello-minikube --url)
minikube stop
```

* その他

```bash:minikubeVMにssh
./minikube ssh
```
OS クリーンインストール後、更新プログラムを確認しています...と表示され、Windows Update ができない

## 背景
Windows 7 をクリーンインストール後、Windows Update が実行されない……

## 解決方法
下記更新プログラムをインストールすると良いみたい。

■ Windows 7 および Windows Server 2008 R2 用 Windows Update クライアント: 2016 年 3 月
https://support.microsoft.com/ja-jp/kb/3138612

## 補足
Windows Update して更新プログラムを確認しています... 状態になった後に、上記の更新プログラム(KB3138612) を実行したが、進まなかった。
そこで、一旦再起動して、Windows Update を走らせる前に KB3138612 を実行すると、正常にインストールすることができた。

> 更新プログラムの確認で競合？でもしていたのだろか??

### 参考
http://blog.treedown.net/entry/2016/04/04/001500
【今更】ZabbixのAdminパスワードのリセットとか…

色々な環境でZabbixを使っている場合、他の環境のZabbixのデータを引っこ抜いてきて手元のZabbix入れることもあると思います。

そんな使い方される人は、以下の設定の為にZabbix Web GUIにログインできない状況に遭遇してたりしませんか？

・認証にLDAPを使っている
・Adminアカウントのパスワードが変わっている
・Adminアカウントがなくパスワードが分かっているZabbixユーザやZabbix管理者のアカウントをZabbix特権管理者にしたい
 
そんな時は下記のSQLでデフォルトに戻してやります。

■認証を標準(ZabbixのDBのパスワードを使用する)に戻す。

```sql
UPDATE config SET authentication_type=0;
```

■Adminのパスワードをリセット(zabbixに変更)する

```sql
UPDATE users SET passwd='5fce1b3e34b520afeffb37ce08c7cd66' WHERE alias = 'Admin';
```

■Adminアカウントがなくパスワードが分かっているZabbixユーザやZabbix管理者のアカウントをZabbix特権管理者にしたい

```sql
UPDATE users SET type=3 WHERE alias='アカウント';
```

大したことではないのですけど、知らないと困るよな的な…A(^^;
GUIアプリケーションの設計について

最近、C#を使ったWindowsアプリケーションの保守をしているのだが、作られたアプリのソースがとかく読みにくい・・・・。
それは
「イベントハンドラに入力チェックと業務ロジックとGUIの操作が混在していて、何をやっているのかわからない」
言い換えると、
「・入力チェックを行うクラス、業務ロジックを行うクラス、GUIを操作するクラスがお互い参照しあってがゆえにアプリケーションが密結合になっている、所謂、参照がスパゲイティになっている」
からではないだろうかと、自分の中では、そう想定しています。

自分ではロジックの複雑さを軽減するため、業務でGUIを作成する時、イベントハンドラは
１．View層→Model層のデータバインド
２．入力チェック
３．業務ロジックの実行
４．Model層→View層のデータバインド
５．GUI部品の操作
というように、処理の流れを表すメソッド（サブルーチン）記述するにとどめ、具体的な処理はメソッド（サブルーチン）に書いたほうがソースの可読性が上がると考えいますが、一方で、そのように実装されたアプリを現場レベルでは見たことがありません。

それはなぜなのか、自分の想定は間違っているのか？ということを検証するために
http://qiita.com/triple4649/items/d111ef04f8d7a8efbfb0
という記事をか書きました。
記事を通して具体的なコードを書きながら、C#におけるGUIアプリのあるべき姿を模索している最中です。
rbenvのインストール(Homebrew)

# 1.準備(HomebrewのFormulaのupdate)
ターミナルを起動し、以下のコマンドを入力します。
>$ brew update

# 2.openssl、readlineのインストール
以下のコマンドを入力します。
>$ brew install openssl
>$ brew install readline

# 3.ruby-buildのインストール
以下のコマンドを入力します。
> $ brew install ruby-build

# 4.rbenvのインストール
以下のコマンドを入力します。
> $ brew install rbenv

# 5.rbenvのパスを追加します。
> $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
> $ echo 'export PATH="$HOME/.rbenv/shims:$PATH"' >> ~/.bash_profile
> $ source ~/.bash_profile
【今更】Zabbixでログ監視するときのencodingに設定する文字コードの指定の仕方

今更ですがZabbixでログ監視するときのencodingに設定する文字コードの指定方法です。

まず、Windowsとその他で大きく異なります。

■Windowsの場合
[Code Page Identifiers](https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd317756(v=vs.85).aspx) の「Identifier」か「.NET Name」がencodingに使用できる値となります。
※：大文字・小文字は関係なし

例えば「シフトJIS」を指定する時は「932」または「shift_jis」となります。

気をつけなければいけないのは「日本語EUC」
表を見ると「20932」「 EUC-JP」と「51932」「euc-jp」があります。
Windowsのログ監視で「EUC-JP」 指定するとIdentifier「20932」を指定されたと認識します。
「日本語EUC」で「 EUC-JP」「20932」をencodingに指定して文字が化ける時はencodingに「51932」を設定してみてください。

■Linux等
対象マシンで「iconv -l」を実行して頂くと使用できる文字コード一覧が表示されます。 
その中から該当すると思われる文字コードをencodingに設定します。
文字コードは使用しているiconvのバージョン等によって異なる場合がありますので注意してください。 


該当する文字コードが複数表示される場合があります。
その場合は「iconv -f {変換元文字コード} -t {変換先文字コード} {変換元ファイル} > {変換先ファイル}」 を実行し文字化けしないか確認します。
※：変換先文字コードはUTF-8を指定してください。
マージンの調整


m-a-1のような3個の英数字をハイフンで連結したクラスは、間隔(spacing)の設定に使われます。

```html:sample.html
<div class="card m-a-1">
  <p>Hello, world!</p>
</div>
```

1文字目のmはマージンを意味します。この文字をpで置き換えると、パディングを設定するクラスになります。
2文字は対象となる辺を表します。

|文字|対象となる辺|
|:-:|:--------:|
|t|上辺|
|r|右辺|
|b|下辺|
|l|左辺|
|x|右辺と左辺|
|y|上辺と下辺|
|a|四辺|
gitのトラブルシュート（自分用）

完全に自分用・・・随時追記予定・・・


##Git cloneをhttpsでやった後でプロトコルをsshにする方法です。

###背景
github 上のリポジトリをgit cloneした後、Pushしようとすると失敗する。

###原因
プロトコルがSSHではなくHTTPSになっていた。（クローン時にHTTPSでクローンしたため）


###解決方法

リモートリポジトリ(origin)がどちらになっているか確認
`git remote -v`

SSHに変更する
`git remote set-url origin git@github.com:user/repo.git`


###解決の前提

対象のリモートリポジトリに対するSSH設定が完了していることが前提
Chrome機能拡張の設定をVivaldiに移行する方法


今まで[Chrome](https://www.google.co.jp/chrome/)を使ってたけど、[Vivaldi](https://vivaldi.com/)に乗り換えてみようって人で、これまで使っていた機能拡張を丸ごとVivaldiでも使い始めたい人向け。
いろいろ弄ってみたらとりあえず行けたので。

**Mac版Chrome 52.0.2743.116、Vivaldi 1.3.551.30で確認しました。**
**非公式な方法につき、将来のバージョンでは上手く行かなくなるかもしれません。**
**以下、自己責任でお願いします！**

## Chromeのプロファイルの場所(移行元)

Windowsなら

```
C:\Users\ユーザー名\AppData\Local\Google\Chrome\User Data\Default
```

Macなら

```
/Users/ユーザー名/Library/Application\ Support/Google/Chrome/Default
```

## Vivaldiのプロファイルの場所(移行先)

Windowsなら

```
C:\Users\ユーザー名\AppData\Local\Vivaldi\User Data\Default
```

Macなら

```
/Users/ユーザー名/Library/Application\ Support/Vivaldi/Default
```

## 移行手順

Chromeのプロファイルフォルダの配下に```Extensions```フォルダ、```Local Extension Settings```フォルダ、```Preferences```ファイルがあると思います。

+ ```Extensions```フォルダをVivaldi側のプロファイルフォルダ配下に丸っとコピーします。
+ ```Local Extension Settings```フォルダをVivaldi側のプロファイルフォルダ配下に丸っとコピーします。
+ ```Preferences```ファイルの中の```"extensions"```キーの中身(**下記の2箇所**)を、Vivaldi側の```Preferences```ファイルに丸っと移植します(JSONフォーマットなので、移植はお好みのテキストエディタで)。

```
"extensions":{"alerts":{〜〜〜
```

```
"extensions":{"settings":{〜〜〜
```

## 不具合？
現状、ウィンドウ右上に機能拡張のアイコンが出るものと出ないものがあるようです。また、物によっては正常動作しないものもあるっぽいですね。
こればっかりは今後に期待するしかなさそうです。

以上！
ひらめいったーに蓄積された約1万個のアイデアを配布する

ひらめいったー
http://ryogrid.net/idea/top

に蓄積された約1万個のアイデアをテキストでエキスポートしてみたので欲しい人は持って行って下さい。
ブレインストーミングとかに使うと良いかもしれません。

http://ryogrid.net/~ryo/dist/ideas.txt
文字コードはUTF-8です。

以上。
ec2のファイルをsshfsでマウントする時、root以外のユーザーでもマウントしたファイルにアクセスできる様にする

#オプションの意味を知らずに作業してたのでハマった

ec2上のディレクトリをマウントしたかったのでググったら、リモート上のファイルをマウントする時はsshfsを使うというのが出てきたので早速実行

```
sudo sshfs -o IdentityFile=[秘密鍵の絶対パス] ec2-user@[インスタンスのパブリックドメイン]:[対象のディレクトリのパス]　　[マウント先のディレクトリのパス]

```

無事にマウントできたがroot権限がないとファイルにアクセスできない。ググったら `-o allow_other` を指定するとrootを含めた他のユーザーがアクセスできるようになるらしい


```
sudo sshfs -o allow_other IdentityFile=[秘密鍵の絶対パス] ec2-user@[インスタンスのパブリックドメイン]:[対象のディレクトリのパス]　　[マウント先のディレクトリのパス]

```

で実行すると`bad mount point IdentityFile= ~~~~~ `と出てきた。


#解決策
解決策という程でもないが、どうやら-oオプションはallow_other と　IdentityFile= ~~~~　に１つずつ指定必要があるらしい

```
sudo sshfs -o allow_other -o IdentityFile=[秘密鍵の絶対パス] ec2-user@[インスタンスのパブリックドメイン]:[対象のディレクトリのパス]　　[マウント先のディレクトリのパス]

```
FabricとCuisineとJinja2を組み合わせてみた

メモなので雑です。
こういうこともできたよということで

# やりたいこと
複数のDjangoアプリを開発をしていて、FabricとCuisineを使ってデプロイをする。
githubに載せたくないsettings.py内の記述や環境（development, staging, production）によって異なる変数があるので、それらをローカルのファイルからリモートサーバーのファイルに反映させたい

## コード

### テンプレートファイル
```py:project_root/settings/production.py

# 共通の設定項目は全環境でproject_root/settings/common.pyで共通に持たせてます。

from sample_app.settings.common import *

SECRET_KEY = '{{ secret_key }}'

DEBUG = False

ALLOWED_HOSTS = ['127.0.0.1']

DATABASES = {
    'default': {
        'ENGINE': '{{ databases.default.engine }}',
        'NAME': '{{ databases.default.name }}',
        'USER': '{{ databases.default.user }}',
        'PASSWORD': '{{ databases.default.password }}',
        'HOST': '{{ databases.default.host }}',
        'PORT': {{ databases.default.port }},
    }
}

```

### yamlファイル
値は適当にしてます

```yaml:secrets.yml
django:
  settings:
    production:
      secret_key: ''
      databases:
        default:
          engine: django.db.backends.mysql
          name: sample_app
          user: root
          password: ''
          host: 127.0.0.1
          port: 3306
```

### ファイルをアップロードする処理
アップロードというよりは、リモートで指定した中身のファイルを作っているといったほうが正しいですね。

```py
from jinja2 import Environment, FileSystemLoader
from cuisine import file_write

secrets = yaml.load(file('secrets.yml'))
local_template_name = local_template_path.split('/')[-1]
local_template_dir = local_template_path.replace(local_template_name, '')

# 以下３行がメインの処理。変数をテンプレートに組み込んだ文字列を取得して、それを中身とするファイルをリモートサーバーに作成する。
jinja2_env = Environment(loader=FileSystemLoader(local_template_dir))
content = jinja2_env.get_template(local_template_name).render(secrets['django']['settings']['production'])
file_write(remote_path, content.encode('utf-8'))
```


## 参考
https://gist.github.com/wrunk/1317933
Jekyll で Sass(SCSS) を css に変換し style タグ内に挿入する方法

jekyll を使って scss を css に変換し style タグ内に挿入したかったがやり方が分からなかったので

## やり方
```scss:css/style.scss
---
---
@charset "utf-8";
@import 'base';
@import 'layout';
```

を次のように変更する

```scss:_includes/css/style.scss
@charset "utf-8";
@import 'base';
@import 'layout';
```

次に link stylesheet で指定してたファイルを style タグ内に挿入するようにする

```html:_layouts/default.html
  <link rel="stylesheet" href="{{ site.baseurl }}/css/style.css">
```

を次のように変更する

```html:_layouts/default.html
<style>
{% capture styles %}
    {% include css/style.scss %}
{% endcapture %}
{{ styles | scssify }}
</style>
```

## Sass の場合
`scssify` の部分を `sassify` に変えると Sass から css に変換してくれます！

---
`scssify` を使えば良いと言うことは分かってたがビルドできなくてあれこれ試行錯誤したら問題点は scss ファイル内の YAML front matter を記述してたせいでしたorz
preg_replace_callbackにおける後方参照

故あって、php用フレームワークであるEthnaをphp 7.0環境に移す必要がありました。
その際に、最終更新の古いフレームワークなので仕方がないのですが、下位互換性が無い変更である、「preg_replaceでのe修飾子」でエラーが発生しました。

Ethna内各所で使われているpreg_replaceをpreg_replace_callbackに書き換える必要に迫られたのですが、マニュアルを読んだところ、
恐らく挙動についての説明はされているのだと思いますが、どうにもイマイチ理解が出来ませんでした。
http://php.net/manual/ja/function.preg-replace-callback.php

私と同レベルの方が引っかかった時のために、限定的な用途のためのpreg_replace_callbackの使い方について書き残しておきます。

※やりたいこと
文頭と、アンダーバーの直後の一文字を大文字にしつつ、アンダーバーを除去する
例：文字列"abc_abc_abc_abc"を、AbcAbcAbcAbcに置換する

```php

$action = "abc_abc_abc_abc";

//以前の処理
$val1 = preg_replace('/_(.)/e', "'/' . strtoupper('\$1')", ucfirst($action));
//Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in ...

//7.0でも怒られない処理
$val2 = preg_replace_callback('/_(.)/', function($match){
//$match[0]:_a
//$match[1]:a
    return strtoupper($match[1]);
}, ucfirst($action));
//$val2:AbcAbcAbcAbc
```

callback関数の引数`$match`は、マッチした文字列全体が`$match[0]`に入ります。
`$match[1]`以降には、後方参照のために`()`で括った部分が順に入ります。
10分で出来る！ポケモンGoのようなアプリで位置情報をエミュレート(偽装)する方法

# 結論

- 位置情報を使ったiOSアプリの開発では、Xcodeの位置情報エミュレート(偽装)機能を使うとデバッグが簡単になる。

# 背景

- ポケモンGoのような位置情報を扱うアプリケーションを開発する際、デバッグのために歩きまわっていては工数が増大する。

- 部屋にいながら指定した位置に移動したり指定した場所を歩き回れたら便利！

# 位置情報のエミュレート方法

## GPXファイルの作成

- 通過経路を緯度経度で示した`test.gpx`を作成する。

```test.gpx
<?xml version="1.0"?>
<gpx version="1.1">
	<wpt lat="35.62053534011689" lon="139.7733771800995" />
	<wpt lat="35.62682738390902" lon="139.76936012506485" />
	<wpt lat="35.62824467347681" lon="139.77133870124817" />
</gpx>
```

## 位置情報エミュレート

1. Xcodeを起動する。
2. 任意の新規アプリを作成する。
3. iPhoneを有線で接続した状態で実機でRunする。
4. swiftファイルと同じ階層にgpxファイルを配置する。
5. 右上に向かう矢印をクリックしてtestを指定する。
6. 位置情報のエミュレート完了！

![test.gpxの場所](https://qiita-image-store.s3.amazonaws.com/0/68104/848b9d93-405e-0584-8b56-85f27fdda7ef.png)

![スクリーンショット 2016-08-16 00.58.44.png](https://qiita-image-store.s3.amazonaws.com/0/68104/7ad17a14-e2b9-c364-643f-8248658f020e.png)

## 位置情報の確認

- エミュレートされた位置情報は、端末内の全てのアプリで共有される。
  - ex) GoogleMap, ポケモンGo...etc
- GoogleMapを開いて、現在地が指定した緯度経度になっていることを確認する。

## Tips

- `test.gpx`の`<wps>`を複数記述することで、順番に位置情報が移動する。
- 移動速度は不明だが、10m間隔にしたところ、ポケモンGoで歩いているモーションを確認した。
- `<wps>`は最後の位置まで到達するとループする仕様になっている。
- 位置情報のエミュレート中に、誤ってポケモンGoのようなアプリケーションを開き、ありえない速度で移動していた場合、アカウント停止などの処罰を受ける可能性があるので注意が必要。

# まとめ

- XcodeとiPhoneがあれば、10分で位置情報のエミュレーションが可能！

# 次回予告

- 次回は、一定速度での移動を実現する方法について投稿する予定。
AWS SDK for Ruby Gem(v2)で画像をS3に保存する方法

RailsでCarrierwaveなどのGemを使わず、画像をS3に上げる方法です。

公式ドキュメントは充実してるものの巨大なので該当場所を探すのが面倒なのと、WEB上はv１の情報が混ざってたりと手間取ったのでメモ。

- [AWS SDK for Ruby - Version 2](https://github.com/aws/aws-sdk-ruby)

Railsのコントローラ内で、Postされた画像をS3に保存するイメージです。

```rb
image = params["file"].tempfile # Tempfile Class object

client = Aws::S3::Client.new(
  region:            'ap-northeast-1',
  access_key_id:     "YOUR_AWS_ACCESS_KEY",
  secret_access_key: "YOUR_AWS_SECRET_ACCESS_KEY"
)

s3 = Aws::S3::Resource.new(client: client)
obj = s3.bucket('bucket_name').object('file_name')
obj.upload_file(image)
```

これだけで大丈夫です。便利。
RailsでのHTML生成は、Nokogiri::HTML::Builderを使えばキレイに書ける(かも)


最近、Rails製自社サービスのリファクタリングとして、viewに書いていたロジックをdecoratorに移行させる作業を行っているのですが、htmlタグの生成方法に悩んでおります。

# content_tagは使いたくない

Railsには、htmlタグを生成する汎用的なヘルパーメソッドとして、"content_tag" があります。

例えば以下のような感じでhtmlを生成することができます。

```rb
content_tag(:div) do
  concat content_tag(:h3, 'タイトル')
  concat content_tag(:p, 'テキスト')
  concat(
    content_tag(:ul) do
      concat content_tag(:li, 'リスト1')
      concat content_tag(:li, 'リスト2')
      concat content_tag(:li, 'リスト3')
    end
  )
end
```

↓

```html
<div>
  <h3>タイトル</h3>
  <p>テキスト</p>
  <ul>
    <li>リスト1</li>
    <li>リスト2</li>
    <li>リスト3</li>
  </ul>
</div>
```

便利なメソッドではあるのですが、htmlの構造が複雑になるにしたがって、非常に見づらいし助長な感じになってしまいます。

# nokogiriのHtmlBuilderを使えばキレイに書けそう

様々な手段を検討してみたのですが、nokogiriのHtmlBuilderを使うのがベターだと感じました。
HtmlBuilderを使えば、上記のhtmlを、以下のように記述することができます。

```rb
root = Nokogiri::HTML::DocumentFragment.parse('')
Nokogiri::HTML::Builder.with(root) do |t|
  t.div do
    t.h3 'タイトル'
    t.p 'テキスト'
    t.ul do
      t.li 'リスト1'
      t.li 'リスト2'
      t.li 'リスト3'
    end
  end
end
```

構造が分かりやすく、非常に読みやすいです。

## モジュールにラップして使う

自社サービスに適用することを想定して、モジュール化してみます。

```rb
module HtmlBuilder
  def to_html
    root = Nokogiri::HTML::DocumentFragment.parse('')
    Nokogiri::HTML::Builder.with(root) do |tag|
      yield tag
    end

    root.to_html.html_safe
  end
end
```

そして、decoratorとかの中で呼び出します。

```rb
def tableA_tag
  to_html do |t|
    t.div do
      t.h3 'タイトル'
      t.p 'テキスト'
      t.ul do
        t.li 'リスト1'
        t.li 'リスト2'
        t.li 'リスト3'
      end
    end
  end
end
```

## class指定方法が便利

HtmlBuilderで生成するtagにclassを指定すには、2通りの方法があります。

まずは普通に、

```rb
t.h3 'タイトル', class: 'class_name'
```

とかする方法です。もう一つはtag名の後に直接追加する方法で、

```rb
t.h3.class_name 'タイトル'
```

こんな感じでも記述できます。
これなら、slimやhamlの記述方法とほぼ同じなので、とても直感的で無駄がありません。

## 最後に
nokogiriはhtmlスクレイパーとして有名ですが、htmlビルダーとしてはあまり知られていないのでしょうか。ググって見たのですが、HtmlBuilderの情報は想像以上に少なかったです。個人的にはとても便利だと思ったのですが、何か欠点とかあるのかしら？
MySQLのUDF関数を作ってみる（C言語）

こんにちは。
MySQLのUDF関数（user defined function）を作ってみました（下記の```mystring(n)```）。文字数を与え、文字列（'x'の羅列）を返します。この文字列は自分でメモリ確保しています[^1]（```#define MYRESULT  initid->ptr```）。

[^1]: 変数 ```result``` には固定で 255 バイトが確保済みで、こちらを使う方法もあります。

```mysql
mysql> CREATE FUNCTION mystring RETURNS STRING SONAME 'mystring.dylib';
mysql> select n, mystring(n) from my_table;
+-----+-------------+
| n   | mystring(n) |
+-----+-------------+
| 4   | xxxx        |
| 6   | xxxxxx      |
+-----+-------------+
mysql> SELECT * from mysql.func WHERE name LIKE 'mystring%';
mysql> SHOW VARIABLES LIKE 'plugin_dir'
```

```console
$ gcc -Wall -I $MYSQLDIR/include/mysql -dynamiclib -o mystring.dylib -DMYSQL_DYNAMIC_PLUGIN mystring.c $MYSQLDIR/lib/libmysqlclient.dylib
$ mv mystring.dylib $MYSQLDIR/lib/plugin/
```

```mystring.c
#include <mysql.h>
#include <stdlib.h>
#include <string.h>
#define MYRESULT  initid->ptr

my_bool mystring_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
    if(args->arg_count != 1 || args->arg_type[0] != INT_RESULT) {
        strcpy(message, "Expected exactly one integer parameter.");
        return 1;
    }
    MYRESULT = NULL;
    return 0;
}

void mystring_deinit(UDF_INIT *initid) {
    if (MYRESULT) free(MYRESULT);
}

char *mystring(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *len, char *is_null, char *error) {
    int i;
    *len = *((long long*) args->args[0]);
    MYRESULT = (char *)realloc(MYRESULT,*len);
    for (i=0; i<*len; i++) {MYRESULT[i]='x';}
    return MYRESULT;
}
```
SeaPig で <webview> 内のページ遷移を抑制している方法について

![](https://raw.githubusercontent.com/yasumichi/seapig/master/seapig.png) [SeaPig](https://github.com/yasumichi/seapig) is converter from markdown to html with marked.js and highlight.js.

SeaPig バージョン 0.4.0 以前のバージョンでは、HTMLプリビューペイン(&lt;webview&gt;)内のリンクをクリックしてしまうとリンク先にページ遷移してしまい、以降、プリビュー機能が動作しない不具合がありました。この記事では、SeaPig で <webview> 内のページ遷移を抑制している方法について説明します。

## 筆者の環境

- [VineSeed](https://vinelinux.org/vineseed.html) ([Vine Linux](https://vinelinux.org/) 開発版) 64bit
- [nodebrew](https://github.com/hokaccha/nodebrew) use v4.4.7(LTS)

## 解決策

当初、[Electron の <webview> 内でリンクを開いたときに外部ブラウザで開く - Qiita](http://qiita.com/Linda_pp/items/219847322dda3973557b)の方法で修正しましたが、'did-start-loading' の発生時に外部ブラウザに渡される URL がページ遷移前の URL になってしまい、うまく行きませんでした。

> なお、当該記事中、最近の Electron 環境では以下の修正が必要でした。
> 
> - `const shell = require('shell');` :arrow_right: `const shell = require('electron').shell;`
> - `const url = webview.getUrl();` :arrow_right: `const url = webview.getURL();`

結局、あまりスマートではないですが、以下の方法で解決しました。

- プリビュー表示用に利用している元々の HTML に &lt;base&gt; タグを属性なしで埋め込んでおく。
- プリビュー表示などのタイミングで &lt;base&gt; タグ に属性 `target="_blank"` を設定する。(`element.setAttribute(name, value)`)
 - HTML としてエクスポートする際は、当該属性を削除してからエクスポートし、元に戻す。(`element.removeAttribute(name)`)
- 先ほどの記事の 'new-window' のイベントハンドラのみ追加する。

```js
const shell = require('electron').shell;
const webview = document.getElementById('previewer');

webview.addEventListener('new-window', function(event) {
  webview.stop();
  shell.openExternal(event.url);
});
```

`<base target="_blank">` となっていることにより、原則、すべてのリンクが別ウィンドウで開かれるはずであり、'new-window' イベントのみ捕捉すればよくなるとの見込みでした。まだ、抜け道があれば、ご教示いただけると幸いです。

## 参考リンク

- [&lt;webview&gt; タグ](https://github.com/electron/electron/blob/master/docs-translations/jp/api/web-view-tag.md)
- [Electron の <webview> 内でリンクを開いたときに外部ブラウザで開く - Qiita](http://qiita.com/Linda_pp/items/219847322dda3973557b)
- [element.setAttribute - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Element/setAttribute)
- [element.removeAttribute - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Element/removeAttribute)
- [Electron でマークダウンからHTMLへの変換ソフトを自作してみた - Qiita](http://qiita.com/yasumichi/items/b3acec72d740fba4b7f7)
NFSver4に関する備忘録

今日設定したNFSに関するメモ

- idmapdに関して
 idmapdのstartがfailedしている事が発覚。原因を調べてみると、起動時のオプションで指定しているディレクトリが存在せずにエラーになっていた。<br>
NFSver4でNFSを展開する場合は、idmapdのサービスが必要となる。<br>
NFSver2.3では必要ではない。<br>
NFSマウントした場合のUID/GIDのマッピング（ひも付け）をidmapdが提供する。

みたいな事が調べた記事の中に書いてありました。

### 設定変更したファイル
/etc/idmapd.conf
このファイル内にIDMAPDARGSという変数があり、そこでディレクトリを指定していた。
ここで指定されていたのが、nfs-server用のFS（？）であるsunrpcだった。

この設定ファイルを変更後、以下のコマンドで設定を反映させる。
systemctl restart nfs-config
※nfsdを再起動するだけでは読み込まれないため注意

### sunrpcのマウントポイントについて
その後調べてみたが、/etc/systemd/　配下で設定されているみたい。
Lifekeeper構成の場合、/var/lib/nfs→/var/libにマウントポイントが変わるとのこと。
http://jpdocs.us.sios.com/Linux/8.0/LK4L/NFS/Content/recovery_kits/nfs_server_rk_documentation/configuration_considerations/configuring_nfs_server_lifekeeper.htm

RHEL6のサーバでは/etc/modprobe.d配下にlifekeeperのものらしきファイルが存在していたが、RHEL7のサーバは存在していなかった。（設定の問題の可能性あり）

### /etc/exportsと/etc/netgroup

NFSのエクスポートをする場合、/etc/exportsに記載するが、/etc/netgroupファイルを使用する事で、特定のホスト名またはIPアドレスをグループ化する事ができる。

/etc/netgroupの書式：
<グループ名> （<ホスト名>,,) ...  必要なだけ続けて記載。

/etc/netgroupを設定後、
/etc/exportsでIPアドレスを指定するかわりにグループ名を指定。
グループ名を指定する場合は、名前の前に@を記載する事。

/nfs/mountpoint @<グループ名>(rw)

/etc/netgroupではIPレンジで設定する事が出来ないので、IPレンジでの指定は/etc/exportsで設定する。
VirtualboxでUEFI有効にしてDebian入れたら二度目には起動しない。お前さっきまで起きてただろ！

# 結論

* [VirtualBox 6.1 で修正された](https://www.virtualbox.org/ticket/11177#comment:4)ようだ。最初のバグ報告がVBoxでされてから8年越し。

## 内容
* VirutalBoxのUEFI NVRAMのバグ。
* VirtualBoxのUEFIサポートは[未だにexperimental](https://www.virtualbox.org/manual/ch03.html#efi)で、[バグとしても扱う気はない](https://www.virtualbox.org/ticket/15835#comment:1)らしい。
* WindowsやRHEL/CentOS/Fedora/openSUSEはUEFI規格を無視してこのような壊れたUEFI firmwareの挙動を隠蔽する方向で対処している（そして互換性を破壊している）ので、問題が表面化しない。
* 迂回したければ、以下の方法を取る
    * /boot/efi/EFI/{debian,ubuntu} を/boot/efi/EFI/boot にコピーする
    * /boot/efi/EFI/startup.nsh に FS0:\EFI\debian\grubx64.efi を記述する

## 経緯

そーいや、Debian上のVirtualboxでUEFI有効にしてDebianインストールすると初回は立ち上がるが二回目からダメ、という現象があって、[むかーしむかしにバグレポート投げといたんだった](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=822941)。

もうちょっと深追いしようね

* 同じDebian vboxイメージをUSBディスクで運んでWindows10のVirtualBox5.1.2で動作するのか
    * いや、本当はVirtualbox5.0.2xでやったほうが良い気もするんだけども
    * それとも実はd-iのこのバージョンのバグで、今のだと直ってるかもしれないから、とりあえずstretch alpha5で入れる
* 同じDebian vboxイメージをvirtualbox.org提供パッケージで動かしたらどうなのか
* レポート中に「このパーティション、このフォーマットでいいの？」があるけど、このパーティションタイプを無理やり変えたらどうなのよ？

感想：セットアップがタルい。stretch alpha5途中でエラー吐いて止まるぞ。なんで前回すんなりはいってるの？＞私
やり直し。眠い。ねｍ。。。

## もいちど

* Virtualbox 5.1.4 on Windows10 での Debian でも同様だった。
* Virtualbox 5.0.24 on Debian で作ったイメージを Virtualbox 5.1.{2,4} on Windows10 に持って行っても同じ

この

* インストール後、VMの電源を一度切らなければ大丈夫

というのがいやらしいな…

## 差分から原因を探る

Debian on 実機UEFIと Fedora on Vbox UEFIでは問題ない。ダメなのはDebian on VBox。

* UEFIパーティション情報が違う？
    * 若干違うように見えるが、実質変わらず。
* /boot 以下が違う？
    * ビンゴ。

Booting from UEFI shell by kicking /boot/efi/EFI/debian/grubx64.efi works.
Fedora24 on Virtualbox can boot without UEFI shell, and it has different files in its /boot/efi partition.

```
/boot/efi/EFI/BOOT/BOOTX64.EFI
/boot/efi/EFI/BOOT/fallback.efi
```

Once delete those files, Fedora24 won't boot. Probably VirtualBox UEFI seeks /boot/efi/EFI/BOOT, not /boot/efi/EFI/${distro}. I don't know this behavior is okay or not, but it's better to add workaround to d-i, IMHO.

Just copying those files (/boot/efi/EFI/BOOT/BOOTX64.EFI and /boot/efi/EFI/BOOT/fallback.efi) to Debian on VirtualBox won't boot, repeat putting error and rebooting.


## 根本的原因

https://wiki.debian.org/UEFI#Force_grub-efi_installation_to_the_removable_media_path だよ、と。

かいつまむと

* いくつかのUEFI firmware実装が腐ってて、EFI/boot以下しか見ないっぽい。おかしいだろ
* Windowsが腐ったUEFI firmwareに対応する方法として、リムーバブルメディア用に予約されてるディレクトリにEFIなファイルを突っ込むようにして問題を隠蔽した。
    * これは本来やっちゃいけない
* そして、RHEL/CentOS・Fedora・openSUSEはWindowsと同じ挙動をするような実装にしている。お前らもかよ。。。
    * Debian/Ubuntuはspec守ってるから、VirtualBoxのUEFIのバグを踏んで起動しない。

## そうは言ってもなんとかならんの？

https://wiki.debian.org/UEFI#Force_grub-efi_installation_to_the_removable_media_path に手動での対処方法書いてあるで。

...って面倒だから、VirtualBox環境だったら自動で処理するようなworkaround実装しない？と提案しておいた。
けど、蹴られた。うーん。

## VBoxの方の問題
https://www.virtualbox.org/changeset/43256/vbox あたりを何とかすればいいんじゃね？という話。
Django利用時のDEBUGの設定

ドキュメントに書いてあるのだけど，そんな勝手な設定があるとは思わず。。。

> 設定ファイル上の DEBUG の値にかかわらず、 Django は全てのテスト を DEBUG=False で動かします

これを知らずに，１時間くらい何故勝手にDEBUGの設定が書き換わるのか調査してしまった。
InspectorとGetComponentはどれくらい速度が違うのか調べてみる

[試した物](https://github.com/taiti0522/measure_getComponent)

```test.cs
public class measure_public : MonoBehaviour {

	public Text test_string;

	public void OnMeasure(){
		//スタート時間
		float _startTime = Time.realtimeSinceStartup;

		for (int i =0; i < 1000000; i++ ){
			test_string.text = "集計" + i;

		}

		//終了時間
		float _endTime = Time.realtimeSinceStartup;

		Debug.Log(_endTime - _startTime);


	}
}

```

```test2.cs
public class measure_getcomponent : MonoBehaviour {

	public GameObject test_string;

	public void OnMeasure(){
		//スタート時間
		float _startTime = Time.realtimeSinceStartup;

		for (int i =0; i < 1000000; i++ ){
			test_string.GetComponent<Text>().text = "集計" + i;

		}

		//終了時間
		float _endTime = Time.realtimeSinceStartup;

		Debug.Log(_endTime - _startTime);


	}
}
```
すごくシンプルに上記で計算してみた。
test.cs  平均1.5秒
test２.cs  平均1.６秒

う〜ん。そんな違わない。
GetComponentはソースコード読んでいかないと，このファイルでは何が起こるか分からない。
だから，全部Inspectorに表示しようぜって方が好きではある。
でも，そんな速さに差はでない。


```test3.cs
public class measure_findchild : MonoBehaviour {

	public GameObject Parent;

	public void OnMeasure(){
		//スタート時間
		float _startTime = Time.realtimeSinceStartup;

		for (int i =0; i < 1000000; i++ ){
			GameObject test_string = Parent.transform.FindChild("Text").gameObject;
			test_string.GetComponent<Text>().text = "集計" + i;

		}

		//終了時間
		float _endTime = Time.realtimeSinceStartup;

		Debug.Log(_endTime - _startTime);


	}
}
```
FindChildは重いぞ！と聞いていたので試してみた。
これは平均２.0秒。重いけどそんなでもないなーって感想。