OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio > link > WPF | ICommand > CanExecute()の使用例 | PasswordBoxにはbindingできない

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
```

MVVMにてICommandを使う実装を試そうとしたら、CanExecute()の実装がないためエラーとなった。

ICommand関連は未消化だった。
CanExecute()について調べた。

@gushwell さんのページが参考になりました。
http://gushwell.ldblog.jp/archives/52321430.html

テキスト文字列がnullや空文字列の場合はボタンを押せないという実装として使われています。

### PasswordBoxへのbindingを試した。

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _170623_t1800_ICommand_password
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }


    public class MyCommand : ICommand
    {
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public bool CanExecute(object parameter)
        {
            string text = parameter as string;
            return (text == "123456");
        }

        public void Execute(object parameter)
        {
            MessageBox.Show("Genie in the Lamp");
        }
    }
}
```

```MainWindow.xaml
<Window x:Class="_170623_t1800_ICommand_password.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170623_t1800_ICommand_password"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:MyCommand x:Key="myCommand"/>
    </Window.Resources>
    <Grid>
        <StackPanel Margin="20">
            <PasswordBox Height="24" Name="passBox1"/>
            <Button Content="Genie" Height="24" Name="button1" Width="75"
                    Command="{Binding Mode=OneWay, Source={StaticResource myCommand}}"
                    CommandParameter="{Binding ElementName=passBox1, Path=Password}"/>
        </StackPanel>
    </Grid>
</Window>
```

"123456"と入力すればボタンが押下可能になり、アラジンの魔法のランプのGenieが登場。

のはずがそうはならなかった。

```
string text = parameter as string;
```
のtextはnullになった。

以下を見つけました。
https://garafu.blogspot.jp/2014/09/wcf-passwordbox.html
> WPF の PasswordBox は セキュリティ上の問題から直接データバインドすることができません。 …が、セキュリティ上の問題を承知したうえで、それでもデータバインドしたい、簡便さを優先したい場合があると思います。 今回は、セキュリティ上の問題を承知したうえで、データバインドを実現する方法をまとめます。
Eloquentモデルで、findに配列を渡して複数取得

Laravelのソースコードを眺めていたら気付いた。

```php
>>> App\Models\User::find([1,2,3])->pluck('id')
=> Illuminate\Database\Eloquent\Collection {#1090
     all: [
       1,
       2,
       3,
     ],
   }
```

今まで `User::whereIn([1, 2, 3])->get()` などとしていたので衝撃だった。

`findMany` というメソッドもある。内部的にはこれが呼ばれている。

```php
public function findMany($ids, $columns = ['*'])
{
    if (empty($ids)) {
        return $this->model->newCollection();
    }

    $this->query->whereIn($this->model->getQualifiedKeyName(), $ids);

    return $this->get($columns);
}
```
Time stamp difference between AngularJS and Rails 

Recently, I've been working on Rails and AngularJS with CoffeeScript, and found difficulty to pass date-time data type object from Rails, where those objects are stocked, to AngularJS, which is to sort and some stuff.

My solution is this:
*****
In controller.rb;
@time = Record.find(1).created_at

In view.html.erb;
ng-init="time = @time.to_i * 1000"
{{ time | date:'yyyy/MM/dd' }}

***

Log in console
cre = Record.first.created_at
=> Thu, 21 May 2015 02:07:56 UTC +00:00
cre.to_time
=> 2015-05-21 11:07:56 +0900
cre.to_time.class
=> Time
cre.to_time.to_i
=> 1432174076
cre.to_time.to_i.class
=> Fixnum

***
Values in '.rb' files, it's related with Active Record, but once passed into '.html.erb', those are converted to usual data.

Because of above, if you check in console, you have to change that to Time Class Object.

Rails -> Date Object( --second ) || Time Object( --miliseconds )
AngularJS -> Timestamp == Rails.Time

***
Terminal commands to make your mac original


###Enable to copy and select text from Quick Look
```
defaults write com.apple.finder QLEnableTextSelection -bool TRUE; killall Finder
```
###Change window resize range
```
defaults write -g AppleEdgeResizeExteriorSize 20
```
###Show Quit Button for Finder
```
defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE; killall Finder
```
###Enable to show full path on file name bar
```
defaults write com.apple.finder QuitMenuItem -bool TRUE; killall Finder
```
###Make path bar to full path from root
```
defaults write com.apple.finder PathBarRootAtHome -bool TRUE; killall Finder
```
###Build Recent Used apps in docks
```
defaults write com.apple.dock persistent-others -array-add '{ "tile-data" = { "list-type" = 1; }; "tile-type" = "recents-tile"; }'; killall Dock
```
How to Start New Rails App

#What this
This document is for setting up new Rails app with specific ruby and rails version, too complexed process, by using rbenv, ruby version organizing system.

#Understanding
Directory_you_want_to_build_your_app
├── Gemfile
├── vendor
│　　└── bundle
│　　　　├── ...
│　　　　└── ...
└── YourApp
　　├── app
　　├── assets
　　│   ├── ...

Once You Have to Make 'Gemfile' and 'vendor/bundle' Directory.
After Generate 'YourApp' by Those, You can Delete if You Want.
Then, Dig Into 'YourApp' and do 'bundle install' for 'YourApp'.
This process could be complicated for you.

#How to

###Install rbenv
```
brew install rbenv
```
###Install some packages for enable rbenv
```
brew install openssl
brew install readline
brew install libiconv
```
###Check Versions Available
```
rbenv versions -l
```
###Get ruby version want to use ("2.x.x" is version you want to have)
```
rbenv install 2.x.x
```
###Change Ruby version to installed version
```
rbenv global 2.x.x
```
###Get proper bundler for specific ruby version
```
rbenv exec gem install bundler
```
###Also Rails for specific ruby version
```
rbenv exec gem install rails
```
###Make Gemfile in the directory you want to put your new rails app in ("4.x.x" is version of rails you need)
```
cat << EOS > Gemfile
source "http://rubygems.org"
gem "rails", "4.x.x"
EOS
```
###Install rails to make rails app
```
bundle install --path vendor/bundle
```
###Make rails app
```
bundle exec rails new MyApp --skip-bundle
```
###Move into rails directory
```
cd MyApp
```
###Bundle install in the new app directory
```
bundle install --path vendor/bundle
```
#FINISHED!!!

###Now you can do whatever you want
```
bundle exec rails server
```
or
```
bundle exec rails console
```
and so...

###Have fun!!!
PhantomJSでratina用2倍画像をキャプる

phantomJSでキャプチャすると通常１倍の画像サイズとなるが
macで作業していると気になるしサイト作成時困るので、もともと2倍で書き出せるようにした。

```javascript:sample.js
var page = require('webpage').create();
page.viewportSize = {
    //画像サイズは2倍で設定しておく
    width: 2800,
    height: 1800
};
page.open('https://google.co.jp', function(status) {
  if(status === "success") {
    page.evaluate(function () {
　　　　　　　　　　　　//ここで２倍にする
      document.body.style.webkitTransform = "scale(2)";
　　　　　　　　　　　//画像の座標を0%にしておかないとこの次に2/1にしたときにずれる
      document.body.style.webkitTransformOrigin = "0% 0%";
      //画像サイズにもとづいて2倍にされるので、全体を半分の2/1にする
      document.body.style.width = "50%";
      //背景を白くしておかないとpngで書き出すと透明になる
      document.body.bgColor = 'white';
    });
    window.setTimeout(function() {
      page.render('image.png');
      phantom.exit();
    }, 8000);
  }
});
```
キャプチャ系はwkhtmltoimageよりも使える印象ではあるが、やはりサイトによってはsetTimeoutの時間が10秒くらいあってもうまく表示されたりされなかったり。
[Linux][lsof] ファイルが他のプロセスから操作中かを確認する

バックアップファイルが書き込み中か確認するのにファイルサイズとタイムスタンプを見る以外の方法がないか調べたメモ

# lsof

`lsof` を使用することで他のどのプロセスが使用中かも含めて確認することができます。

```console:ファイルを他のプロセスが使用しているか確認する
root@ubuntu-xenial:/tmp# touch test.txt

root@ubuntu-xenial:/tmp# less test.txt
(Ctrl+z で停止)
[1]+  停止                  less test.txt

root@ubuntu-xenial:/tmp# lsof test.txt
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
less    6090 root    4r   REG    8,1        0 57574 test.txt
```

これで、実行コマンド、pid、実行ユーザーなどを確認できます。

