OmniAICreator/Qiita-1.07M huggingface dataset:
【CodeIgniter】ビューの同じ記述をまとめる（CakePHPっぽいエレメントの実装）

## はじめに

この記事は [CodeIgniter Advent Calendar 2017](https://qiita.com/advent-calendar/2017/code_igniter) 5日目です。
4日目の記事は自分が投稿した『[プロファイラを外部ファイル出力できるようにする](https://qiita.com/rhap/items/27fce78e3b61d834f375)』でした。


## ■ `load->view` でビューファイルからビューを呼び出す
[ビュー — CodeIgniter 3.2.0-dev ドキュメント](http://codeigniter.jp/user_guide/3/general/views.html)

```html:/application/views/echo_test.php
<pre>
_________              .___        .___                  .__   __                   
\_   ___ \   ____    __| _/  ____  |   |   ____    ____  |__|_/  |_   ____  _______ 
/    \  \/  /  _ \  / __ | _/ __ \ |   |  / ___\  /    \ |  |\   __\_/ __ \ \_  __ \
\     \____(  <_> )/ /_/ | \  ___/ |   | / /_/  >|   |  \|  | |  |  \  ___/  |  | \/
 \______  / \____/ \____ |  \___  >|___| \___  / |___|  /|__| |__|   \___  > |__|   
        \/              \/      \/      /_____/       \/                 \/         
</pre>
<?= $temp; ?>
```
コントローラで使用されるイメージがあるかもしれない `load->view` ですが、たとえば上のようなビューの断片を用意したとき、下のようにすると別のビューファイルからでも呼び出してやることができます。

```php:/application/views/welcome_message.php
<!-- 前略 -->
<?php $this->load->view('echo_test', ['temp' => 'echo test']); ?>
<!-- 後略 -->
```
![echotest.png](https://qiita-image-store.s3.amazonaws.com/0/112838/127e0c89-69ad-98c9-fbb1-e590d76b9d75.png)
今回はもう一歩進めてCakePHPっぽく、ビューの断片をelementフォルダにまとめることにします。

## ■ ビューの同じ記述をまとめる（CakePHPっぽいエレメントの実装）
###１）CI_Loaderクラスを継承して関数elementを用意する

```php:/application/core/MY_Loader.php
<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Loader extends CI_Loader {

  public function element($view, $vars = array(), $return = false)
  {
    return $this->view('element/' . $view, $vars, $return);
  }

}
```

###2）/application/views/にelementフォルダを作成して適当なファイルをでっちあげる

```html:/application/views/element/echo_test.php
<pre>
        .__                                      __   
  ____  |  |    ____    _____    ____    ____  _/  |_ 
_/ __ \ |  |  _/ __ \  /     \ _/ __ \  /    \ \   __\
\  ___/ |  |__\  ___/ |  Y Y  \\  ___/ |   |  \ |  |  
 \___  >|____/ \___  >|__|_|  / \___  >|___|  / |__|  
     \/            \/       \/      \/      \/        
</pre>
<?= $temp; ?>
```
###３）適当なビューにて呼び出してあげる

```php:/application/views/welcome_message.php
<!-- 前略 -->
<?php $this->load->element('echo_test', ['temp' => 'echo test']); ?>
<!-- 後略 -->
```
![echotest2.png](https://qiita-image-store.s3.amazonaws.com/0/112838/caef719c-4003-087d-69c8-83116d4b48ba.png)

※このページのアスキーアートは [Text to ASCII Art Generator (TAAG)](http://www.patorjk.com/software/taag/) で生成しました。
※この記事の記述はCodeigniterのスタイルガイドに沿っていません。phpdocがないのもごめんなさい。。。
**※原則としてビューをロードする制御はコントローラで行うべきです。**

おわり！
Ruby で整数を可逆スクランブルする(適当)

Ruby で適当な連番 ID をちょっと推測しづらいぐらいでスクランブルしたい時のためのコード。Rails なんかは標準で連番 ID なので、ちょっとした ID 隠しをしたい時向けです。あんまりしっかり検証してないので、信用しすぎは禁物。

めちゃくちゃ厳密に隠したい訳ではなく、ロジック知ってないと推測しずらいな程度で、かつ桁数をそこまで気にしたくない、というような用途にしか使えません。ただ、 Salt 値を足したりすることで推測難易度はいくらかあげられるかと思います。

```ruby
module Scrambler
  MINIMUM_SCRAMBLE_DIGIT = 20
  SCRAMBLE_BASE = 36

  def self.scramble(id)
    reversed = id.to_s.rjust(MINIMUM_SCRAMBLE_DIGIT, '0').reverse
    "1#{reversed}".to_i.to_s(SCRAMBLE_BASE)
  end

  def self.unscramble(hash)
    reversed = hash.to_i(SCRAMBLE_BASE).to_s.reverse
    reversed[0, reversed.length - 1].to_i
  end
end
```

やってることは単純で

1. 数値を文字列にして最低桁数(`MINIMUM_SCRAMBLE_DIGIT`)分0埋めする
2. ひっくり返す
3. ひっくり返した先頭に `1` を追加(これをしないと `100` なんかが不可逆になる)
4. その文字列を数値 -> 36進数で変換

というような手順。これを実行すると、

```
1 => n7q81nvr7zz7k
2 => pbpc1tbqf9slc
3 => rfog1yrpmjlz4
4 => tjnk247ottfcw
5 => vnmo29no138qo
6 => xrls2f3n8d24g
7 => zvkw2kjmfmvi8
8 => 11zk02pzlmwow0
9 => 143j42vfku6i9s
10 => lbcmfxdrxuqrk
```

みたいな具合になるので、多分そこそこ使い勝手がいいんじゃないかな。割とわからない感じだし。 `MINIMUM_SCRAMBLE_DIGIT` を変えることで最小桁数が変わるので、生成後の文字の長さも変わります。

```
MINIMUM_SCRAMBLE_DIGIT = 10
1 => 51x46bk
2 => 5ighn9c
3 => 5yzv474
4 => 6fj8l4w
5 => 6w2m22o
6 => 7clzj0g
7 => 7t5czy8
8 => 89oqgw0
9 => 8q83xts
10 => 4n1a1vk
```

変わるけど、復号化のロジックはそのまま使いまわせるので、そんなに困らない。また、ひっくり返した後に付与する `1` は `0` でなければなんでもいいので、それこそ擬似乱数でも構わないです。そうなると scramble 書ける度に違う ID に見えるような発行の仕方になるので、それはそれで使いみちがありそう。

という小ネタでした。おしまい。
arduinoでマルチタスク その２

#概要
arduinoでマルチタスクやってみた。

#結果

```
0: task1
0: task2
0: task3
0: task4
100: task1
200: task2
200: task1
300: task3
301: task1
400: task2
400: task4
401: task1
501: task1
601: task3
601: task2
602: task1
702: task1
800: task4
801: task2
801: task1
901: task3
902: task1
1001: task2
1002: task1
1102: task1
1201: task3
1201: task4
1202: task2
1203: task1
1303: task1
1401: task2
1403: task1
1501: task3
1504: task1
1601: task4
1602: task2
1604: task1
1704: task1
1802: task3
1803: task2
1805: task1
1905: task1
2001: task4
2002: task2
2006: task1
2102: task3
2106: task1
2203: task2
2206: task1
2307: task1
2402: task3
2403: task4
2404: task2
2407: task1
2507: task1
2604: task2
2608: task1
2703: task3
2708: task1
2803: task4
2804: task2
2808: task1
2909: task1
3003: task3
3005: task2
3009: task1
3109: task1
3203: task4
3205: task2
3210: task1
3303: task3
3310: task1
3405: task2
3410: task1
3511: task1
3603: task3
3604: task4
3606: task2
3611: task1
3712: task1
3806: task2
3812: task1
3904: task3
3912: task1
4004: task4
4006: task2
4013: task1
4113: task1
4204: task3
4207: task2
4213: task1
4314: task1
4405: task4
4407: task2
4414: task1
4504: task3
4514: task1
4608: task2
4615: task1
4715: task1
4805: task3
4805: task4
4807: task2
4815: task1
```

#サンプルコード


```
#include "Scheduler.h"

void setup1()
{
}
void loop1()
{
	Serial.print(millis());
	Serial.println(": task2");
	delay(200);
}
void setup2()
{
}
void loop2()
{
	Serial.print(millis());
	Serial.println(": task3");
	delay(300);
}
void setup3()
{
}
void loop3()
{
	Serial.print(millis());
	Serial.println(": task4");
	delay(400);
}
void setup()
{
	Serial.begin(115200);
	while (!Serial);
	Scheduler.start(setup1, loop1);
	Scheduler.start(setup2, loop2);
	Scheduler.start(setup3, loop3);
}
void loop()
{
	Serial.print(millis());
	Serial.println(": task1");
	delay(100);
}



```

#ライブラリー

https://github.com/ohisama/Arduino-Scheduler

以上。
Rubyでクローラーをつくってみた


これは[日本情報クリエイト Engineer's Advent Calendar 2017](https://qiita.com/advent-calendar/2017/njc)の5日目の記事です。
# はじめに

Q Rubyって何？
A 黒澤(妹)です。
なんて書くと「ぶっぶーですわ～！」と怒られそうなので、
本当の説明は以下の通りです。

> Ruby（ルビー）は、まつもとゆきひろ（通称 Matz）により開発されたオブジェクト指向スクリプト言語であり、スクリプト言語が用いられてきた領域でのオブジェクト指向プログラミングを実現する。

引用：[Wikipedia](https://ja.wikipedia.org/wiki/Ruby)

国産の言語なので日本語ドキュメントが結構見つかりますね。
なので、わからないことを読めない英語で調べて余計わからなくなることが少なかったです。

Q どうしてクローラー作りだしたの？
A ある日Laravel推しの方が作ったクローラーをポンっと渡されたからだよっ！
と書くと語弊がありますね。
元々使われていたクローラーを引き継ぐことになってクローラー開発が始まった感じです。
実際渡されたクローラーがどんなことをしているのか、当時の私にはちんぷんかんぷんだったので、
ちゃんと製作者の方に説明してもらいました。(ありがとうございます。)

Q なんでRubyなの？
A 渡されたのがRubyで作られてたからだよっ！
(当時入社1年目の私にPythonで作ろうとか言う考えは存在してませんでした。)

そんな私でも作れちゃうんですよ、はい。

# ではでは、本題

**なのですが**、クローラーを作成する場合は、気を付けないと
クリーリング先に大きな負荷をかけてしまうことがあります。
[過去にはこんな事件もありました](https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B%E4%B8%AD%E5%A4%AE%E5%9B%B3%E6%9B%B8%E9%A4%A8%E4%BA%8B%E4%BB%B6)
気を付けましょう。

クローラーの開発にあたってまずは環境構築からなのですが、
ここに関しては割愛します。
環境に関しては、ggってもらった方がいろんな方がすでに書いておられますし、
分かりやすいです！
(そして何より長くなるのでめんどくs・・)

さて、クローラー本体についてですが、基本的に
「Nokogiri」を使用しております。
「Nokogiri」はHTMLなどをパースするためのRubyライブラリのことです。

じゃあ実際にはどうやって使うの？ってことで
試しに[くらさぽ広場](https://www.kurasapo-hiroba.com/)の記事URLを取得します。
具体的には下の画像の赤枠記事へのリンクですね。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/212112/f5115eea-efc4-34f8-2431-dbcc80ee7df5.jpeg)

# 実際に書いてみます

まずは今回使用するライブラリを読み込みます。基本ですね！
「Nokogiri」は事前に gem install が必要です。

```ruby:sampruby.rb
require 'nokogiri'
require 'pp'
require 'open-uri'
```

呼び出したのでNokogiriさんには働いてもらいます。

```ruby:sampruby.rb
# アクセスしたいURLを指定します。
url = 'https://www.kurasapo-hiroba.com/'

#　nokogiriクラスを利用し、HTMLを解析、扱いやすいオブジェクトに変換します。
kura = Nokogiri::HTML(open(url))
```

こんな感じで書いてあげればNokogiriさんがHTMLを解析してくれます。
あとは解析した結果からcssやxpathを使って、ほしい情報を取り出してあげればOK!
↓こんなかんじ

```ruby:sampruby.rb
data = kura.css("h3 a").each do |elem|
    pp elem[:href]
end
```
今回はURLを取り出すだけなのでシンプルなプログラムになりました。
全文は以下の通りです。

```ruby:sampruby.rb
# -*- coding: utf-8 -*-

require 'nokogiri'
require 'pp'
require 'open-uri'

# アクセスしたいURLを指定します。
url = 'https://www.kurasapo-hiroba.com/'

#　nokogiriクラスを利用し、HTMLを解析、扱いやすいオブジェクトに変換します。
kura = Nokogiri::HTML(open(url))
data = kura.css("h3 a").each do |elem|
    pp elem[:href]
end
```

ちなみに、このプログラムを実際に実行してあげるとこのような結果になります。

![kekka.JPG](https://qiita-image-store.s3.amazonaws.com/0/212112/ae5ac5b4-9136-d330-ae03-9762c48ac227.jpeg)


記事のURLが取り出せましたね。
こんな簡単に情報が取り出せちゃいます。
もっと作りこめば、取り出したURL先にさらにアクセスして
より多くの情報を取得出来たりもします。

# おまけ

とある日、一件のクローラー作成依頼が入ってきました。
Aさん「xxxの情報がほしいのでクローリングをお願いします」
私「対応します」

いつものようにサクッと作ってやるぞぉ(/・ω・)/
と、クローリング先を確認。

私「ん？どこのリンクもURLが一緒・・・。あ、JavaScript・・・」
はい、Nokogiriさんが使えませんでした。(私は無知なだけかもしれない)
というわけでここで登場
Capybaraさ～ん～(某ネコ型ロボット風)

![photo0000-3075.jpg](https://qiita-image-store.s3.amazonaws.com/0/212112/45205028-58ba-caec-dd49-ffce9ee9ed16.jpeg)


はい、もうこのネタいいですね。
CapybaraもRubyのライブラリとなります。
JavaScriptへの対応ができるようになります。
正確には、Capybara単体ではなくSeleniumやPoltergeistのような画面テストツールと一緒に使います。

今回の記事には詳細は記載しませんが、このようにクローラーといってもページによって作り方やライブラリを変えたりと
いろいろな作り方ができます。楽しいですね！

# さいごに

クローラーを作成するにあたって「Rubyによるクローラー開発技法」という書籍を使いました。
クローラー作成にあたって必要な箇所しか読んでいませんが、
ruby、クローラー初心者の自分でもわかりやすかったです。

プログラム初心者でもクローラーは作れちゃいますので、
ぜひ、クローラーを作ってみてください。
elm-todofukenってpackageを出してみた


http://package.elm-lang.org/packages/miyamoen/elm-todofuken/latest

# 経緯

<blockquote class="twitter-tweet" lang="ja"><a　href="https://twitter.com/miyamo_madoka/status/931141894913982464">なんかライブラリ作りたいんだけど
 -- miyamo</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><a href="https://twitter.com/jinjor/status/931158592081629185">elm-todofuken -- jinjor</a></blockquote>

そろそろ何かpackageを出してみたいなって思って

# 用途
都道府県を入力するフォームあるじゃん
あれ
関東、中部、近畿、などの地方ごとのグルーピングにも対応

# elm-package publish
リポジトリはGithubいないといけないのでそこは注意

https://github.com/elm-lang/elm-package/blob/master/README.md
ここみながらtagきったりするだけ
簡単

version上げるのも簡単だった

# API document
知らなかったんだけど`exposed-modules`に指定されたファイルはドキュメント書けよって執拗にコンパイラに怒られる
今までtoyアプリしか書いてなかったから、コンパイラの新たな一面を知った

# sample
リポジトリにexampleが入ってないから、もし誰か使って何か作ったら教えてほしい。参考にするので

# 何か作ってみよう
この機会に何かpackage出してみるといいと思います
和暦、はあんまり要らなさそうだけど、そういうものとか
IchigoJamで素数ゲーム

心を落ち着かせるときに使うゲームです。

ルール：入力した素数より大きな数値を入れていく


■概要
自分より小さな数で1つずつ増やして地道に割っていき、％であまりが無いかをチェク。あまりがゼロになったら素数ではないと判定

■プログラム
10 CLS:CLV:D=2
20 INPUT P
25 IF P>=32767 OR P<=1 THEN ?"OUT OF RANGE":END
30 IF X>=P THEN ?"SMALL OR SAME":END
40 IF D=P THEN GOTO 100
50 IF P%D=0 THEN ?"NOT SOSU":?"SCORE:";X:END
60 D=D+1
70 GOTO 40
100 X=P:D=2:GOTO 20

■オンラインサンプル実行(Chrome・FireFox・Edgeがサポートされています)
http://fukuno.jig.jp/app/IchigoJam/#10%20CLS%3ACLV%3AD%3D2%0A20%20INPUT%20P%0A25%20IF%20P%3E%3D32767%20OR%20P%3C%3D1%20THEN%20%3F%22OUT%20OF%20RANGE%22%3AEND%0A30%20IF%20X%3E%3DP%20THEN%20%3F%22SMALL%20OR%20SAME%22%3AEND%0A40%20IF%20D%3DP%20THEN%20GOTO%20100%0A50%20IF%20P%25D%3D0%20THEN%20%3F%22NOT%20SOSU%22%3A%3F%22SCORE%3A%22%3BX%3AEND%0A60%20D%3DD%2B1%0A70%20GOTO%2040%0A100%20X%3DP%3AD%3D2%3AGOTO%2020%0A
AWS ElastiCacheとgRPCを使ってServer Streaming処理を実装する。

# やりたいこと

ElastiCache(Redisを選択)の値が更新されたらgRPCにて通知する。

# 利用技術

C#
Redis
gRPC

#ソースコード
ざっくりこんな感じでPubSubを受け取り、gRPCでServer Streamingしていました。

```csharp:RedisPubSub.cs
RedisUtil.PubSubConnection.Subscribe(x, (channel, message) =>
                {
                    var messageArray = message.ToString().Split(',');
                    quoteStockResponse.Elemnt = messageArray[0];
                    quoteStockResponse.Value = messageArray[1];
                    responseStream.WriteAsync(quoteStockResponse);
                            });
```

#問題
Only one write can be pending at a time
というエラーが発生。Async初心者の様なミスをしました。


#ソースコード(修正版)
Queueに詰めて、取り出す処理に変えました。

```csharp:ElastiCacheClusterConfig.cs
var Queue = new AsyncProducerConsumerQueue<QuoteStockResponse>();
            // 同期版
                RedisUtil.PubSubConnection.Subscribe(x, (channel, message) =>
                {
                    var messageArray = message.ToString().Split(',');
                    quoteStockResponse.Elemnt = messageArray[0];
                    quoteStockResponse.Value = messageArray[1];
                    Queue.EnqueueAsync(quoteStockResponse);
            });

while (true)
            {
                var value = Queue.DequeueAsync().Result;
                await responseStream.WriteAsync(value);
            }
```

#小ネタ

AWSが提供しているSDKはMemcashedにしか対応していません。
そのため、最初はRedisではなくMemcashedを利用してSDKを用いて開発する予定でしたが、以下実装を確認する限り
localhost(踏み台経由)からのアクセスができないため、諦めました。

https://github.com/awslabs/elasticache-cluster-config-net/blob/master/Amazon.ElastiCacheCluster/ElastiCacheClusterConfig.cs

```csharp:ElastiCacheClusterConfig.cs
 if (setup.ClusterEndPoint.HostName.IndexOf(".cfg", StringComparison.OrdinalIgnoreCase) >= 0)
            {
                if (setup.ClusterNode != null)
                {
                    var _tries = setup.ClusterNode.NodeTries > 0 ? setup.ClusterNode.NodeTries : DiscoveryNode.DEFAULT_TRY_COUNT;
                    var _delay = setup.ClusterNode.NodeDelay >= 0 ? setup.ClusterNode.NodeDelay : DiscoveryNode.DEFAULT_TRY_DELAY;
                    this.DiscoveryNode = new DiscoveryNode(this, setup.ClusterEndPoint.HostName, setup.ClusterEndPoint.Port, _tries, _delay);
                }
                else
                    this.DiscoveryNode = new DiscoveryNode(this, setup.ClusterEndPoint.HostName, setup.ClusterEndPoint.Port);
            }
            else
            {
                throw new ArgumentException("The provided endpoint does not support auto discovery");
            }
```

社内プロキシ配下で環境している事が悪いって事ですよね・・・つらい・・・

#今後

パフォーマンスについて計測したら、別枠で書きます。
Blenderとショートカットと私 

本記事は Blender Advent Calendar 2017 5日目の記事になります。

https://adventar.org/calendars/2391

#ショートカットを頑張ってまとめた話

FreeでOpenSource なBlender

![SnapCrab_NoName_2017-12-2_23-3-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/121950/4ad866f9-5632-22cb-e56e-1a694781dc62.png)

「FreeだからXXXできないんでしょ！？」と言えないほど大量の機能があります。

いや、正直ありすぎて何が何だかわかりません。

そこで、代表的なものをザーッと眺めて理解するときにBLUGjpさんの「THE DEFAULT CUBE」が役に立ちます。


<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Blenderやってる？ 画像と同じものをコンビニでプリントアウトできるようにしてみたよ？ プリント予約番号 48781463 を入れてね。サイズはA3、カラーは100えん、モノクロは20えんだよー。10月21日いっぱいまでだからねー。よろしくねー。 <a href="https://t.co/rNtV11DPcy">pic.twitter.com/rNtV11DPcy</a></p>&mdash; BLUGjp (初芯者) (@blug_jp) <a href="https://twitter.com/blug_jp/status/919080002485764096?ref_src=twsrc%5Etfw">October 14, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


もちろん、私も...

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">印刷させてもらいました！<br>なんか、これ気持ちいいですね。<a href="https://twitter.com/hashtag/b3d?src=hash&amp;ref_src=twsrc%5Etfw">#b3d</a> <a href="https://t.co/yABm6nAmJh">pic.twitter.com/yABm6nAmJh</a></p>&mdash; もんた (@___monta___) <a href="https://twitter.com/___monta___/status/919452579272179712?ref_src=twsrc%5Etfw">October 15, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


で、後続で

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">あざす！！対応するショートカットキー書き込んでいって自分の「超お役立ちシート」にするのもいいかと。</p>&mdash; BLUGjp (初芯者) (@blug_jp) <a href="https://twitter.com/blug_jp/status/919455521421238272?ref_src=twsrc%5Etfw">October 15, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

、

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">そーなんです。まさにそうしたいなぁと。<br>なので、次バージョンはショートカットキーを併記いただければ、また印刷します（笑）</p>&mdash; もんた (@___monta___) <a href="https://twitter.com/___monta___/status/919460209763815424?ref_src=twsrc%5Etfw">October 15, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

、

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">いえ、ご自分で書き込むことで習得の一助となればということで(面倒くさいなんてそんな事はあり…ないです。</p>&mdash; BLUGjp (初芯者) (@blug_jp) <a href="https://twitter.com/blug_jp/status/919496387821056001?ref_src=twsrc%5Etfw">October 15, 2017</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ということで、私めが、コツコツとショートカットを追加した、「[The default cube with shortcut](
https://wiki3.jp/blugjp/page/30)」を作成しました。

めんどくさかったーーー。

まじ、めんどくさかったーーー。


URL：https://wiki3.jp/blugjp/page/30



<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/61144026-97ef-d83a-1cb8-b9d7eae97e8e.png" width=60%>



あまりに面倒だったので、途中１カ月空いたりもしたけど、頑張ったのでチラ見してください。少しでも皆さんのお役に立てれば幸いです。

結論から言えば、やっぱり紙にまとまっているほうが見やすいよね！

明日はdskjalさんの「クオリティチェック用のターンテーブルを作る」です！
イーサリアムのトランザクション

昨日 [イーサリアムのブロック構造と合意するアルゴリズム - Qiita](https://qiita.com/blueplanet/items/89e5cee98e3a44ad1d48) でイーサリアムのブロックについて調べましたが、トランザクションと関係ある `state_root` とか `receipts_root` とか、分かっないので、今日トランザクション周りを調べてみます。

## トランザクションのデータ構成
- nonce: トランザクション毎に +1 する数値
- gasprice: ガスの単価
- gas: ガス制限値
- to: 宛先アドレス
- value: ETHの値
- data: コントラクトに対するトランザクションの場合、呼び出す関数に必要なパラメータ
- v: 暗号化周りのデジタル署名関連???
- r: 暗号化周りのデジタル署名関連???
- s: 暗号化周りのデジタル署名関連???

## state_root
イーサリアムがビットコインと違うところですが、アカウント毎の最新情報とそれらに基づいたブロックチェーン全体の最新情報を持っている。詳細の説明は参考記事のほうが詳しいので割愛します。自分の理解ですと、なんか `git` のデータ構成や仕組みと似ている部分もあったりします。`git` を理解している方は、より理解し易いかもしれません。

| イーサリアム    | git|
|----------------|-----------------|
| 各アカウント情報   | リポジトリの各ファイル |
| 各トランザクション | 各ファイル差分情報    |
| ブロック          | コミット(リポジトリ全体の差分 |
| ワールドステート | 変更後の最新ファイル |
| ブロックチェーン最新のデータ | リポジトリの最後修正した後のデータ |

- 一個前のブロックに各アカウントの残高など全体のステータスを持っているとして、新しいトランザクションがある場合、アカウント A からアカウント B に 10 ETH を送金することを例に上げると
    - アカウントAの残高から 10 ETH を減らす　＝＝　git でのファイルAに対して、10 行テキストを削除
    - アカウントBの残高に 10 ETH を増やす　＝＝　git でのファイルBに対して、10 行テクストを追加
- 上記のように、あるブロックにある全てのトランザクション情報を差分として一個前のブロックに適用すれば、ブロックチェーンの最新情報になる
- ブロックを生成する側（マイナー）は、上記の処理した後、全アカウントの最新データから要約しハッシュ値を算出する。全アカウントのハッシュ値をマークル木の形にし、最終的に `status_root` １つのハッシュ値をヘッダー部に格納する
- ブロックチェーンから新しいブロックをした側は、上記のハッシュ値とデータの差分から再度算出するハッシュ値を比較して、一致していれば、検証OKになる

## 参考記事
- [トランザクションレベルで理解する。イーサリアムの具体的な仕組みを解説](https://zoom-blc.com/what-is-ethereum)
- [Ethereum入門(4) - スマートコントラクトにおけるトランザクションとブロックを見ていく - Qiita](https://qiita.com/takeoworks/items/86cc25f058dbae794017)
- [[Japanese] Ethereum Development Tutorial · ethereum/wiki Wiki](https://github.com/ethereum/wiki/wiki/%5BJapanese%5D--Ethereum-Development-Tutorial#state-machine)
Visual Studio Codeの各言語、環境のデバッグの仕方を集めたサイトを作ってる

各言語、環境でデバッグするためには、各言語、環境の拡張機能をインストールし、対応した設定をlaunch.jsonに記述する必要がある。いくら統一されたデバッグプロトコルを介してデバッグ機能が提供されると言えど、設定ファイルは異なっている。

このデバッグに関する拡張機能の提供している機能を一覧することはできないかと思い、下記のサイトを作成した。

https://vscode-debug-specs.github.io/

リポジトリ: https://github.com/vscode-debug-specs

各言語について、以下のケースをそれぞれ調べた。

* 単体テストの場合
* バッチのように直接実行する場合
* 実行中のプロセスに対してリモートからアタッチする場合

また、Windows、MacOS、Linuxでの実行方法を調べた。

現在記載している言語、環境は以下の通り。

* Go
* SeverSide Javascript(Node.JS) and TypeScript
* FrontEnd Javascript(Chrome) and TypeScript
* Electron Javascript and TypeScript
* Cordova Javascript
* Python
* C#(.NET Core)
* C/C++
* Java
* PHP
* Bash

拡張機能のREADMEを読めば、ほとんどのことが書かれているが、WindowsやLinuxのことがおろそかだったり、リモートでの実行については触れていなかったり、追加の設定が必要だったりするため、それらをまとめることを目的としている。

最近であっても、Javaの拡張機能がMicrosoftから新しく展開されたり、Pythonの拡張機能を作っていた人がMicrosoftにJoinしたりしており、Microsoft自身がまだまだ手を入れてVSCodeの環境を充実させようとしていて、新しい情報が必要となっている。

また、この一覧を日本語化し、さらにデバッグプロトコルについて解説した[同人誌『Visual Studio Code デバッグ技術』をboothで頒布している](https://74th.booth.pm/)ので、よろしければ確認ください。

書籍化しました → https://nextpublishing.jp/book/10255.html
日本語で言語を作ろう

# はじめに

Prolog は特に日本語プログラミング言語ではありません。
しかしながら、ユーザーが自由に優先順位を持った演算子を定義できて文字コードに制限が少なく、マクロを使うことも可能なので日本語プログラミングをすることも簡単に出来ます。

例えば以下のプログラムは、四則演算の評価をする言語を定義して使っている例です:

```prolog:test.pl
:- op(1200,xfx,ならば).
:- op(1000,xfy,かつ).
:- op(700,xfx,が).
:- op(700,xfx,を評価すると).
term_expansion(A ならば B,B:-A).
A かつ B :- A,B.
A が 整数 :- integer(A).
A が B :- B is A.

I が 整数 ならば I を評価すると I.
A を評価すると A_ かつ B を評価すると B_ かつ A_+B_ が C ならば A+B を評価すると C.
A を評価すると A_ かつ B を評価すると B_ かつ A_-B_ が C ならば A-B を評価すると C.
A を評価すると A_ かつ B を評価すると B_ かつ A_*B_ が C ならば A*B を評価すると C.
A を評価すると A_ かつ B を評価すると B_ かつ A_ div B_ が C ならば A/B を評価すると C.

:- 1+2*3 を評価すると R, writeln(R),halt.
```

I が 整数 ならば I を評価すると I.
A を評価すると A_ かつ B を評価すると B_ かつ A_+B_ が C ならば A+B を評価すると C.
A を評価すると A_ かつ B を評価すると B_ かつ A_-B_ が C ならば A-B を評価すると C.
A を評価すると A_ かつ B を評価すると B_ かつ A_*B_ が C ならば A*B を評価すると C.
A を評価すると A_ かつ B を評価すると B_ かつ A_ div B_ が C ならば A/B を評価すると C.

という日本語として十分理解できる文章を、Prologでは式として認識することが出来ます。
恐るべし、Prologです。

# 実行方法

```bash
$ swipl test.pl
7
```

計算できてますよ。

# ダウンロード

https://qiita.com/h_sakurai/items/701b1ca926b5e2176a83
LinuxPCでserial通信をしようとした話

この記事は[高知工科大 Advent Calendar 2017](https://adventar.org/calendars/2305)の5日目の記事です。
はじめまして。　高知工科大学　情報学群2年のsattonです。初投稿です。
##はじめに
マイコンで処理したデータをserial通信でPCに表示しようとした場合、だいたいの方はTeraTermに代表されるようなターミナルソフトを使用して表示させると思います。
しかし、自分はLinuxPCを日頃使用しており、serial通信をしようとすると少し工夫する必要がありました。
そこで、LinuxPCのTerminalを使用してserial通信をするための方法について~~n番煎じでしょうが~~話したいと思います。
##やったこと
マイコンで気圧センサと加速度センサの値を読み取り、取った値をPC上に表示させました。
##使用環境

* [Linux mint](https://linuxmint.com) ver17.2＋Thinkpad-X200(PC)
* [Nucleo-F303k8](http://akizukidenshi.com/catalog/g/gM-10172/) (マイコン)
* [MPU9250](http://strawberry-linux.com/catalog/items?code=12250) (加速度センサ)
* [LPS22HB](http://strawberry-linux.com/catalog/items?code=12122) (気圧センサ)
* ジャンパー線等その他必要なもの

##マイコン側の前準備
配線やマイコン側のプログラムを事前にしておきます。今回はさほど重要ではないのですっ飛ばします。  
![sc_20171201220123.jpg](https://qiita-image-store.s3.amazonaws.com/0/221124/0d759297-b6f6-1535-1c16-2c160e6e8700.jpeg)　　
ブレッドボードはこんな感じ。
中央上が気圧センサで下が加速度センサです。マイコンとはI2Cで接続しています。~~少し汚いですね…~~
##パソコン側の準備
linuxでserial通信を行うためのソフトにはいくつか種類がありますが、自分は今回、 **「cu」**というコマンドを使用しました。
Linux mint はubuntuとDebianをベースとしたディストリビューションなので、

```$sudo apt-get install cu```

と打ち込むとコマンドが使用できるようになります。
##接続方法

1. まず、USBケーブルでマイコンとPCを繋ぎます。  
ここでPCがマイコンを無事に認識しなければ、スタートラインに立てません(´・ω・｀)
1. ```$ls -l /dev/serial/by-id/``` と打ち込み、マイコンにシリアルポートが振られているかを確認します。  
Linuxはwindowsと違い、COMポートというものが無く、代わりに「/dev/ttyUSB0」など、最後に数字が付いて認識されます。詳しいことは[この記事](http://tclip.blog.fc2.com/blog-entry-86.html)に載っています。
![jCGcwI7xbDPt7kE1512412037_1512412081.png](https://qiita-image-store.s3.amazonaws.com/0/221124/fe6ee2f9-7f8a-860d-d5fc-e798472693d5.png)  
実行結果はこんな感じです。今回はポートに「ttyACM0」が振られました。
1. このままではマイコンを弄る権限が無くて接続できないので、```$sudo chmod 666 /dev/ttyACM0```で「ttyACM0」の権限を変更します。  
chmodコマンドアクセス権限を変更し、こちら側でデータを見られるようにします。今回はマイコン側への実行権限までは必要ないので、「666」で設定しました。
1. ```cu -s 9600 -l /dev/ttyACM0``` で通信を開始します。  
このコマンドでserial通信を始めます。使い方は```$cu -s <boud reat> -l  <device name>```と入力するだけです。```<boud reat>```は**通信速度**、```<device name>```は使用したい**ポート名**です。今回は通信速度(ポーレート)を9600で設定していたので、このコマンドになりました。終了する時は**「~.」**と打ち込みます。

##実践
実際にやってみた結果です。

![3st1HANoW5JwnBE1512415127_1512415195.png](https://qiita-image-store.s3.amazonaws.com/0/221124/1fea227c-1574-f034-5c5e-d5e7327f2c2c.png)  
このようなログになりました。chmodコマンドを叩かずにcuすると、Permission deniedエラーが出ることが分かります。権限を変更して、再度cuすると、今度は無事に接続されていることが分かります。データの内容は左から気圧、加速度XYZ、ジャイロXYZとなります。~~加速度ジャイロが整数型なのは間違って出してしまっただけなので深く考えないでください。~~

少し見辛いので改めて
![YvYRcVNTmJelhHx1512415951_1512415969.png](https://qiita-image-store.s3.amazonaws.com/0/221124/026226a2-23da-e0c5-b36b-3d6de21fbdaa.png)  
ジャイロの値を消して代わりに内容を追加しました。

とまあ、こんな感じで
**Linuxでも問題なくserial通信ができました！！**
#まとめ
今回紹介した方法はあくまで一例です。シェルスクリプトで簡略化したり、ログを取ったり、まだまだ方法はいくらでもあるかと思います。

もしLinuxPCでserial通信をやりたいという方がいれば、この記事が少しでも役立ってくれると嬉しいです。

###参考
[LinuxでRS232Cのシリアル通信](http://enotyama.hatenablog.com/entry/2014/03/03/232305)
[LinuxでUSBシリアルケーブルを使う ](https://netwiz.jp/?p=556)
##補足
* 今回はCOMポートの設定を何もせずに行いましたが、もし設定を行うならば**setserial**コマンドが便利だと思います。[マニュアル](http://www.linux-cmd.com/setserial.html)もあるので、設定を行う場合の参考になると思います。
* シリアルポートに対応したターミナルコマンドは他にも```minicam```や```screen```があります。[簡単にまとめているページ](https://qiita.com/yuiseki/items/bfa9ad984f7333377870)があったのでこちらも宜しければぜひ。
Minitestで特定のテストをスキップする方法


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの5日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回はMinitestで特定のテストをスキップする方法を説明します。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第3章まで読み終わっていること。

## Minitestで特定のテストをスキップする方法


使用頻度はあまり高くないと思いますが、何らかの理由で対応を後回しにしたい場合はテストの実行を途中で停止してスキップすることができます。テストをスキップする場合は次のように`skip`メソッドを使います。

```ruby
def test_sample
  skip '以下の問題はあとで修正する'
  assert_equal 'RUBY', nil.upcase
end
```

これを実行すると次のような結果になります。

```
$ ruby sample_test.rb
Run options: --seed 42317

# Running:

S

Finished in 0.000945s, 1058.4788 runs/s, 0.0000 assertions/s.

1 runs, 0 assertions, 0 failures, 0 errors, 1 skips

You have skipped tests. Run with --verbose for details.
```

テストの進捗状況はスキップ（Skip）を表す`S`が表示されます。実行結果のまとめでも`1 skips`のようにスキップされたテストの件数が表示されています。

最後の1行には英語で「スキップされたテストがあります。--verboseオプションを付けて実行すると詳細が表示されます」という文言が書いてあります。このメッセージに従って、`--verbose`（冗長の意）オプションを付けて実行してみましょう。

```
$ ruby sample_test.rb --verbose
Run options: --verbose --seed 1520

# Running:

SampleTest#test_sample = 0.00 s = S

Finished in 0.001041s, 960.6333 runs/s, 0.0000 assertions/s.

  1) Skipped:
SampleTest#test_sample [sample_test.rb:6]:
以下の問題はあとで修正する

1 runs, 0 assertions, 0 failures, 0 errors, 1 skips
```

`--verbose`オプション付きで実行すると、スキップされたテストの場所と`skip`メソッドに渡したメッセージが表示されるようになります。（進捗状況の表示内容も変わっていますね）

テストがスキップされるとそのテストメソッドの実行はそこで終わります。実行対象のテストクラスやテストメソッドが複数あった場合は次のテストクラスやテストメソッドの実行に移ります。

とはいえ、skipメソッドを多用しすぎると、スキップされるテストだらけになってほとんど何もテストできていない、ということも起こりえるので、「どうしても」という状況以外では使用しないようにしましょう。

## 次回予告

次回はテストメソッドの粒度について説明します。
【クリカン2017ネタ】リギングヘルプミー：リグの作法②と③の一部を自動化

こんにちは
[MayaPython Advent Calender 2017](https://qiita.com/advent-calendar/2017/maya-python)の5日目の記事です。

今回の記事ではクリエイティブカンファレンス2017のセッションのひとつ、[リギング ヘルプ ミー 「リガー集まれ～！」](https://cgworld.jp/special/cgwcc2017/archives/schedule/guncys)の[「アセットの共有を円滑にするリグの作法」](https://www.slideshare.net/BACKBONE-studio/cgworld-creative-conference-2017)という発表資料を元に、作法の一部を自動化してみました。



##作法②　骨のラベリング
<img width="418" alt="スクリーンショット 2017-12-05 4.08.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/212052/ea0d00b7-f95f-e50e-fe39-69fedd7bfd3d.png">
まずは29スライド目「作法②　骨のラベリング」です
選択したジョイントに対して動作します。
※以下のコードでは対称なジョイント名にLeft/Rightという文字列が含まれている場合にのみ対応しています。

``` py
# -*- coding: utf-8 -*-

import maya.cmds as mc

selected = mc.ls(sl=True, type='joint')

for i in selected:
    label_name = None
    side_type = 0

    if 'Left' in i:
        label_name = i.replace('Left', '')
        side_type = 1
    elif 'Right' in i:
        label_name = i.replace('Right', '')
        side_type = 2
    else:
        label_name = i
        side_type = 0

    mc.setAttr(i + '.side', side_type)
    mc.setAttr(i + '.type', 18)
    mc.setAttr(i + '.otherType', label_name, type='string')

```

## 作法③　初期ポーズの登録
<img width="517" alt="スクリーンショット 2017-12-05 4.09.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/212052/83c6d0cb-ff9b-f0b3-5f85-a70e6e14de42.png">
次は33スライド目「作法③　初期ポーズの登録」です。
スクリプトを走らせた時点の値を`init_~~`に登録します。

```py
# -*- coding: utf-8 -*-

import maya.cmds as mc

selected = mc.ls(sl=True, type='transform')

for i in selected:
    tx = mc.getAttr(i + '.translateX')
    ty = mc.getAttr(i + '.translateY')
    tz = mc.getAttr(i + '.translateZ')
    rx = mc.getAttr(i + '.rotateX')
    ry = mc.getAttr(i + '.rotateY')
    rz = mc.getAttr(i + '.rotateZ')

    mc.addAttr(i, ln='init_translateX', at='float', dv=tx)
    mc.setAttr(i + '.init_translateX', e=True, keyable=False, lock=True)
    mc.addAttr(i, ln='init_translateY', at='float', dv=ty)
    mc.setAttr(i + '.init_translateY', e=True, keyable=False, lock=True)
    mc.addAttr(i, ln='init_translateZ', at='float', dv=tz)
    mc.setAttr(i + '.init_translateZ', e=True, keyable=False, lock=True)
    mc.addAttr(i, ln='init_rotateX', at='float', dv=rx)
    mc.setAttr(i + '.init_rotateX', e=True, keyable=False, lock=True)
    mc.addAttr(i, ln='init_rotateY', at='float', dv=ry)
    mc.setAttr(i + '.init_rotateY', e=True, keyable=False, lock=True)
    mc.addAttr(i, ln='init_rotateZ', at='float', dv=rz)
    mc.setAttr(i + '.init_rotateZ', e=True, keyable=False, lock=True)

```

##まとめ
私は冒頭で紹介したセッションに参加し、そこで初めて骨のラベリングや初期ポーズという作法を知りました。ラベリングも初期ポーズも普段は全く意識していなかった箇所なので非常にタメになりました。

また、BACKBONE様単独でのセミナーも開催されるということなので、そちらも是非参加したいと思います。
SWI-Prolog でもテストを書こうの話

# はじめに

Prlog でもテスト書けるといいよなと思ったりするわけです。
SWI-Prologでもテスト書けるのでしょうか？
答えはYesです。ということでご報告する次第であります。

# 1. とりあえず使ってみる

例えば以下のようなPrologの述語定義があります。

```Prolog
% fun1.pl
add(A,B,C) :- C is A+B.
mul(A,B,C) :- C is A*B.
```

これをテストするには以下のように書きます:

```Prolog
% funtest1.pl
:- use_module(fun).

:- begin_tests(add).
  test(add1_2) :- add(1,2,3).
  test(add0_1) :- add(0,1,1).
:- end_tests(add).

:- begin_tests(mul).
  test(mul1_2) :- mul(1,2,2).
  test(mul0_1) :- mul(0,1,0).
  test(mul10_20) :- mul(10,20,200).
:- end_tests(mul).

:- run_tests.
:- halt.
```

テストコードは `begin_tests/1` と `end_tests/1` で、はさんで書きます。このとき、 `:-` を忘れずに書きましょう。これ書いてて最初動かず悩んでしまいましたw

実行するにはrun_testsを実行すれば動きます。
`begin_tests` と `end_tests` の名前は同じでないといけません。
かなり綺麗にテストを書くことが出来ます。

テスト実行は

```
$ swipl funtest.pl
% PL-Unit: add .. done
% PL-Unit: mul ... done
% All 5 tests passed
```

簡単すぎる？

# 2. モジュールを切り替えて使う。

では実際にもう少し複雑な使い方をしてみましょう。
先程の、プログラムをfun.plという名前で保存しています。

```Prolog
:- module(fun, [add/3,mul/3]).
% fun.pl
add(A,B,C) :- C is A+B.
mul(A,B,C) :- C is A*B.
```

ところで、別なバージョンの実装をつくることにしたとしましょう。

```prolog
:- module(fun2, [add/3,mul/3]).
% fun2.pl
add(A,B,C) :- C is A+B.
mul(A,B,C) :- C is A*B.
```

面倒くさいので同じプログラムをコピっただけですが、同じテストプログラムでテスト出来たら便利です。

そんなときは、コマンドライン引数を見て読み込むモジュールをかえられるようにしています。

```prolog
% funtest.pl
:- current_prolog_flag(argv, [M]),!,format('use ~w\n',[M]),use_module(M) ;
   use_module(fun).

:- begin_tests(add).
  test(add1_2) :- add(1,2,3).
  test(add0_1) :- add(0,1,1).
:- end_tests(add).

:- begin_tests(mul).
  test(mul1_2) :- mul(1,2,2).
  test(mul0_1) :- mul(0,1,0).
  test(mul10_20) :- mul(10,20,200).
:- end_tests(mul).

:- run_tests.
:- halt.
```

こうしておくとデフォルトではfun.plのテストがされ

```bash
$ swipl funtest.pl
% PL-Unit: add .. done
% PL-Unit: mul ... done
% All 5 tests passed
```

fun2.plのてすとをしたいときは以下のように引数を渡すことでテストできます。

```bash
$ swipl funtest.pl fun2
use fun2
% PL-Unit: add .. done
% PL-Unit: mul ... done
% All 5 tests passed
```

# 3. Makefile を書こう。

Makefileを作って

```mf
test: test1 test2
test1:
	swipl funtest.pl
test2:
	swipl funtest.pl fun2
```

などと書いておくと、

```bash
$ make test
swipl funtest.pl
% PL-Unit: add .. done
% PL-Unit: mul ... done
% All 5 tests passed
swipl funtest.pl fun2
use fun2
% PL-Unit: add .. done
% PL-Unit: mul ... done
% All 5 tests passed
```

でまとめてテスト出来て便利です。
# 3. 更に詳しい情報

SWI-Prologの [Prolog Unit Tests](http://www.swi-prolog.org/pldoc/doc_for?object=section(%27packages/plunit.html%27)) にはさらに詳しい情報が掲載されています。参考にしてください。

# 4. まとめ

SWI-Prologでテストを書いてみました。
この記事のプログラムは以下からダウンロードできます:

:octocat: https://gist.github.com/hsk/ff712ab7e4ba400211557a3e59ed381f

# 参考

[Prolog Unit Tests](http://www.swi-prolog.org/pldoc/doc_for?object=section(%27packages/plunit.html%27))
HelloWorld Test

# HelloWorld

**HelloWorldいろいろ**


## Python
```py3:HelloWorld
print("Hello World")
```
## java
```java:HelloWorld
public class HelloWorld{
   public static void main(String[] args){
     System.out.println("Hello World!!");
   }
}
```

## C# 
```csharp:HelloWorld
using System;
namespace HelloWorld
{
    class Hello 
    {
        static void Main() 
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

## scala
```scala:HelloWorld
object SampleLauncher {
  def main(args: Array[String]): Unit = {
    println("Hello World")
  }
}
```

## bash
```bash:HelloWorld
#!/bin/bash
echo "Hello World"
```
AWS S3上のオブジェクトの存在チェック

```groovy
// Groovy Version: 2.4.11 JVM: 1.8.0_144 Vendor: Oracle Corporation OS: Mac OS X
@Grab('com.amazonaws:aws-java-sdk-s3:1.11.184')
import com.amazonaws.regions.Regions
import com.amazonaws.services.s3.AmazonS3
import com.amazonaws.services.s3.AmazonS3ClientBuilder

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
        .withRegion(Regions.AP_NORTHEAST_1)
        .build()

def bucketName = 'your-bucket-name'
def key = 'some/s3/key'
println s3Client.doesObjectExist(bucketName, key)
```
rails × react にfroala editorを導入してみる

# はじめに
もともとradactorというjqueryのwysiwyg editorをreactで使っていたが、安定性とreactとの相性から、reactのコンポーネントを提供してくれているfroalaという有料のwysiwyg editorを使うことにした。（こちらもjqueryが使われていることには変わりない）
https://www.froala.com/wysiwyg-editor
draft.jsも視野に入れたが、写真の挿入が簡単ということで、froalaを採用した。
# セットアップ
react版とrails版があり、react版はwebpackの設定がややこしそうだったので、react版はコンポーネントを使うだけにとどめ、必要なjsとcssはgemでインストールしたwysiwyg-railsからimportした。（参考：https://www.froala.com/wysiwyg-editor/docs/framework-plugins/rails#include-in-assets）

これでreactのコンポーネントを呼び出すだけで、wysiwyg editorが動くようになる。

# FroalaEditor
importがうまくいっていれば

```javascript
import React from 'react';
import ReactDOM from 'react-dom';

ReactDOM.render(<FroalaEditor tag='textarea'/>, document.getElementById('editor'));
```
だけで動くようになる

# modelとconfig
formでいうvalueのようなものでhtmlが入る。これをstateで管理する、
変更があればonModelChangeでstateを更新する。この辺りは従来のinputとほぼ同じ。

```js
class EditorComponent extends React.Component {
  constructor () {
    super();

    this.handleModelChange = this.handleModelChange.bind(this);

    this.state = {
      model: '<p>Example text</p>'
    };
  }

  handleModelChange(model) {
    this.setState({
      model: model
    });
  }

  render () {
　   const self = this 
　   const config = {
      placeholderText: 'テキストを追加',
      charCounterCount: false,
      theme: 'dark',
      zindex: 0,
      toolbarButtons:['bold', 'underline'],
      language: 'ja',
      imageUploadURL: /* railsに送るrequestのpath */,
      imageUploadParams: {
        // railsに送るparams
      },
      videoInsertButtons: ['videoBack', '|', 'videoByURL'],
      events: {
        'froalaEditor.blur': function() {
          self.handleSave()
        }
      }
    };
    return <FroalaEditor
              model={this.state.model}
              onModelChange={this.handleModelChange}
          　　　　　　　　config={config}
           />
  }
}
```
またconfig内に設定を書くことができて、https://www.froala.com/wysiwyg-editor/docs/options と同じようにconfigのhashにどんどん書いていけばok
eventは上記のようにさらにeventのhashにcallbackを書いていけばよい。今回はblurで保存したかったので、https://www.froala.com/wysiwyg-editor/docs/events を参考にfroalaEditor.blurのcallbackでrailsにrequestを送った。

# 感想
日本ではあまり使われていないようだが、さすが有料ということもあり使いやすく高機能でデザインやUIも充実している。しかし、ドキュメントが英語しかないのと価格が１万ちょっとと手が出しにくい。しかし、無料でdownloadして試すことができるから、ぜひ一度試していただきたい。
Dockerコンテナの標準入出力をリアルタイムでやりとりする

## 目的
オンラインコンパイラを作る時に標準出力がストリームでヌルヌル出てくれるといいなって思った
https://editor.ugwis.net/

## コンテナの標準入出力
`docker attach`と同じような挙動をするエンドポイントがDocker Engineの`/containers/<id or name>/attach`に提供されています

### ContainerCreate
まず、コンテナの標準入出力を扱うにはContainerCreateのフラグを変える必要があります

```go:main.go
resp, err := cli.ContainerCreate(ctx, &container.Config{
	Image:           lang.Language[query.Language].DockerImage,
	WorkingDir:      "/workspace",
	Cmd:             lang.Language[query.Language].RunCmd,
	NetworkDisabled: true,
	AttachStdin:     true,
	AttachStdout:    true,
	AttachStderr:    true,
	OpenStdin:       true,
	StdinOnce:       true,
	Tty:             false,
}, &container.HostConfig{
	Mounts: []mount.Mount{
		mount.Mount{
			Type:   mount.TypeBind,
			Source: "/tmp/compiler/" + runningHash,
			Target: "/workspace",
		},
	},
	AutoRemove: true,
}, nil, "")
```

標準入力に関するフラグのみデフォルトで`false`で指定されています。

Ttyがtrueの時は、ContainerAttachのReaderから標準入力の内容も出力されます。用途としてはターミナルのようなものを作る時に標準入力をキーボード、標準出力をコンソール画面に使う場合などが考えられます。

### ContainerAttach
標準出力を受け取るにはContainerAttachを呼び出し、io.Readerから標準出力を受け取ります。

送られてくるストリームにはheaderが付いており、

`header := [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}`

のような形式になっています。
これは標準出力と標準エラーが同様に流れてくるため、呼び出し側が判別するためにヘッダーが用いられています。
この形式はcontainerLogsメソッドも同じですが公式ドキュメントには書かれていなかった為、意味不明なnull文字に悩まされました

解消するには自分でパースしても良いですが、公式が提供するcopyメソッドを使うとストリーム同士をパイプでうまく繋いでくれます
`github.com/docker/docker/pkg/stdcopy.StdCopy`

https://docs.docker.com/engine/api/v1.33/#operation/ContainerAttach

```go:main.go
// Attach container
stdin, err := cli.ContainerAttach(ctx, resp.ID, types.ContainerAttachOptions{
	Stream: true,
	Stdin:  true,
})
defer stdin.Close()
if err != nil {
	fmt.Println(err.Error())
	c.String(http.StatusInternalServerError, err.Error())
	return
}

stdout, err := cli.ContainerAttach(ctx, resp.ID, types.ContainerAttachOptions{
	Stream: true,
	Stdout: true,
})
defer stdout.Close()
if err != nil {
	fmt.Println(err.Error())
	c.String(http.StatusInternalServerError, err.Error())
	return
}
```

### ContainerAttach(WebSocket)
また、clientのライブラリには実装されていませんがdocker Engine側にWebSocketのエンドポイントが提供されており、ブラウザと接続する際はこれに繋ぐことで入出力が楽になると思います

https://docs.docker.com/engine/api/v1.33/#operation/ContainerAttachWebsocket
.NETにおけるTMP/TEMPの扱いについて


# 概要
.NETで一時的なファイルを扱いたい場合、テンポラリフォルダのパスを`System.Path.GetTempPath()`で取得できるが、実際に利用する場合には詳細な動きも頭の片隅に入れておきたいので調べてみた。

# GetTempPath()メソッドで取得できるフォルダ

[公式リファレンス](https://msdn.microsoft.com/ja-jp/library/system.io.path.gettemppath(v=vs.110).aspx#備考)によると、このメソッドで返されるのは以下の順に走査して最初に見つかったフォルダである。

1. TMP 環境変数によって指定されたパス。
2. TEMP 環境変数で指定されたパス。
3. %USERPROFILE% 環境変数によって指定されたパス。[^1]
4. Windows ディレクトリ。[^2]

実際に[ソース](https://referencesource.microsoft.com/#mscorlib/system/io/path.cs,1060)を追ってみたところ、`Path.GetTempPath`はWin32APIの`GetTempPath`関数に処理を委譲しているだけだった。

ただ、Win32APIの`GetTempPath`関数の[日本語リファレンス](https://msdn.microsoft.com/ja-jp/library/cc429356.aspx)には上記3.の記載がない。[英語リファレンス](https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa364992(v=vs.85).aspx)には記載されているため、日本語版の内容が古いか単に誤っていると思われる。

# 環境変数の優先順位

TMP,TEMP,USERPROFILEは環境変数であるため、以下の優先順位が存在する（上が優先）

1. プロセス内でセットされた環境変数[^3]
2. ユーザー環境変数
3. システム環境変数

`System.Environment.GenEnvironmentVariable(string, EnvironmentVariableTarget)`メソッドを利用すれば、個別に取得もできる。

```csharp:例
System.Environment.GenEnvironmentVariable("TEMP", EnvironmentVariableTarget.Process)
System.Environment.GenEnvironmentVariable("TEMP", EnvironmentVariableTarget.User)
System.Environment.GenEnvironmentVariable("TEMP", EnvironmentVariableTarget.System)
```

# 気をつけたいこと

TEMPファルダを利用する際に容量が不足して落ちるプログラムが世の中に沢山ある。
というか、個人的にRAMドライブをTEMPに割り当ててるが、2GB確保してても容量不足で落ちて原因がなかなかわからず苦労したことが何回かあった。

大量のファイルや大きいファイルを一時ファイルとして扱うことが予めわかっている場合は、事前に空き容量のチェックをして警告を出すなり、最適な場所を利用するようにしたい（して欲しい）。

[^1]: %USERPROFILE%については[こちら](https://qiita.com/gentaro/items/5f1e577b826537acbf01)に記載。
[^2]: システム環境変数`SystemRoot`が指すフォルダを意味していると思われる。通常は`C:\WINDOWS`。
[^3]: プログラム内部で`System.Environment.SetEnvironmentVariable("TEMP", "C:\hoge")`で上書きされた場合など。
ソリティアの自動プレイでスコアを稼いでみた

# はじめに

ソリティアの累積ベガスルールを自動プレイするプログラムを作成し、スコアを稼いでみました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/58026/a5fbc4cb-0f10-7f2d-af0e-e0bec5a88763.jpeg" width="640px">

# 背景

数年前からWindowsソリティアの特に累積ベガスルールに興味を持ち、攻略法がないか調べたのですが、有名なゲームにもかかわらず攻略法の文献は少なく累積ベガスについては皆無という状況です。
しばらく自己流で頑張っていましたが限界を感じたので思考エンジンを開発して自動プレイを行ってみました。
ゲームの名称は正式にはKlonedikeですが、「ソリティア」のほうが知名度が高いと思うので、この投稿では「ソリティア」と呼ぶことにします。

ソースコードは https://github.com/dsanno/Klondike-Solver で公開しています。

# 各種設定

ゲームの設定は以下のようにしました。

|設定名|設定値|備考|
|:---|:----------|:---|
|OS|Windows 10||
|アプリケーション|Microsoft Solitaire Collection||
|ゲームの種類|KlonDike||
|一回に引く枚数|3引く||
|スコアタイプ|累積型ベガス||
|タイマー|オフ|オンにするとクリア時に大量のスコアが加わってしますのでオフにしてあります|
|常にランダムな山札でプレイ|オン||
|元に戻す|「元に戻す」禁止|カードの先読みができてしまうので禁止にしています|
|思考時の入力|視覚情報のみ利用|メモリの内部を調べて伏せてあるカードの状態を特定するのは禁止です|


# 得点について

累積ベガスルールでは、ゲーム開始時に52点引かれます。
そして組札(右上のスペースにあるカード)1枚につき5点加算されます。
52枚すべてを組札にすると260点加算され、開始時の減点と合わせると208点が加わります。
得点は次のゲームに持ち越され、累積スコアをできるだけ高くするのが目的です。

# 思考アルゴリズム

思考アルゴリズムは[Kondike-Solver](https://github.com/ShootMe/Klondike-Solver) をベースに実装しました。
Klondike-Solverでは、カードの初期状態を入力すると、クリアまでの最短手順を計算します。
ただし、カードは伏せてあるものも含めてすべて既知であることを想定しています。

これを以下のように改造しました。
あまり深くまで探索すると時間がかかるので、探索空間を抑えてあります。

* 初期状態だけでなく、任意の状態を入力できるようにした
* 未知のカードを指定できるようにした
* 未知のカードがある場合には以下の手順で思考するようにした
    * 未知カードをランダムに設定
    * 設定した状態から探索を行い、初手に対するスコア(組札の枚数)を計算する
    * 未知カードの設定と探索を複数回繰り返す
    * 各初手に対するスコアの平均を計算し、平均スコアが最も高い手を選ぶ

## 探索について

探索効率を良くするために Kondike-Solver ではいくつかの工夫をしています。

* 山札(左上のカード)を1回以上めくる手と山札を移動する手をセットにしている
* 場札(中央の7列のカード)を場札に移動するのは、その次に場札をめくれるときか場札から組札に移動できる時に限定している
* 場札から組札に移動した場合には、その直後に同じカードを場札に戻す手を探索しない

# 自動化スクリプト

自動化スクリプトは以下の機能をもっています。
Pythonで実装しました。

* 画像のパターンマッチングを行ってカードの状態を調べる
* カードの状態を思考エンジンに入力し、次の手を得る
* マウス操作を行い次の手をソリティアアプリケーションに入力
* ゲームが終了したら一定時間待って次のゲームを開始する

# 結果

97ゲームで1856点獲得することができました。
ゲーム数と得点が中途半端なのはソリティアが強制終了してしまったためです。
累積スコアの推移は以下のようになりました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/58026/973194c8-9923-9a34-6994-a0f30d93e52f.jpeg" width="640px" alt="累積スコア推移">

自動プレイ動画を公開しました。
2時間半もあり長いですが興味ある方はご覧ください。
https://www.youtube.com/watch?v=yw9oBs4mbd8&t=23s

# 感想

思考アルゴリズムは単純なものでしたが、思ったよりもよい結果を出すことができました。
累積ベガスルールで安定してスコアを稼ぐことができるのかずっと疑問に思っていたのですが、今回の結果からするとうまくやれば可能なようです(人間にとって相当困難だとは思いますが)。
今回のプログラムの手を研究して、今後もソリティアを楽しみたいです。
CZMLでポイントオブジェクトを時系列移動

# ポイントオブジェクト時系列の移動
Cesiumの強みである時系列表示制御機能を試してみます。
Cesiumのオブジェクトの表示制御を行うデータ形式である、CZML(JSON）にパラメータを記載することで実現可能です。

今回の成果物　http://jsdo.it/tkama/eYt3
![t1.gif](https://qiita-image-store.s3.amazonaws.com/0/53918/c8789d8d-f6c1-6192-646c-15ce71192d03.gif)

# CZMLの仕様
日本語では、[CZML入門](https://gis-oer.github.io/gitbook/book/materials/web_gis/CZML/CZML.html)というサイトが非常に分かりやすいです。

Cesiumの[Sandcastle](https://cesiumjs.org/Cesium/Apps/Sandcastle/?src=CZML%20Point%20-%20Time%20Dynamic.html&label=CZML)を参考に時系列データを描画してみます。

```js
//CZML抜粋
 {
    "id" : "point",
    //表示時間範囲
    "availability" :"2012-08-04T16:00:00Z/2012-08-04T16:05:00Z",
    "position" : {
        "epoch" : "2012-08-04T16:00:00Z", //開始時刻
        "cartographicDegrees" : [
            0,   140.0, 35.0, 100,　    //経過時間(秒),経度,緯度,標高(m)
            100, 140.1, 35.1, 100,
            200, 140.2, 35.2, 100,
            300, 140.3, 35.3, 100
        ]
    },

```

# デモ： 上越新幹線を平均時速200kmで走行させる
　
[国土数値情報　鉄道データ](http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v2_3.html)より、上越新幹線の線路形状を抽出し、線路形状を１本の線分に変換し、補間点間の距離差から秒速５５mの移動体の経過時間を抽出しました。

抽出用クエリ

```sql
WITH base AS (
  SELECT  ST_DumpPoints( ST_Reverse( ST_LineMerge( ST_Union( geom ) ) )) AS dp, n02_003 AS lname 
  FROM public.rail
  WHERE n02_003 = '上越新幹線'
  GROUP BY 2
 )
 SELECT
	  s ||',' ||  ST_X( geom ) || ',' ||  ST_y( geom ) || ',100,' AS cartographicDegrees
 FROM 
	 (
	 SELECT
	 * , SUM(diff_time)OVER(ORDER BY id rows unbounded preceding ) :: int AS s
	 FROM 
	 (
	 SELECT 
	  lname , ((dp).path)[1] AS id,  (dp).geom  
	  , ST_Distance( ((dp).geom)::geography   , lag( ((dp).geom)::geography ) OVER(PARTITION BY lname ORDER BY ((dp).path)[1] ))
	  , ST_Distance( ((dp).geom)::geography   , lag( ((dp).geom)::geography ) OVER(PARTITION BY lname ORDER BY ((dp).path)[1] )) / 55.5555 AS diff_time
	 FROM base 
	 ) AS t1
) AS t2
WHERE diff_time > 1
ORDER  BY id
```

# CZMLを作成し表示

CesiumでCZMLを表示するには`dataSources.add()`で実現できます。

```js
var czml ="CZML文字列";
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.dataSources.add(Cesium.CzmlDataSource.load(czml));
```
成果物公開先： http://jsdo.it/tkama/eYt3
情報処理技術者試験に向けて【基本情報技術者編】

# はじめに
HAL東京高度情報処理学科３年のminakawaです。
先日、「[これから情報処理技術者試験を受ける人たちに向けて](https://qiita.com/minakawa-daiki/items/c8915efe1c45bf5119d5)」という記事を書きましたが、今回は**基本情報技術者試験**にフォーカスを当てて記事を書きたいと思います。

# 基本情報技術者試験について
基本情報技術者試験は**「ITエンジニアの登竜門」**とIPAのサイトに書かれている通り、ITに関する**基本的知識・技能**をもったIT技術者であることを表す資格です。
年に2回（春と秋）に実施され、H28の実績は136,376名の応募に対して合格率は26.6％となっています。
また、基本情報技術者試験はレベル2に属しております。（レベル1はITパスポート）

## 試験時間・出題形式・出題数（解答数）
||午前|午後|
|:-:|:-:|:-:|
|試験時間|9:30～12:00(150分)|13:00～15:30(150分)|
|出題形式|多肢選択式（四肢択一）|多肢選択式|
|出題数|80問|13問|
|回答数|80問|7問|

午前午後ともに60点以上で合格です。

問題はすべて選択式で、出題内容はテクノロジ系、マネジメント系、ストラテジ系とITに関する幅広い知識を問われます。
詳しくはIPAが出している以下のシラバスを見ましょう。
[https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver4_0.pdf](https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver4_0.pdf)

# 筆者の勉強期間と点数
私はITパスポートを3月に取得しており、その期間からと考えると勉強期間は8か月です。
毎日コツコツ午前問題を解いたりしていた記憶があります。
受験回はH27秋で、点数は午前が「81.25点」午後が「87.00点」でした。

# 勉強方法
初めに断っておきますが、勉強方法は人それぞれです。あくまで参考として私の勉強方法を記しておきますので参考になれば幸いです。
まず、私のスタイルは「**段階を踏む**」ことです。基本情報技術者試験までにITパスポートをはじめ、情報検定を受けました。
中には基本情報技術者試験を直接受けて合格すればよいと考えている人もいますが、私はあまりお勧めはしません。
**基本情報技術者試験はレベル2の試験**なのです。何回も繰り返して試験を受け、段々難しいテストに挑戦していくのがベストだと私は思います。特にITパスポートは一年を通じてほぼ毎日試験を行っているのでお勧めです。
そもそも一発で絶対受かる自信のある人はもうこの記事見なくても大丈夫でしょう。少しでも不安がある方は段階を踏んでみましょう。

## 使用した参考書・問題集と期間
ITパスポートと情報検定ももちろんテキストを購入したのですが割愛します。
基本情報技術者試験で使用した参考書と期間は以下の通りです。
※期間はかすかな記憶をたどり書いたものなのであくまで参考程度で。

- **ITワールド**  
学校で購入。内容が詳しすぎるので、やりこみすぎに注意。（期間：1か月目～8か月目）
- **キタミ式イラストIT塾 基本情報技術者**  
おすすめ。自分に合った参考書を一冊やりきることは大切です。（期間：2か月目～4か月目）
- **基本情報技術者試験午前問題集**  
学校で購入。午前はこれで叩き込みましたが、過去問道場でもいいでしょう。（期間：2か月目～8か月目）
- **基本情報技術者試験CASL2完全合格教本**  
選択問題はCASL2を選択すると決めていたのでこの本を選びました。（期間：5か月目～6か月目）
- **うかる! 基本情報技術者 [午後・アルゴリズム編] 2017年版 福嶋先生の集中ゼミ**  
アルゴリズムが苦手（初めての経験）だったのでこの本で集中的にやりました。（期間：6か月目～8か月目）
- **iTEC - 基本情報技術者 午後試験対策 (午後問題対策シリーズ)**  
午後問題はほぼこれで網羅しました。おすすめです。（期間：7か月目～8か月目）

# 今、基本情報技術者試験を振り返ってみて
かなり基本情報技術者試験対策してたなぁって感想です。
当時はとにかくITの知識に関して無知だったので、がむしゃらだったのでしょう。
ここでの勉強量のおかげでその次の応用情報技術者試験・ネットワークスペシャリスト試験の負担が減ったんだと思います。
基本情報技術者の上のレベルを目指している人は是非ここでしっかりと基礎を作っておくことが大切です。

# おわりに
次回の資格試験は4月です。（2017年12月現在）
あと5か月ほどあるので今からしっかり勉強すれば十分合格には間に合うと思います。
大事なことは**段階を踏むこと**、**毎日コツコツ勉強すること**、**周りに踊らされないこと**です。
特に周りには「1か月で受かるよ！」とか煽ってくる人もいますが、その人はその人です。自分のペースで頑張りましょう。
TimelineでEffekseerのエフェクトを制御する

# はじめに
Effekseerというオープンソースの無料なエフェクト作成ツールがあります。
初めての方はこちらの記事も合わせて読んでみてください。

- [エフェクト作成ツール「Effekseer」の魅力](https://qiita.com/orangesuzuki/items/477cb2ee68edf65a0d0d)
- [Effekseerでエフェクトを作成してUnityで再生する](https://qiita.com/toRisouP/items/3cc9912ad95b06de1c8d)


# Timeline対応！
v1.30でUnityのTimelineに一応対応しました。
この記事ではTimelineでEffekseerのエフェクトを制御する方法を紹介したいと思います。

# TimelineでEffekseerを使う手順

## 1. Timeline Editorを開く
まず、Timeline Editorを開きます。
今回はSDユニティちゃんが走り回るアニメーションを作りました。
![unitychan.gif](https://qiita-image-store.s3.amazonaws.com/0/11172/4de7e35d-fdc7-5ffd-860e-aab095d289ed.gif)

## 2. Playable Trackを追加する
Addを押して、Playable Trackを追加します。
そうするとユーザーが定義したPlayable Assetを追加できるようになります。

![SnapCrab_NoName_2017-12-5_0-38-48_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/11172/338c47bc-f8af-dfed-da35-ee3498c9b7f2.png)

## 3. Effekseer Playable Assetを追加する
場所は /Effekseer/Plugins/EffekseerPlayableAsset.csです。
これをPlayable Trackのタイムラインにドラッグ＆ドロップしちゃってください。

![SnapCrab_NoName_2017-12-5_0-42-35_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/11172/7ebe62e4-36e8-a5b2-7617-c69c7621de8d.png)

## 4. パラメータを設定する。
Effekseer Playable Assetを選択して、Inspectorから以下のパラメータを設定します。
- Effect Name
- Emitter Object

![SnapCrab_NoName_2017-12-5_0-48-14_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/11172/7d7c74b0-9eeb-0ae7-0552-8e3f1c6bcf3f.png)

Effect Nameはエフェクトの名前を指定します。普段EffekseerEmitterに設定するやつと同じですね。
Emitter ObjectにはただのGameObjectを指定します。EffekseerEmitterをAdd ComponentしなくてもOKです。
Targetはターゲット位置を指定するときに使います。普段は使いません。

## 5. 見てみる

![unitychan2.gif](https://qiita-image-store.s3.amazonaws.com/0/11172/d89773b3-f816-413c-e56b-aa20aaaf6b36.gif)

時間のツマミをマウスで移動させてもエフェクトが同期します。
(ランダム要素があるエフェクトを逆方向に動かすとちょっとオカシクなる)

# ここまで

カッコいいデモでも作ろうかと思ってたのですが、ここ2,3日体調がちょっとよろしくないのでここまでとさせてください(スミマセン

使ってみてここの使い勝手どうなの？ってことがありましたら、沢山Twitterでツイートしてください。
次のバージョンでガンガン改善されていくかもしれません。よろしくおねがいします。
%USERPROFILE%フォルダについて

Windowsの一般のユーザーアカウントの場合、ユーザー環境変数`USERPROFILE`に`C:\USER\(アカウント名)`のパスがセットされている。
例えば`hoge`という名前のアカウントであれば、`C:\USER\hoge`となる。

ただし、ビルトインアカウントの場合は以下のパスになる。

|アカウント       |パス                                     |
|:----------------|:----------------------------------------|
|System           |C:\Windows\System32\config\systemprofile |
|System(WOW64[^1])|C:\Windows\SysWOW64\config\systemprofile |
|LocalService     |C:\Windows\ServiceProfiles\LocalService  |
|NetworkService   |C:\Windows\ServiceProfiles\NetworkService|

Windowsサービスなど、ビルトインアカウントで動作させるプログラムでファイルを扱う場合には頭に入れておきたい。

[^1]: [WOW64 - Wikipedia](https://ja.wikipedia.org/wiki/WOW64)を参照。
PHPでサクッと○日後の日付計算

今日の日付から3日後を求めたかった。

でも例えば11月29日の3日後等、単純に+3日ではうまくいかないなーと思っていた。

調べたら簡単なやり方があった。

```php
//現在時刻から3日後
echo date("Y-m-d",strtotime("+3 day"));//"2017-12-08"
//特定の日付から3日後
$target_day = "2017-12-05";
echo date("Y-m-d",$target_day.strtotime("+3 day"));//"2017-12-08"
```

これらを参考にした。
[PHP：strtotime](http://php.net/manual/ja/function.strtotime.php)
[【PHP】指定時間前や指定時間後の日時を求める](http://ysklog.net/php/2094.html)←詳しいのはココ