注意点として、一般ユーザーからでは全ての他のプロセスは見えませんでした。
(rootがアクセス中のファイルに一般ユーザーが `lsof` で確認しても使用中か見えない）

# inotify-tools
もう少し詳細に見たい場合は、`inotify-tools` を使用すると良さそうです。
すでに詳しい記事があったため、以下などを参照して下さい。

[inotify-toolsでファイルやディレクトリを監視する - Qiita](http://qiita.com/stc1988/items/464410382f8425681c20)

# 参考
[lsofの使い方 - プロセスが使用中のファイルを調べる - うまいぼうぶろぐ](http://hogem.hatenablog.com/entry/20070223/1172221315)
[lsofコマンドで覚えておきたい使い方9個 | 俺的備忘録 〜なんかいろいろ〜](https://orebibou.com/2016/04/lsof%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B99%E5%80%8B/)
Boost.Asioのio_serviceで非同期実行

# 概要
C++のよく知られたライブラリとしてBoostがあります。このBoostのネットワークライブラリとしてAsioがあります。
Boost.AsioにはOSとの仲立ちをしてくれる機能としてboost::asio::io_serviceがあります。
ここでは、これを利用した非同期実行の方法を書いていきます。

# io_serviceにできること
シングルスレッドでの非同期実行。Node.jsみたいな感じで単一スレッド上でキューに入っている処理を非同期に実行してくれます。
マルチスレッドの非同期実行。シングルスレッドでもそこそこに面倒な非同期処理をマルチスレッドでも可能にしてくれます。

# とりあえず実行してみる
シングルスレッドでのソースと実行結果を載せます。

```cpp
// clang++ -std=c++11 -lboost_system test1.cpp

#include <iostream>

#include <boost/asio/io_service.hpp>

namespace {
    // とりあえずの処理1
    void func1() {
        std::cout<<"func1"<<std::endl;
    }
    // とりあえずの処理2
    void func2() {
        std::cout<<"func2"<<std::endl;
    }
}

int main() {
    boost::asio::io_service ios;

    // io_serviceの中にあるキューに追加する
    for(std::size_t i=0; i<2; ++i) {
        ios.post(func1);
        ios.post(func2);
    }

    // キューがなくなるまで実行を続ける
    ios.run();
}

```
実行結果

```
func1
func2
func1
func2
```
これだけでは何も有り難みがありませんが、通信などいつ処理が起きるかわからないような用途ではちょうど良い仕組みだと思います。

# マルチスレッドで実行
シングルスレッドでもマルチスレッドでもある程度の処理は同じです。(内部の処理は全然違うかもしれませんが)
シングルスレッドとの一番の違いは`run`を複数のスレッドで呼ぶことです。
`io_service`では`run`が呼ばれたスレッドで処理を実行していきます。

### とりあえず書いてみる
```cpp
// clang++ -std=c++11 -lboost_system -lpthread test.cpp

#include <thread>
#include <iostream>

#include <boost/asio/io_service.hpp>

namespace {
    // とりあえずの処理1 改(1秒停止)
    void func1() {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout<<"func1"<<std::endl;
    }
    // とりあえずの処理2 改(3秒停止)
    void func2() {
        std::this_thread::sleep_for(std::chrono::seconds(3));
        std::cout<<"func2"<<std::endl;
    }
}

int main() {
    boost::asio::io_service ios;

    // io_serviceの中にあるキューに追加する
    for(std::size_t i=0; i<2; ++i) {
        ios.post(func1);
        ios.post(func2);
    }

    // キューがなくなるまで実行を続ける
    //  スレッド
    std::thread t([&ios]{ios.run();});
    //  メインスレッド
    ios.run();
    
    t.join();
}
```
実行結果

```
func1
func1
func2
func2
```
このように複数のスレッドで実行した場合、処理が終わったスレッドから順次処理を消化してくれます。

# postとdispatch
io_serviceには`post`と`dispatch`メンバ関数があります。この関数の違いは処理が扱われ方にあります。
`post`は普通にキューに処理を追加し順番が回ってきたら自動的に実行されます。
`dispatch`はキューとは関係なく処理を一時停止し、渡された処理をその場で実行します。

# 余談
C++ではC++11から`std::thread`が標準になりましたが、複数のスレッドをまとめて立てるときはコンテナに入れる方法しかありません。また、コンテナに収まっていると言ってもすべて別々のスレッドクラスであるため一つ一つの項目に対して`join()`を呼ばないといけないためめんどくさいです。
そこで、あえて標準のスレッドを使わず、Boostのスレッドを使う手があります。Boostのスレッドには`thread_group`というクラスがあり、このクラスは属するスレッドをまとめて`join`できる`join_all`という関数があります。

# 参考
+ [Boost.Asioまとめ(1)::io_service](http://yutopp.hateblo.jp/entry/2011/12/15/001518)

# テストプログラムの環境
OS : Linux Mint 18(x64)
コンパイラ : clang++ 3.8.0
Boost : 1.58.0
RailsでSlackのWebhookを受ける時に protect_from_forgery でトークンを検証する

`verify_authenticity_token` をオーバーライドしてトークンの検証をしてあげれば良い。
たぶん他のサービスのWebhookにも応用できる。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end
```

```app/controllers/slack_controller.rb
class SlackController < ApplicationController

  private

  def slack_token
    fail NoMethodError.new('please overwrite')
  end

  def valid_slack_token?
    params[:token] == slack_token
  end

  def verify_authenticity_token
    unless valid_slack_token?
      logger.warn "WARNING: Can't verify Slack token authenticity" if logger
      handle_unverified_request
    end
  end
end
```

```app/controllers/slack/webhooks_controller.rb
class Slack::WebhooksController < SlackController
  def create
    head :ok
  end

  private

  def slack_token
    ENV['SLACK_TOKEN']
  end
end
```
DebianにTOMOYO Linuxをインストールする

# TOMOYO Linuxをちゃんと使おう

名前だけで出オチ感があって、あまり使用・運用に関するノウハウが出てこないので、とりあえず自分で使ってみようとしたメモです。使ってみる人が増えて、もっとノウハウが増えてくれば幸せ。未だに萌系ディストリじゃないかと勘違いしてる人も多い印象だし。

いろいろと思うところあって、手軽に導入できそうなセキュリティソリューションってなんかあるっけということで、TOMOYO Linuxに思い至りました。
今回、自家用環境をDebian stretchで整備し直したので、最初からTOMOYOを有効にした状態で運用に入ってみています。ここではとりあえず導入までで、追々運用しながらenforcingするところまで行きたいです。

## そもそもTOMOYO Linuxってなんだっけ？

[公式ドキュメントの前書き](http://tomoyo.osdn.jp/2.5/chapter-2.html.ja)とか、[Wikipedia](https://ja.wikipedia.org/wiki/TOMOYO_Linux)を参照。
セキュアOSの一種でLinux上での強制アクセス制御を実現するものです。この機能を有効にすると、あらかじめ設定もしくは学習された動作以外を制限することができ、root権限で動くプロセスであっても許可されていないものを制御することが可能です。
なので、例えば何らかの脆弱性などを突かれて「権限奪取」や「任意のコード実行」などを試みられたとしても、それがあらかじめ許可された動作でなければ拒否することが可能になります。

ちなみにTOMOYO LinuxはNTTデータが開発しているというのは有名な話ですが、DebianのTOMOYO関連パッケージのメンテナも日本の方です。
ちょっと古いけど、[メンテナのやまねさんの記事にもあるように](https://thinkit.co.jp/article/984/1)、DebianはセキュアOSに対して比較的ニュートラルなスタンスを採っています。なので、導入障壁が比較的低いTOMOYO Linuxは意義のある選択肢だと思います。

なお[公式ドキュメント](https://tomoyo.osdn.jp/documentation.html.ja)は結構充実していて、その分理解するのが大変ですがぜひ一読を。


## まずはインストール
Debianでは公式のパッケージが提供されていますので、aptでインストールしましょう。

`# apt-get install libtomoyotools3 tomoyo-tools`


```html:/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=quiet security="tomoyo"
```

を追加しろというドキュメントもありますが、stretchではapt-getでインストールすると自動的に追加されます。お手軽ですね。

`# /usr/lib/tomoyo/init_policy`
を実行すると/etc/tomoyo以下に設定ファイルが作られるので、その後で再起動すると、それだけでTOMOYO Linuxが有効なカーネルで起動します。

## ログを取るようにする

TOMOYO Linuxがアクセスを拒否したりポリシーにマッチしない動作を検知した時のログがあった方が便利です。これはtomoyo-auditdというデーモンがやってくれるので、起動してやればOKです。
イマドキの正しい作法としてはsystemdでやるべきかと思うので、

```/etc/systemd/system/tomoyo-auditd.service
[Unit]
Description=TOMOYO Linux Auditing Daemon

[Service]
Type=forking
ExecStart=/usr/sbin/tomoyo-auditd
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
```

これを`/etc/systemd/system/tomoyo-auditd.service`として保存しましょう。んで、

```html:tomoyo-auditdの起動と自動起動設定
# systemctl daemon-reload
# systemctl start tomoyo-auditd.service
# systemctl enable tomoyo-auditd.service
```

としてやれば、tomoyo-auditdが起動して、さらにOS起動時に自動起動するようになります。
ついでにログローテートも仕込んでおけばよいでしょうか。


## 実際に使ってみる

`# tomoyo-editpolicy`
を実行すると、ポリシーエディタが起動して、デフォルトでは自動的に記録されたドメインが表示されます。詳しくは[公式のドキュメント](https://tomoyo.osdn.jp/2.5/chapter-4.html.ja)を読んで、「ドメイン」の概念と「プロファイル」「モード」の仕組みを理解しましょう。なんとなくポリシーエディタを眺めてるとわかってくるはず…。
「ドメイン」はプロセスと似たような意味合いだけどもうちょっと奥深いTOMOYO Linux固有の概念です。「モード」は大きく分けて「disabled」「learning」「permissive」「enforcing」の4つがあるのをとりあえず覚えておけばいいでしょうか。

使い方は運用とも絡むので、あらかじめ流れをイメージしておきましょう。大まかにはこんなところかなと。

1. サーバの挙動を学習させて、ドメインを適切な単位でまとめたり切り離したりする
2. まとめられたドメインをlearningモードに変更して、細かいアクセス要求を学習させる
3. 学習したアクセス要求をパターン化してまとめる
4. ある程度まとまったらpermissiveモードに変更して、漏れたポリシーがないか確認する
5. 問題なさそうならそのドメインをenforcingモードにする
6. 同じ作業を他のドメインでも繰り返す

どのドメインからやっていくかとかは環境や使い方によりけりですね。動作を学習させるだけでも、個々のプロセスの内部的な挙動がわかって面白いので是非動かしてみましょう。

長くなってきたのとまだこの先は模索中なので、ドメイン管理とか学習の話はまた改めて。
gulp-convert-encoding / gulp-header


システム側の都合やレガシーサイトのリニューアルにもかかわらず、文字コードが変更できない場合など、開発時にタスクランナー（ここでは「gulp」）を利用して、開発は「UTF-8」、コンパイル時に他の文字コードへ変換することで対応する。

https://www.npmjs.com/package/gulp-convert-encoding
https://www.npmjs.com/package/gulp-header

用途例：Sassを「UTF-8」で開発し、コンパイル時に他の文字コードへ変換する

##install
```
$ npm i -D gulp-convert-encoding
$ npm i -D gulp-header
```
##Usage Basic
```
var gulp = require('gulp');
var sass = require('gulp-sass');
var convertEncoding = require('gulp-convert-encoding');// 文字コードを変換
var header = require('gulp-header'); //@charset宣言を先頭追加する為に使用
 
gulp.task('styles', function () {
  return gulp.src('src')
    .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
    .pipe(header('@charset "EUC-JP";\n'))// @charset 宣言を追加
    .pipe(convertEncoding({to: "EUC-JP"}))
    .pipe(gulp.dest('dist'))　//任意のフォルダー[htdocs/assets/css]とか
});

```

※結論としてHTMLとCSSで文字コードが違っても、CSSの先頭で文字コード宣言すればよいかと。
※HTML5では、aタグ、linkタグのcharset属性が廃止

参考：(エディターパッケージ)
https://atom.io/packages/auto-encoding
https://github.com/seanliang/ConvertToUTF8
Bluemixコンソールに「アクセス権限がありません」と表示されるようになった皆様へ

(2017年11月のコンソールupdateでこの現象はあまり発生しなくなったのではないかと思います。)

2017年6月20日頃からBluemixにアクセスすると、ログインはできるものの画面の上の方にアラートのメッセージが表示されるようになったという話を聞くようになりました。具体的にはログイン後の画面で以下の警告メッセージが表示されるそうです。
「組織およびスペースへのアクセス権限がありません。Cloud Foundryへのアクセス権限と、少なくとも1つの組織およびスペースへのアクセス権限があることを確認してから、再試行してください。適切なアクセス権限があるかを、アカウント所有者または管理者に確認してください。」
Bluemixが利用できなくなったわけではありません。ご安心ください。今回はこのメッセージが表示されたときの対処方法を説明します。

![alert1.png](https://qiita-image-store.s3.amazonaws.com/0/83689/27951725-e5b5-7ffd-dec5-b666e6275fe2.png)

# Bluemixコンソールの変更

このメッセージ、実はBluemixコンソールの仕様が変わったことにより、表示されるようになりました。コンソールは今までリージョン毎にURLを持ち、それぞれ独立して稼働していましたが、Bluemix Publicの全てのリージョン(地域)で同じコンソール/URLを使用するようになりました。従来のコンソールにアクセスしても自動的に新しいコンソールに転送されるようになりました。

従来のコンソールURL
- *米国南部リージョン* https://console.ng.bluemix.net
- *英国リージョン* https://console.eu-gb.bluemix.net
- *シドニーリージョン* https://console.au-syd.bluemix.net
- *ドイツリージョン* https://console.eu-de.bluemix.net

新しいコンソールURL
- https://console.bluemix.net

これ以降、”組織”・”スペース"といったBluemix特有のリソースの管理単位については登場いたしますが、説明を割愛しております。[Bluemix利用ガイド](https://www.ibm.com/developerworks/jp/bluemix/guide/)の「Bluemix の利用（基本編）」P.13あたりをご参照ください。

# エラーが表示されるのはシドニーリージョンにアクセス可能な”スペース"がない方

新しいコンソールURLにアクセスした時にエラーが表示されるのは、シドニーリージョンにアクセスできる”スペース"をお持ちでないお客様です。これは新しいコンソールでは最寄りのリージョンの"組織”・”スペース"を表示するような仕様となっており、日本からアクセスするとシドニーリージョンが最寄りのリージョン(地域)となります。警告メッセージにあるとおり、Bluemixの”組織”や”スペース"がシドニーに作成されておらず、アクセスできないことが最も考えられる原因です。
このとき考えられる対処方法は以下の2つです。

# 対処方法 1) 今まで使用していたリージョン(地域)の”組織”・”スペース"をそのまま利用する

最も簡単なのはコンソールでリージョン・”組織"・”スペース"を切り替えて、従来の環境にアクセスすることです。
コンソール画面の右上にアカウント名、リージョン名、組織名、スペース名が表示される部分をクリックすることで従来の環境にアクセスできます。
![selectregion.png](https://qiita-image-store.s3.amazonaws.com/0/83689/55188157-87fb-cd14-58b2-d52fa7e3d384.png)

リージョン(地域)をはじめ、リストを選択した後に画面が完全に切り替わるまで待つ必要があるので、そこだけは要注意です。読み込みに少し時間がかかりますが、お待ち下さい。

# 対処方法 2) シドニー・リージョンに”組織”・”スペース"を作成する

アカウントの所有者の場合は新しい”組織”・”スペース”を、”組織"の管理者権限を持っているユーザーの場合には管理している”組織”に新しい”スペース"を作成することができます。
すでに”組織"があり、”スペース"がない場合には下のようなダイアログが表示されるので、スペース名を指定し、「作成」をクリックすることで新しいスペースを作成できます。新しい”スペース”で新たなランタイムやサービスを作成ください。

![createspace.png](https://qiita-image-store.s3.amazonaws.com/0/83689/0f258cfc-d165-436b-abf9-5b7ae54396e7.png)
アプリをストアから削除する手順（iOS、Android）

#はじめに
あまり機会はないのですがアプリをストアから削除する手順のメモです。
iTunes Connect、Google Play Consoleの両方記載しています。

探しても意外と出てこなかったので、参考になれば幸いです。


#もくじ

- iOS
 - 削除
 - 確認
- Android
 - 削除
 - 確認

---
#iOS

###削除
削除したいアプリのページを開きます。
左側メニューの「**価格および配信状況**」を選択し、配信可否の「**配信から削除**」を選択します。
最後に右上の「**保存**」を押して完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/69e0091c-f78c-a2c9-f14a-dd7892b90eb7.png)

###確認
ステータスが "**デベロッパによりストアから削除済み**" に更新されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/0e9bd9ad-3346-92e3-68a4-b54f4ab8dccf.png)

---
#Android

※2017/08/31更新しました

###削除
削除したいアプリのページを開きます。
左側メニューの「**ストアでの表示**」を開き「**価格と販売 / 配布地域**」を選択してください。
アプリの公開状況が公開になっていると思うので、これを「**非公開**」にします。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/f2487afb-339d-d5e0-5df3-1c059c9caed1.png)

確認のアラートが出るので「**確認**」を押してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/b1ec2a4c-fe76-3ae0-ff33-284851848b97.png)

非公開になったので「**アップデートを送信**」を押します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/d20cf465-c113-cacb-0f30-88f5d7e3561d.png)

###確認
ステータスが"**公開停止中**"に更新されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181624/27d288fa-525f-ab40-004e-d349337d12b0.png)

#最後に
実際に反映されるまでは数時間かかります。
また、iTunes Connect、Google Play Consoleともに、画面仕様が変わることも多いのでご注意ください！
【MarkLogic Server】E-NodeとD-Nodeについて

はじめに
========

MarkLogicサーバのプロセスには、主にユーザからのリクエストを処理するE-Nodeと、データを管理するD-Nodeと呼ばれる２種類の役割を持ったプロセス（ノード）が存在します。
これらのノードの役割を把握した上で、MarkLogicサーバのクラスタ環境を構築したり、性能を引き出すことに役立ちます。

概要
====

MarkLogicをインストールするとノードはE-NodeとD-Nodeの両方の役割を持っています。
各ノードの役割を適切に設定することによって、E-NodeとD-Nodeごとに最適なサーバのチューニングを可能にします。
E-NodeとD-Nodeについて説明します。

| 対象MarkLogicバージョン |
|---|
|8.0-6.1|
E-Node
------

HTTP、XDBC、WebDAV等の着信要求を処理し、その結果を返却します。ディスクI/Oはほとんどなく、通常はCPUとメモリに依存します。
HTTPサーバ、XDBCサーバ、WebDAVサーバ等を割り当てたホストはE-Nodeとなります。
アプリケーションやクエリの負荷が高いシステムの場合はE-Nodeのスケールアップやスケールアウトを検討しましょう。

D-Node
------

データを取り扱うノード。主にインデックスへの高速アクセスのためにメモリを必要とし、データの読み書きにディスクI/Oを扱います。
データを扱うフォレストを作成したノードはD-Nodeとなります。
データアクセスやデータサイズが大きいシステムはD-Nodeのスケールアップやスケールアウトを検討しましょう。

E-Node兼D-Node
--------------

データを扱うフォレストを作成し、かつ、HTTPサーバ、XDBCサーバ、WebDAVサーバ等を割り当てたノードはE-NodeとD-Nodeの役割を担います。

おわりに
========

MarkLogicでクラスタを構成する際にはE-NodeとD-Nodeを意識して、最適なサーバチューニングを目指しましょう！

```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
【MarkLogic Server】FLWOR式に従わず、単純に関数を逐次処理したい場合

はじめに
========

通常、XQueryはFLWOR式に従って記述しないとエラーになってしまいます。
しかし、単純に複数のXMLを登録したい、など、簡単な処理を逐次的に実行したい場合にFLWOR式で記述するのは面倒です。
そこで、逐次処理を単純に記述する方法をご紹介します。

概要
====

MarkLogicのXQueryでFLWOR式を使用せずに関数を逐次処理する方法を記載します。

| 対象MarkLogicバージョン |
|---|
|8.0-6.1|

内容
====

XQueryの関数を“,”（カンマ）で結合すれば、順に実行します。

例：複数のドキュメントを順番に登録します。

    xdmp:document-insert("/a.xml", <a>a</a>),
    xdmp:document-insert("/b.xml", <b>b</b>),
    xdmp:document-insert("/c.xml", <c>c</c>)

おわりに
========

XQueryで書くコードの量が少なくなり効率的です。簡単な逐次処理を実行する場合はとても便利です！

```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
Laravel5.7: 削除確認をBootstrapのModalで行う

記事やユーザーの削除ボタンを押したら、いきなり削除せずにモーダルウィンドウで確認できるようにします。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/78195105-fe6d-928d-6ebb-bcfb6762b85b.png)


# 親記事
[Laravel 5.7で基本的なCRUDを作る - Qiita](https://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# モーダル用のコンポーネントを作る
[以前の記事](https://qiita.com/sutara79/items/cd4371b246b44a2cf87f#%E5%89%8A%E9%99%A4-destroy)で作った`btn-del.blade.php`を、丸ごと下記の内容に修正します。
[Bootstrap4のモーダル](https://getbootstrap.com/docs/4.0/components/modal/#modal-components)を利用しています。

:page_facing_up: [resources/views/components/btn-del.blade.php](https://github.com/sutara79/demo-laravel-crud/blob/5.7/resources/views/components/btn-del.blade.php)

1ページの中で複数の削除ボタンを表示する場合があるので、id属性がユニークになるように`modal-delete-<コントローラ名>-<id番号>`のように記述します。
最終確認の削除ボタンを`<form>`で囲って、削除用のアクションメソッドへ送信するようにしています。


# コンポーネントを呼び出す
[以前の記事](https://qiita.com/sutara79/items/cd4371b246b44a2cf87f#%E3%83%93%E3%83%A5%E3%83%BC-4)で作ったコンポーネントとはスロットの数も内容も異なるので、下記のように修正してください。
これで完成形です。

```php:resources/views/posts/show.blade.php
        @component('components.btn-del')
            @slot('controller', 'posts')
            @slot('id', $post->id)
            @slot('name', $post->title)
        @endcomponent
```

```php:resources/views/users/show.blade.php
        @component('components.btn-del')
            @slot('controller', 'users')
            @slot('id', $user->id)
            @slot('name', $user->title)
        @endcomponent

(中略)

                            @component('components.btn-del')
                                @slot('controller', 'posts')
                                @slot('id', $post->id)
                                @slot('name', $post->title)
                            @endcomponent
```
Laravel5.4でFORMファサードを利用する方法


#FORMファサード
[Formファサードのレシピ](http://recipes.laravel.jp/category/17)

#Laravel5では標準でインストールされない
>Laravel 4では標準で組み込まれていたのですが、Laravel 5 からは別パッケージになり、ユーザーコミュニティーによってメンテナンスされるようになりました。

[初めてのLARAVEL 5.1 : (16) FORMの作成](https://laravel10.wordpress.com/2015/03/08/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-16-form%E3%81%AE%E4%BD%9C%E6%88%90/)

#必要なもの
composerが必要です。
多分Laravel使ってる方は既にインストールしているかと思うのでインストール方法は割愛します。
インストールしていない方は別途調べて下さい。

[Composerをインストールしてみた](http://qiita.com/kakijin/items/02364adacf36410f449e)とかよいかも

#試した環境
 * CentOS7
 * Laravel5.4
 * Composer 1.4.2
 * PHP7.0


#方法
LaravelCollective公式サイトに記載してありました。
公式は英語で書かれているので、補足も交えて日本語でここに手順を書いておこうと思います。

[LaravelCollective公式](https://laravelcollective.com/)

![スクリーンショット_2017-06-23_15_44_22.png](https://qiita-image-store.s3.amazonaws.com/0/72559/a5c87105-d5b8-63fe-e540-8d89895a3db3.png "スクリーンショット_2017-06-23_15_44_22.png")
上記のリンク先にあるコードをそのまま記載します。

##パッケージをComposerからインストール

```
cd Laravelプロジェクト
composer require "laravelcollective/html":"^5.4.0"

```
`composer require laravelcollective/html` でもいいかと。



すると インストールが完了し、`composer.json` に `laravelcollective/html `項目が追加されます。

```
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.6.4",
        "laravel/framework": "5.4.*",
        "laravel/tinker": "~1.0",
        "laravelcollective/html": "^5.4"
    },
```

##ProviderとAliaseを登録
`config/app.php` のProviderとAliaseに追加します。

```
vim config/app.php
```

###Providerを追加
```
  'providers' => [
    // ...
    Collective\Html\HtmlServiceProvider::class,
    // ...
  ],
```
 
###Aliaseを追加
 
```
   'aliases' => [
    // ...
      'Form' => Collective\Html\FormFacade::class,
      'Html' => Collective\Html\HtmlFacade::class,
    // ...
  ],
```
  
  
これで使えるようになります。
  
#ついでに
FORMファサードに関するメモを残しておこうと思います
##{{}}と{!!!!}の違い
{{ }}は `エスケープ処理あり`
{!! !!}は `エスケープ処理なし`
基本的にエスケープ処理なしを使うようです

##FORMファサードとヘルパ関数を一緒に使う場合
例えばテキスト入力欄

```
{!!Form::text('test_name', 'FROG', ['class' => 'test'])!!}
```

この場合、`第2引数`のFROGがvalue値になるのですが、
valueにoldヘルパを使いたい場合


```
{!!Form::text('test_name', old('test_name'), ['class' => 'test'])!!}
```

になる

と思ったけど、違うかもしれない..
誰か分かる方が居ましたら教えて下さい....

##属性の増やし方
例えばテキストの場合

```
{!!Form::text('test_name', 'FROG', ['class' => 'test_name','ID' => 'test'])!!}
```

これだと
`第一引数`がname属性
`第二引数`がvalue属性
なのですが、属性を増やしたい場合は
`第三引数`に追加が可能です

##labelを使う場合
上記のようにIDを追加可能ですが
labelのforと結びつけたい場合はtextの方にIDを書かなくても大丈夫になっています。

labelとtextの第一引数を同じ値にする必要があります


```
{!!Form::label('test_name','文字')!!}

{!!Form::text('test_name', 'FROG', ['class' => 'test_class'])!!}
```

上記のように書くと下記のようになる。

```
<label for="test_name">文字</label>

<input class="test_class" name="test_name" type="text" value="FROG" id="test_name">
```
nameとidが必然的に同じになるということですね..
IFTTT で Webhook するとエラーが出る件

# IFTTT で Webhook やると怒られる

IFTTT で Location をトリガーにして Webhook をやろうと思ったのですが、```There was a problem with the Maker Webhooks service.``` というメッセージと共に Applet failed になってしまいました。

## 動的なパラメータを" "で囲んであげればよかった

Webhook では JSONデータを送っていたのですが、ここに入れていた　```{{OccuredAt}}``` という動的なパラメータが文字列になるのに " "（ダブルクォーテーション）で囲んでなかったのが問題でした。

つまり、これを

```json
{ "timestamp": {{OccurredAt}} }
```

こうする

```json
{ "timestamp": "{{OccurredAt}}" }
```

そうすると、こんなかんじでデータが入ってリクエストされます。

```json
{ "timestamp": "June 23, 2017 at 00:00AM" }
```
デザパタ入門②

## 本日のお題

---

## オブザーバーパターン🔎

---

## オブザーバーパターン

> オブジェクト間の1対多の依存関係を定義し、あるオブジェクトの状態が変化すると、それに依存しているすべてのオブジェクトが自動的に通知され更新されるようにします。

by Head First デザインパターン

---

## クラス図
![スクリーンショット 2017-06-22 15.21.43.png](https://qiita-image-store.s3.amazonaws.com/0/74197/afbc083a-06cf-1cf9-a3ef-c4c2ed991385.png)

---

## サンプルコード
https://github.com/Islands5/design_pattern_samples/blob/master/observer/main.rb

---

## 使われ所

---

## mail

* ActionMailerの内部等で使われてる
* emailを生成、パース、送信するためのライブラリ
* https://github.com/mikel/mail

---

## コードを見てみよう!!

mailはSubjectの実装を提供、Observerはgemには内包されてない。
少し崩したパターン
![スクリーンショット 2017-06-23 15.40.15.png](https://qiita-image-store.s3.amazonaws.com/0/74197/d56ec190-4785-0965-2cc2-67125e9873e6.png)

moduleメソッドを駆使して実装
https://github.com/mikel/mail/blob/76b1e6c19e582c65c9032594054e56acb08d97fe/lib/mail/mail.rb

オブザーバーはテストコードに
https://github.com/mikel/mail/blob/21222e1b48f08f6f848d26643d6b6fb1d873d18c/spec/mail/message_spec.rb#L1786

---

## まとめ

* あまりサーバーサイドで使われない?(gemとかサーチしてみた雰囲気)
* フロントエンドでイベント伝搬等と相性がよさげ

絶賛、教科書的に実際に使われてるgem募集中!

---

## 参考

* Head First デザインパターン
* http://www.techscore.com/tech/DesignPattern/Strategy.html/

---

## デザパタ入門シリーズ

* [ストラテジパターン](http://qiita.com/g_ryotaro/items/ee63601be62984e0f239)
Karma駆動開発のススメ

# Karma駆動開発？ :thinking: 

ng-japanでQuramyさんの発表にあったやつ :bow_tone1:

![スクリーンショット 2017-06-23 15.02.21.png](https://qiita-image-store.s3.amazonaws.com/0/59312/a772eeae-cb94-ea6c-ef8a-08b55f3081e4.png)

---

# Karma? :thinking: 

- JavaScriptのテストランナー
- ブラウザを起動してその上でJavaScriptのテストを実行する
- ブラウザが起動するので見た目も確認できる
- Developer Consoleでブレークポイント等の機能が使える
- angular-cliはユニットテスト環境としてKarmaを自動でセットアップする

---

# Karma駆動開発？

- KarmaでUIロジックのテストもしつつ、見た目もそこで試行錯誤すると楽
- アプリ上で再現するのが面倒な状況もテストを書けば再現が楽
- そういうエッジケースのテストにもなって一石二鳥
- 特定のテストケースだけ走らせることができるので繰り返しが早くできる
- あくまでテスト環境なので、あまり複雑なことはしないほうが良さそう

---

# デモ

---

# おわり
アプリを約250個以上起動するとUser Defaultsが読み込めなくなる問題について



最近iOSで発生していた、突然NSUserDefaultsの内容が消えてしまう問題について、Appleから公式にアナウンスがありました。

https://developer.apple.com/library/content/releasenotes/Foundation/RN-Foundation/

> NSUserDefaults Data Loss Fix
>
Starting in iOS 9.3, and in subsequent releases of iOS and macOS, NSUserDefaults could fail to load data if more than roughly 250 separate apps (including separate reinstalls of the same app) had been launched since the last reboot. This has been corrected.

原因はiOS9.3以降のiOSで、デバイスを起動してからアプリの再インストールを含めて約250アプリを起動することで、
UserDefaultsのデータの読み込みに失敗するとのことです。


iOS11でこの問題が修正されたと案内されていますが、iOS9.3だけでなくiOS10にも影響があるということで、しばらくは尾を引きそうな問題となっています。
現状では回避が不可能に思われるので、User Defaultのロードに失敗した際のケアをしっかりする必要がありそうです。
Python環境構築

# 手順
1. pyenvのインストール
2. pythonのインストール
3. virtualenvのインストール
4. anacondaのインストール
5. 仮想環境構築
6. 仮想環境を作業ディレクトリに設定
7. script実行


# 1.pyenvのインストール
pyenv : pythonのバージョン管理ツール

```
$ brew install pyenv
$ pyenv --version
$ echo 'if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi' >> ~/.bash_profile
```

#2. pythonのインストール
```
$ pyenv install -l
$ pyenv install [インストールver]
$ pyenv versions
```

### pc自体のpythonバージョンの変更
```
$ pyenv global [使いたいver]
$ pyenv rehash
$ pyenv version
$ python3 --version
```

### 特定のディレクトリ以下のバージョンを変更
```
$ pyenv local [使いたいver]
```


http://www.task-notes.com/entry/20141215/1418612400


# 3.virtualenvのインストール
virtualenv : 同じ(python)バージョンで違う環境を作成するためのもの

```
$ pip install virtualenv
```


# 4.anacondaのインストール
anaconda : パッケージをまとめたもの(NumPy、SciPy、pandas、matplotlib、scikit-learn など)

```
$ pyenv install -l
$ pyenv install [アナコンダver]
$ pyenv global [アナコンダver]
$ pyenv versions
```


# 5.仮想環境構築
```
$ conda create -n [仮想環境名] python(=3.6) (anaconda)
$ conda info -e // 環境一覧
$ source activate [仮想環境名] // 仮想環境に入る
$ source deactivate // 仮想環境から出る
$ conda remove -n [仮想環境名] --all // 仮想環境削除
```
http://creata.hatenablog.com/entry/2016/12/18/174533


# 6.仮想環境を作業ディレクトリに設定
```
$ cd [作業ディレクトリ]
$ pyenv local [アナコンダver]/envs/[仮想環境名]
$ echo 'alias activate="source [ユーザーディレクトリ]/versions/anaconda3-4.4.0/bin/activate"' >> ~/.bash_profile
$ source ~/.bash_profile
$ activate // 仮想環境に入る
```
http://qiita.com/togoturns/items/b2ae361a669933c823f5
terminalが落ちる問題を解決: http://qiita.com/y__sama/items/f732bb7bec2bff355b69


# 7.script実行
```
$ activate [仮想環境名]
$ python [ファイル名].py
```
JQuery Mobileのラジオボタンでハマる

# JQuery Mobileのラジオボタンでハマる

jQuery-Mobile初心者なのですが、ラジオボタンの値をJSから取得・設定しようとして壮絶にはまったのでメモします。

```html:sample.html
<div class="ui-field-contain">
    <label for="pcschoice">ラジオボタンによる値設定</label>
    <fieldset name="radiochoice" id="radiochoice" data-role="controlgroup" data-type="horizontal" data-role="fieldcontain">
    <input type="radio" name="radiochoice" id="radiochoice1" value="1" />
    <label for="pcschoice1">1</label>
    <input type="radio" name="radiochoice" id="radiochoice2" value="2" />
    <label for="pcschoice2">2</label>
    <input type="radio" name="radiochoice" id="radiochoice3" value="3" />
    <label for="pcschoice3">3</label>
    </fieldset>
</div>
```
```js:sample.js
$(document).on("pagebeforeshow", "#serialportsetting", function () {
	var p = $('#radiochoise input:radio');
	var s = $('#sensorchoise input:radio');
	for (var i = 0; i < 3; i++) {
		if ($(document).data("sysinfo")['serial']['pcs'] == $(p[i]).val()) {
			$(p[i]).attr("checked", true).checkboxradio("refresh");
		}
		if ($(document).data("sysinfo")['serial']['sensor'] == $(s[i]).val()) {
			$(s[i]).attr("checked", true).checkboxradio("refresh");
		}
	}
});
```
## ポイント
`<form>`は特に必要ない
JSのエラーが直らない。原因はキャッシュでした。の設定

#メモ
最近Vue.jsを勉強しはじめたのですが、地味につまづいたのでメモしときます。
ChromeのDevelopertoolはとても便利ですが、高速化のためにキャッシュを色々と保存してくれるみたいで、それが原因でエラーが直りませんでした。
ちゃんとDevelopertoolのときだけキャッシュを無効にしてくれる設定があるんですね。

---
設定を開いて
<img width="1680" alt="Screenshot_2017-06-23_14_39_40_f0IFpg.png" src="https://qiita-image-store.s3.amazonaws.com/0/163875/93026c95-4523-6123-3c77-98ce575007db.png">

---
チェックを入れる
<img width="1667" alt="Screenshot_2017-06-23_14_39_07_ssfxQE.png" src="https://qiita-image-store.s3.amazonaws.com/0/163875/6be44ae9-20d8-fcef-9187-471bf0c82a63.png">
---

---
私みたいなレベルの方のお役に立てばいいなぁと。
Rails5の開発環境でJSの重いページを開くのがとても遅い

# RailsでJavaScriptをガンガン書く
Railsでは、標準でAsset Pipelineという機能があり、cssやJavaScript（coffeeScript)のファイルを動的に生成してデプロイしてくれるようになっている。ファイル名にハッシュをつけたりしてくれるので、デバッグ時にブラウザキャッシュが残ってJSやcssの更新が反映されないというありがちなトラブルを事前に避けることができる。
その一方で、ViewにJavaScript(coffeeScript)をガンガン増やしていくと、`rails s`でのローカルデバッグ時に、そのページを開くのがとてつもなく遅くなってしまう。開発環境(一般的にはdevelopmentステージ)では、ページを開くたびにcoffeeScriptのコンパイルやデプロイが走るようになっているためである。
最初、そんなものなのかと思って遅いのを我慢していたが、我慢の限界が来たので調べてみたところ解決方法らしきものがわかった。
## Assetsをプリコンパイル対象に入れる
`config/initializers/assets.rb`に、プリコンパイルするAssetsを定義しておく。

```:config/initializers/assets.rb`
Rails.application.config.assets.precompile += %w( search.js search.scss )
```
※search.js search.scssはAssetsの例。

## Assetsをプリコンパイルする
```
rake assets:precompile
```

## Assetsのデバッグモードを解除する
`config/environments/development.rb`というファイルに`config.assets.debug`という設定がある。標準では`true`に設定されている。

```:config/environments/development.rb
  config.assets.debug = true
```

これを`false`に設定する

以上で高速で動作するようになった。
なお、上記設定の場合JSを更新するたびにプリコンパイルをやり直す必要がある。
MarkLogicに関する技術情報を紹介します。

はじめまして。日本MarkLogicユーザ会の馬場です。
日本MarkLogicユーザ会は、XMLデータベース（NoSQL DB）である[MarkLogic](http://jp.marklogic.com/)の普及展開、活性化を目指して結成された任意団体です。
MarkLogicに関する最新情報や技術情報を発信していきます。

MarkLogicはXMLやJSON形式のデータを対象としたNo SQLデータベースです。
皆さまがお馴染みのOracle DatabaseやMySQLなどのリレーショナルデータベースの場合、事前にデータ構造（スキーマ）が決まっていなければ、データを登録して処理することはできません。
MarkLogicは、XMLやJSON形式のデータであればデータ構造を意識することなく処理できる、スキーマレスなデータベースです。

システム開発者の皆さまは、設計・開発時にデータ構造がなかなか決定しなかったり、変更が多発するような経験をされた方が多くいらっしゃると思います。
また、異なるシステムの統合・連携により、異種多彩なスキーマを扱わなければらなず、データ統合に頭を悩まされた方もいらっしゃると思います。
このようなシステムにおいて、スキーマレスなMarkLogicは力を発揮します。スキーマが確定していなくても変更が発生しても、とにかくMarkLogicにデータを投入しましょう。
そのあとで、ユーザが求める形でデータを取得して活用すれば良いのです！

今後、MarkLogicに関して以下のような技術情報を発信していきます！

基礎編
------

-   インストール方法

<!-- -->

-   簡単なデータ処理のご紹介（登録、検索、更新、削除）

XQuery編
--------

-   XQueryの書き方

<!-- -->

-   検索を高速化してみよう

基盤編
------

-   MarkLogic のアーキテクチャ

<!-- -->

-   クラスタリング

アプリケーション開発編
----------------------

-   XCC/XDBC

<!-- -->

-   REST-API

<!-- -->

-   Java Client API

関連ツール編
------------

-   データロードツール MLCP

<!-- -->

-   バッチ処理ツール CoRB2

用語集
------

MarkLogicは、データの設計や分析、利活用に大きく貢献し、新たな側面を切り開いてくれます！
ぜひ、皆さまも使ってみてください！

```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
法事が素数の理由

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">週末祖父の23回忌が有るんですが、なんで法事って素数年後にやるんですかね</p>&mdash; くまがい (@Yohei__K) <a href="https://twitter.com/Yohei__K/status/878117143719563265">2017年6月23日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">他の人のとかぶりづらくなるから？</p>&mdash; Haruka Ozaki (@yuifu) <a href="https://twitter.com/yuifu/status/878119997024817152">2017年6月23日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">横から失礼するけど、親族が集まる機会が法事くらいしかなかった時にはその機会を増やせた可能性はありそう。たまたま2者のn回忌とm回忌が一致したとしても、その次の法事は被らないという風にしやすいんじゃないか。</p>&mdash; 琴葉kiyo (@hrs1985) <a href="https://twitter.com/hrs1985/status/878123070690516993">2017年6月23日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

みんな同じ周期[1,3,7,13,17,23,27,33,50]を共有している以上どの周期でも変わらないんじゃないのって思ったので調べました
素数じゃ無い周期としては適当に足し引きして[1,3,6,14,16,24,26,34,50]を使用


```python3
import random
from collections import Counter

hoji = [1,3,7,13,17,23,27,33,50]
hoji_notSosu =[1,3,6,14,16,24,26,34,50]

#50年の間に100万人死ぬ、死んだ年度

hyaku_man_nin_sinu = [random.randint(1,50) for i in range(1000000)]

#法事の年度

nendo_hoji = []
nendo_hoji_notSosu = []

for shinda_toshi in hyaku_man_nin_sinu:
    hoji_no_toshi = []
    for kaiki in hoji:
        nendo_hoji.append(shinda_toshi + kaiki)
    for kaiki in hoji_notSosu:
        nendo_hoji_notSosu.append(shinda_toshi + kaiki)

counter1 = Counter(nendo_hoji)
counter2 = Counter(nendo_hoji_notSosu)
print("素数の場合")
for houji_no_nendo, hindo in counter1.most_common(5):
    print (houji_no_nendo, hindo)
print("素数じゃない場合")
for houji_no_nendo, hindo in counter2.most_common(5):
    print (houji_no_nendo, hindo)    
```
出力 (法事が行われる年度 : 回数)

素数の場合
51 179800
34 160753
35 160426
38 160385
40 160334
素数じゃない場合
51 180404
41 160986
46 160766
36 160649
37 160403

あんま変わらなくない？
AWS LambdaとAPIGatewayのミニマム構築


サーバレスでweb apiを構築できるLambdaとAPIGateway。
これをミニマムな構成で構築してみる

とはいえ認証もなにもない状態だとアレなのでAPI keyを発行した認証は実装する

## Lambda

aws consoleからLambdaに入り、Node.jsの6.10を選択、Blank Functionを選択

> 今回はNodeを選択しているけど、もちろんPythonでもいい

![Kobito.XZSrgA.png](https://qiita-image-store.s3.amazonaws.com/0/60056/7a15ab83-4884-2de2-135e-7a8d97f33274.png "Kobito.XZSrgA.png")

ひとまずトリガーはとりあえず作らないで次へ

![Kobito.FgA1X1.png](https://qiita-image-store.s3.amazonaws.com/0/60056/ea0b143f-3581-cabd-2fca-056fa5b8e01d.png "Kobito.FgA1X1.png")

Lambdaの名前を入力し、コードを入力する。
今回はコードはデフォルトのままで進める。

![Kobito.R1y4r2.png](https://qiita-image-store.s3.amazonaws.com/0/60056/18fd0a4e-b3ad-ae2a-11d6-888e267b3c8a.png "Kobito.R1y4r2.png")

スクロールするとさらに設定画面が出てくる
ロール割当だけすれば最小限OK

![Kobito.1G5h7o.png](https://qiita-image-store.s3.amazonaws.com/0/60056/ea51cc28-9e8d-0ef7-1347-f56c292f4a39.png "Kobito.1G5h7o.png")


これでLambda関数の作成はOK

## API Gateway

### APIを定義

aws consoleからAPI gatewayを開く

```新しいAPI``` を選択し、適当な名前を入力

![Kobito.46WF6B.png](https://qiita-image-store.s3.amazonaws.com/0/60056/b962b238-ec2a-9400-d33b-c18941b619c7.png "Kobito.46WF6B.png")

リソース -> アクション -> メソッドの作成を選択

![Kobito.hdwTH2.png](https://qiita-image-store.s3.amazonaws.com/0/60056/f4889177-a17c-9175-e60c-aa1ff74f09ba.png "Kobito.hdwTH2.png")


メソッドにPOSTを追加し、Lambda関数を追加する


![Kobito.qTpcmT.png](https://qiita-image-store.s3.amazonaws.com/0/60056/c004e3a2-022e-9fbb-09cd-a76aa011b05d.png "Kobito.qTpcmT.png")


なんかフローみたいのが出てくる。

メソッドリクエストを選択

![Kobito.HPvhHq.png](https://qiita-image-store.s3.amazonaws.com/0/60056/ef62a653-b624-076e-29b8-16dfd1ce737a.png "Kobito.HPvhHq.png")


APIキーの必要性にtrueを設定

![Kobito.ZD35fr.png](https://qiita-image-store.s3.amazonaws.com/0/60056/d91f7e62-ab68-8d93-8915-6aa55caf61b0.png "Kobito.ZD35fr.png")


アクション -> デプロイを選択

デプロイするステージを選択（なければ作る）してデプロイ実行

![Kobito.tepBZg.png](https://qiita-image-store.s3.amazonaws.com/0/60056/6fe5d767-02b1-b634-33f6-6d6a1a9e776e.png "Kobito.tepBZg.png")


#### APIキーの作成

APIキーを選択 -> アクション -> APIキーの作成

![Kobito.ilVIPU.png](https://qiita-image-store.s3.amazonaws.com/0/60056/ea922f95-d316-164b-eea7-edefe30582b0.png "Kobito.ilVIPU.png")


APIキーの名前、説明を入力。
対象のAPIとステージも一緒に選択。
ここでランダムな文字列のAPIキーが発行されるのでメモしておく（API実行時に必要になる）

![Kobito.Xsx7CS.png](https://qiita-image-store.s3.amazonaws.com/0/60056/983de60f-cb08-05a3-b645-cc676713c460.png "Kobito.Xsx7CS.png")


#### 使用プランの作成

使用プランを選択 -> 作成を選択

適当な値を入力して使用プランを作成

![Kobito.0kronG.png](https://qiita-image-store.s3.amazonaws.com/0/60056/8574738f-f69d-e0fd-b99d-7adce2caa389.png "Kobito.0kronG.png")

使用プランにAPIキーを割り当てる
作成したAPIキーをセットする

![Kobito.3S94mx.png](https://qiita-image-store.s3.amazonaws.com/0/60056/5a1460fa-bcd7-0d69-07a9-5062f337f16b.png "Kobito.3S94mx.png")


#### 実行テスト

postman等からAPIのURLを叩く

headerに ```x-api-key``` という名前でAPIkeyを設定すると認証が通り、実行される（はず）

![Kobito.IGiR2w.png](https://qiita-image-store.s3.amazonaws.com/0/60056/f438b261-ee06-db3c-88b0-3adf83678bc2.png "Kobito.IGiR2w.png")
VR Hello World !（紹介編）

# VRとは
仮想現実。AR（現実拡張）や、MR（複合現実）と区別される。

|VR|AR|MR|
|:---:|:---:|:---:|
|![vr_sweets_pokki_game.png](https://qiita-image-store.s3.amazonaws.com/0/2567/3ecfe892-feb5-a444-f35a-0ec84158764f.png)|![ar_kakuchou_genjitsu.png](https://qiita-image-store.s3.amazonaws.com/0/2567/989eacd2-a45b-da9e-6273-de72efdc05b3.png)|![medical_mr_ar_glass.png](https://qiita-image-store.s3.amazonaws.com/0/2567/3438d098-ee3b-3bf8-8551-bca3f4fdd504.png)|
|HMD|スマートグラス|HoloLens|
|現実とは切り離される|現実にデジタル情報を補完する|仮想と現実の融合|


-----

# VRコンテンツ
- 恐怖系
    - コースター
        - [https://www.youtube.com/watch?v=bDoEYULinMU](https://www.youtube.com/watch?v=bDoEYULinMU)
    - ジョーズ
        - [https://www.youtube.com/watch?v=kz_w6so62kU](https://www.youtube.com/watch?v=kz_w6so62kU)
    - ゾンビ
        - [https://www.youtube.com/watch?v=F9D0HoK8E9Y](https://www.youtube.com/watch?v=F9D0HoK8E9Y)           
    - アート系
        - Google Spotlight Stories
        - ハコスコ

-----
# VR競合

|PS VR|
|---|
|![0aa6fe7b-4f0d-20ff-c640-c6914fb0efb2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2567/12f73a40-758d-327b-102a-9fbca5439e33.jpeg)|

|htc VIVE|
|---|
|![7bc772ca-217d-6543-c19a-39fd7768d281.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2567/2079eed5-1aa0-8a6c-e3b9-a209b7aa5b6f.jpeg)|

|Oculus Rift|
|---|
|![f132c24a-8580-927f-b38a-bd5a358f18b2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2567/6ddd8dd1-aab1-dcb3-3837-aa1ca02349f2.jpeg)|

|ハコスコ|
|---|
|![49108dfd-b557-2177-79cd-46640cb08ffd.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2567/5d70e613-bb88-2e48-adfb-8e3650d4a54a.jpeg)|

|ソードアート・オンライン|
|---|
|![64b5046f-9e0d-0ced-ba86-0397ca32bd37.jpeg](https://qiita-image-store.s3.amazonaws.com/0/2567/d2df3a33-188c-2fe9-7abf-5d36553f254a.jpeg)|



# ゴーグルの形態
- ヘッドマウント
    - T字バンド
    - バンド
- ゴーグル
    - 手持ち
    - メガネ型
- [結局どれ買えばいいのさ](http://www.sejuku.net/blog/11859)
    - →用途に応じて（ゲーム、映画、開発）



-----

# VRを開発するならどれ？
- ガチプログラマー
    - ゲーム
    - アプリ
        - [Unity](http://unitylist.com/r/asl/unity-vr-hello-world)
- 趣味プログラマー
    - [Webコンテンツ](http://blog.mmmcorp.co.jp/blog/2017/03/24/ReactVR/)
        - OpenGL
        - WebGL
- [冒険家](http://k-tai.watch.impress.co.jp/docs/news/1055833.html)・[探検家](http://www.moguravr.com/ng-vr-studio/)・[パイロット](https://www.inside-games.jp/article/2017/05/17/107210.html)・[アスリート](http://www.nhk.or.jp/sg-project/seed2/pa-2016/vr/)
    - 動画コンテンツ

----

# VRと健康
![](https://qiita-image-store.s3.amazonaws.com/0/2567/5d89130e-1cff-f5d4-11cc-b1c69338b21e.png)

- 13歳以下は注意。
- 4歳が使用して斜視になった例も。
- ニンテンドー3DSも6歳以下は禁止。
- PS VRでも健康上の注意喚起。

-----

# 本日はここまで

次回、実際にコード書いていきたい。

→本線に戻る。
CoreOS dockerコンテナ内のphpを定期実行

# CoreOS dockerコンテナ内のphpを定期実行

CoreOSにてコンテナ内のPHPをcronのように実行させたい時の手順メモ。

## 概要
CoreOSではsystemdのtimerユニットで実行します。
大まかな流れの手順は下記の記事を参考にさせていただきました。
[systemdでの定期実行(timerユニット)](http://qiita.com/sharow/items/e8f7d3e0628d7ee925db)

## ユニットの記述
各ユニットは以下のように記述しました。

* 実行用ユニット

```/etc/systemd/system/test.service
[Unit]
Description=test process

[Service]
Type=simple
TimeoutStartSec=0
ExecStart=/usr/bin/docker exec test_container php /var/www/html/test.php

[Install]
WantedBy=default.target
```

[Docker systemd からの起動](https://hondou.homedns.org/pukiwiki/pukiwiki.php?Docker%20systemd%20%A4%AB%A4%E9%A4%CE%B5%AF%C6%B0)に少しヒントがありまして、
> Type=simple は、デーモンとして実行するのではなく、終了待ちで生存監視をする。
そのため ExecStart? では "-d" (バックグラウンド起動) でコンテナを起動しない。
TimeoutStartSec?=0 として、起動までの待ち時間を無制限にしている (デフォルトは 90秒)。

とあるので、バックグラウンド起動せず、待ち時間無制限で指定します。


* タイマー設定用ユニット

```/etc/systemd/system/test.timer
[Unit]
Description=test process Timer

[Timer]
OnCalendar=*-*-* 02:00:00
Unit=test.service

[Install]
WantedBy=timers.target
```
こちらはいたって通常通りの指定方法でOKです。
（上記の例では毎日2:00に実行しています）

## 起動設定

systemctlに変更を通知　→　タイマー有効化　→　タイマー起動　

```
sudo systemctl daemon-reload
sudo systemctl enable test.timer
sudo systemctl start test.timer
```

## 参考リンク
* [systemdでの定期実行(timerユニット)](http://qiita.com/sharow/items/e8f7d3e0628d7ee925db)
* [Docker systemd からの起動](https://hondou.homedns.org/pukiwiki/pukiwiki.php?Docker%20systemd%20%A4%AB%A4%E9%A4%CE%B5%AF%C6%B0)
Twitter botを使ったエコシステム構想

# 当記事について
この記事は、勉強会（[東中野もくもく会 #1](http://ptix.co/2sslZpp)）用の資料です。

# きっかけ
- この記事をみてピーンと来た
    - [私のはてなブックマーク活用法　ーまだカテゴリで消耗してるの？ー](http://hatebu.me/entry/2017/06/11/085241)

## 記事から読み取ったこと

- この記事の要約
    - はてブトップ・カテゴリページ・関心ワードはあまり使えない
        - はてブ側のシステムで集約されたカテゴリ、関心ワードはあまり個人にリーチしない。
        - 統計的だったり、マスを把握するには良いが、個人としてはあまりピンボケした話題ばかりだとは思う。
    - Twitterの旬な話題をチェックする
        - リアルタイム性を重視するなら抜群なTwitter
            - 理由はユーザ数が圧倒的に多いから
            - 個人視点では好き勝手ツイートしている
            - たばねたときに浮かび上がってくるリアルタイムの志向性
    - Togetterの旬なまとめをチェックする
        - Twitterをまとめる人が投稿する
        - いわゆるキュレーショナリィ
        - さらにコメントを呼び込むため大衆迎合性を高めている
        - まとめ人のモチベーションが加わっているためホットになりやすい
    - Qiitaで話題になっている技術記事をチェックする
        - 技術情報に特化している
    - Amazonで話題になっている商品をチェックする
        - 購買意欲が加わっているので投稿ドリブンではなく購入ドリブン
    - ホットな話題をチェックする
        - はてブの新着をつかってほっとになる前に青田買いできる

## この記事をきっかけにエコシステムを思いついた
- Twitter botに上記のチェック機構を加えてリアルタイム性ホットワード抽出できるのでは？
- さらにだれでも自分のTwitterを登録して、勝手に世の中のホットワード抽出機能を組み込めるサービスを提供できるのでは？

## やりかた
- まず、Twitter bot側の仕組み作り
    - https://github.com/fk2000/tw_bot
        - ↑ここからソースコードを取得
        - 40～46行目あたりの$keysにキーワードをほうりこむ
        - ほうりこむキーワードはRSSフィードから取得しておく
        - TwitterのAPIキー、シークレットは事前に準備して環境変数に書いておく。
        - php bot.phpをたたいたり、cronで自動実行したりする。（1時間に1回を超えない程度にしておく。）

### エコシステム側
- Twitterアカウント、キーの登録、RSSフィードの登録ができる仕組みを作る。
- 複数登録できるようにして、ダッシュボードなどできちんと取得できるか確認できるようにしておく。
- どのアカウントが利用頻度高いかなど監視できるようにしておく。

以上
2017-06-23 Color > Brightness | Saturation | Contrast | Hue

Brightness | Saturation | Contrast | Hueという設定がある。
3つまでは見たことはあるが、実際の扱いは未経験。
Hueについては意味すら分からない状態。

UnityのShaderで使っている例
https://forum.unity3d.com/threads/hue-saturation-brightness-contrast-shader.260649/

HSB空間での色の表し方に使うようだ。
https://en.wikipedia.org/wiki/HSL_and_HSV

Hueは角度で定義されている模様。Unityのコードでradianを使っているのはそのためだろう。
http://www.rapidtables.com/convert/color/rgb-to-hsv.htm
IEEE802.11sについて


随時追加していく

- IEEE802.11s（以下 802.11s）はWiFi機器でメッシュネットワークを構築するためのプロトコル
- Layer2の技術
  - 802.11sのネットワークはOSからは単なる1セグメントに見える
  - OLSRのようにネットワークスタックに手を加える必要がない
  - つまりカーネルのリビルドは必要ない
- 最大32個程度のノード数を想定している

# 対応状況

- OpenWRT
  - 使えるかどうかはハードウェアによる
- RouterBOARD
- GoogleWiFi
  - 他の802.11s機器と混在して使えるかどうかは不明

# 資料

- http://techtarget.itmedia.co.jp/tt/news/0809/24/news01.html
- https://en.wikipedia.org/wiki/IEEE_802.11s
- https://wiki.openwrt.org/doc/howto/mesh.80211s
- http://d.hatena.ne.jp/toshi_hirasawa/20120629/1340975845
- https://www.nttdocomo.co.jp/binary/pdf/corporate/technology/rd/technical_journal/bn/vol14_2/vol14_2_014jp.pdf
- https://www.slideshare.net/yousuke_saki/rb-mesh
- https://hottuna.server-on.net/computing/?p=239
windowsでTensorFlow その24

#概要
windowsでTensorFlowやってみた。
生tensorflowは、つらいので、1.2にして、Highlevel apiやってみた。
偶数分類やってみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow1.2

#サンプルコード

```
import numpy as np
from sklearn import cross_validation
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Dense, Activation

def binary_encode(i):
	return np.array([i >> d & 1 for d in range(8)])

def even_odd_encode(i):
	if i % 2 == 0:
		return np.array([1, 0])
	else:
		return np.array([0, 1])

trX = np.array([binary_encode(i) for i in range(1, 256)])
trY = np.array([even_odd_encode(i) for i in range(1, 256)])
x_train, x_test, y_train, y_test = cross_validation.train_test_split(trX, trY, test_size = 0.2, random_state = 42)

model = Sequential()
model.add(Dense(10, input_dim = 8))
model.add(Activation('relu'))
model.add(Dense(2, input_dim = 10))
model.add(Activation('softmax'))
model.compile(optimizer = 'SGD', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.fit(x_train, y_train, epochs = 25, batch_size = 4)
score = model.evaluate(x_test, y_test, verbose = 0)
print ('\nTest score : {:>.4f}'.format(score[0]))
print ('Test accuracy: {:>.4f}'.format(score[1]))

```