OmniAICreator/Qiita-1.07M huggingface dataset:
Important Things to Know about iPhone X

![Iphone X price in UAE2.jpg](https://qiita-image-store.s3.amazonaws.com/0/232106/806b5497-0e16-a41e-e26d-fb2efd0ba479.jpeg)

Using phone in our daily life is very important, and there is nothing to replace it with. The usage of phone has literally helped a lot of us in order to cut down the long distances and stay connected to each other in a better way. Is there something else we want? Yes, there are many things still that are not yet introduced in the mobile phones, and the companies are trying hard to introduce new things every day. Here I am going to talk about iPhone Xas now it is the real hot topic.
#Thick Design

No doubt that this is bigger in size as comparison to normal trendy phones these days, surely there is a big reason behind that also. As you know Apple will not do anything without a purpose. The camera on its body is tucked in, which gives it a new look as compared to the other phones on market these days. Holding this phone feels like you are holding a normal smart phone, when in reality that is not the case.
#Camera

This is the real showstopper of iPhone X. Camera is at its best, and once you start using it I am sure that you will not want to switch it again. The camera it has is really in competition with the other famous smart phones of today, which is actually a very good thing for the start of this phone line. People who are using iPhone Xhas said that this camera is already better than the old cameras they have used from other brands.
![Iphone X price in UAE31.jpg](https://qiita-image-store.s3.amazonaws.com/0/232106/430fd8af-0df2-d8c1-0e79-465287a390e6.jpeg)


#Storage

No doubt this is the best plus point, as you are able to get huge storage options, in this choice, you are actually left with the 256GB of storage, and it depends on you how you are willing to use that. Sonow there is no way you will ever run of the memoryif you are in love with taking photos and recording sounds. You have so much extra room with iPhone X.

#Battery on Fire?

You are able to charge its battery in very less time, the best part is that you are able to use this battery life for a very long time, so there is no need to take your charger everywhere you go in order to maintain the battery life of your phone.

With all these features, I would say that you must give [Apple iPhone X Dubai](http://uae.mikensmith.com/ae_en/apple-iphone-x-dubai-price-uae)a chance, get it and see what it offers you for better judgment.

![Iphone X price in UAE32.jpg](https://qiita-image-store.s3.amazonaws.com/0/232106/546e2356-30ff-5f53-8a07-96f66a3f395e.jpeg)
[Ruby]インスタンス変数名とその値をハッシュで取得する


`instance_variables_and_values`は引数で与えられたインスタンスについて、定義されたインスタンス変数名とその値をハッシュで取得するメソッドです。

```ruby
class User
  def initialize(name, age)
    @name = name
    @age = age
  end
end

def instance_variables_and_values(instance)
  instance
    .instance_variables
    .map{ |sym| [sym, instance.instance_variable_get(sym)] }
    .to_h
end

taro = User.new('Taro', 20)
puts instance_variables_and_values(taro)
#=> {:@name=>"Taro", :@age=>20}
```

## 使ったメソッド
### [`instance_variables`](https://docs.ruby-lang.org/ja/latest/method/Object/i/instance_variables.html)
レシーバが持つ定義されたインスタンス変数名をシンボルの配列で返す

```ruby
class User
  def initialize(name, age)
    @name = name
    @age = age
  end
end

taro = User.new('Taro', 20)
taro.instance_variables #=> [:@name, :@age]
```

### [`instance_variable_get`](https://docs.ruby-lang.org/ja/latest/method/Object/i/instance_variable_get.html) 
レシーバが持つインスタンス変数の値を返す。引数にはインスタンス変数名をシンボルで与える

```ruby 
class User
  def initialize(name, age)
    @name = name
    @age = age
  end
end

taro = User.new('Taro', 20)
taro.instance_variable_get(:@name) #=> "Taro"
taro.instance_variable_get(:@age) #=> 20
```
libgit2を用いたgitリポジトリ初期化コマンドの作成

　[前回の記事でGitListの導入](https://qiita.com/0xffffff/items/b7f41fea22e44aef05ea)について書きました。GitListは非常に気に入っているのですが、一つだけ解決したいのがリポジトリの作成がWebからできない点です。
　なんとか自分で解決できないかと考えたとき、問題となるのが、Webサーバのユーザとgitリポジトリの所有ユーザが異なる点です。つまり、そのままでは、Webサーバのユーザがgitリポジトリに書き込むことができません。Webサーバのユーザをgitユーザにしてしまう方法や、ファイルのパーミッションを変更して無理やり書き換えられるようにする方法などが考えられますが、どれもあまりスマートではありません。
 　setuidを使えばWebからgitユーザでコマンドを実行することができますが、この場合、シェルスクリプトにsetuidを付加できないので、実行ファイルを作る必要があります。少し調べてみると、[libgit2](https://libgit2.github.com/)なるライブラリがあり、簡単にリポジトリの初期化等が行えるようです。なので、ちょっとしたコマンドをC++で作成しsetuidによりgitユーザで実行できるようにして、解決することにしました。
# ソースコード
　コードを作成するに祭して、libgit2が提供している以下のドキュメントが参考になります。
https://libgit2.github.com/docs/guides/101-samples/#repositories_init_options
https://libgit2.github.com/docs/examples/init/
　これを見てわかるように、libgit2のリポジトリ初期化処理では、ディレクトリの作成とdescriptionファイルの変更まで指示することができます。なので、コードとしては以下のように非常にシンプルなものになりました。

```c++:git_init.cpp
#include <iostream>
#include <git2/global.h>
#include <git2/tree.h>
#include <git2/repository.h>
int main(int argc, char *argv[])
{
  if (argc != 3) {
    std::cout << "usage: " << argv[0] << " <path> <description>\n";
    return -1;
  }
  
  git_libgit2_init();
  
  git_repository *repo = nullptr;
  git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
  opts.flags |= GIT_REPOSITORY_INIT_MKPATH;
  opts.flags |= GIT_REPOSITORY_INIT_BARE;
  opts.mode = GIT_REPOSITORY_INIT_SHARED_GROUP;
  opts.description = argv[2];
  int error = git_repository_init_ext(&repo, argv[1], &opts);

  git_libgit2_shutdown();
  
  return error;
}
```

上のコードで、以下の処理をまとめて行っていることになります。
`$ mkdir <path>`
`$ git -C <path> --bare init --share`
`$ echo <description> > <path>/description`

# ビルド
まず、libgit2の開発パッケージをインストールします。
`$ sudo apt install libgit2-dev`
ビルドします。
`$ g++ -std=c++17 -o git_init git_init.cpp -lgit2`
オーナーをgitに変更し、setuidを付加します。
`$ sudo chown git.git git_init`
`$ sudo chmod ug+s git_init`

# 実行
第一引数にリポジトリのパス、第二引数に説明を指定してgit_initを実行すれば、リポジトリが初期化されます。例えば、test1.gitを初期化するには以下のようにします。
`$ git_init /home/git/gitrepos/test1.git "this is test1 repository"`
後は、これをPHPから実行すれば、gitリポジトリがWebから作成できるようになります。
ActiveModel::Attributes が最高すぎるんだよな。

`Ruby on Rails 5.2.0.beta2`が出て久しい。

僕はRails大好きっ子なので

社内の新規事業や、社外のお手伝いしているベンチャー企業では
もちろん、Rails5.2を使って開発をしている。


すでに、新しいRailsに関する記事はいくつか挙がっているが
**個人的に、一番インパクトが大きかったのは`ActiveModel::Attributes`が導入されたことである。**

## :yellow_heart: 待望の`ActiveModel::Attributes` :yellow_heart: 

`ActiveModel::Attributes`でなにが変わったの？というと、
いままでActiveRecordでしか使えなかった一部の機能が、ActiveModelでも使えるようになっただけである。

いや、しかし！

**今までのActiveModelの最大の弱点は
まさにこの `ActiveModel::Attributes` が無かったことだと思う。**

それが、Rails5.2で使えるようになったのだ。
こんな嬉しいことはない。

## みんな大好き `.attribute`

Rails5.1系でも使えた`.attribute`を改めてみてみよう

ActiveRecordには、Attribute APIというインターフェース(?)があり、
型情報の変換は、あまり考えることなく透過的に扱うことができる。

```ruby
class User < ApplicationRecord; end

id = '1' # 文字列
user = User.new(id: '1')
user.id  #=> 1 数値に変換されている
```

そして、この型変換は定義を上書きすることもできる

```ruby
class User < ApplicationRecord
  attribute :time_zone, :string, default: -> { Time.zone.name }
  attribute :confirmed, :boolean, default: false
end

user = User.new
user.time_zone == Time.zone.name #=> true
user.confirmed == false          #=> true
```

独自の型変換もOKなので、 `Money` などのクラスを定義して型変換を行わせることもできる。
カラムがなくてもOKなので、`attr_accesor`の代わりに使える。

すこぶる便利である。
しかし、ActiveRecordでしか使えないのである。

## さて、ActiveModelの話ですよ。

[7 Patterns to Refactor Fat ActiveRecord Models](https://codeclimate.com/blog/7-ways-to-decompose-fat-activerecord-models/) を通じてか
多くのプロジェクトで`FormObject`や`ServiceObject(っぽいもの)`を見る機会が増えた。

みんな`FormObject`をActiveModelで定義するのだが
その型変換には定まった方法が無かった。

```ruby
class RegistrationForm
  include ActiveModel::Model

  attr_accessor :accepted
end

RegistrationForm.new(xxx_params).accepted #=> 型はなに？？
```

そして、その解決策は人によって様々で
これといった最善策は無かった。

```ruby
class RegistrationForm
  include ActiveModel::Model

  attr_reader :accepted

  # まともな変換
  def accepted=(value)
    @accepted = ActiveModel::Type.lookup(:boolean).cast(value)
  end

  # なんてこった...
  def accepted=(value)
    @accepted = value == '1'
  end
end
```

そもそも、記述量も多いしイケテナイ感がありました。

## ほら、ここで`ActiveModel::Attributes`ですよ。

ようやく、秩序が保たれる時代になりました。
`.attribute`がActiveModelでも使えるようになったのです。

```ruby
class RegistrationForm
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :accepted, :boolean, default: false
end
```

もうね、大興奮です。

めっちゃシンプル。
誰でも同じ書き方になる。
AttributeMethodsも使える...。

ありがてぇ。ありがてぇよ。

## Rails5.1だとまだ使えない

使えないんです、そうなんです。
社内の人と話していて、他のプロジェクトでも`.attribute`使いたいーって話があったので

それっぽいものを使えるようにしました。

~~# 来週ぐらいにはruby gemsに出そうかな~~ 同じ名前ですでにgemが存在したため、gem pushできず...！みんな同じようなこと考えるのね。。
https://github.com/alpaca-tc/active_model_attributes

```ruby
gem 'active_model_attributes', github: 'alpaca-tc/active_model_attributes'
```

```ruby
class YourModel
  include ActiveModel::Model
  include ActiveModelAttributes # Rails5.2になったら、ActiveModel::Attributesに置き換えるだけ。

  attribute :accepted, :boolean, default: false
end
```

これで、日々の開発が少し幸せになりそうです。

毎年、とても興奮するアップデートをいれてくださるRailsコミュニティには
本当に感謝しています。
配置Nim的默认编译参数 release build并运行

配置Nim的默认编译参数 release build并运行

默认情况下nim编译是debug build，如果需要release build, 需要加上-d:release ，
release编译的命令如下：
`nim c -d:release xx.nim`

release build并运行：
`nim c -r -d:release xx.nim`

debug build出来可执行文件体积稍大，并且目前对来我说没有用。

我发现通过配置nim.cfg,可以给nim编译器配置默认的编译参数，nim.cfg文件位于nim的安装目录/config下。

类似如下在nim.cfg中添加参数r和d:release，一行一个参数：

```txt:nim.cfg
# Configuration file for the Nim Compiler.
# (c) 2017 Andreas Rumpf

# Feel free to edit the default values as you need.

# You may set environment variables with
# @putenv "key" "val"
# Environment variables can be accessed like so:
#  gcc.path %= "$CC_PATH"

cc = gcc
r
d:release
...
...
...
```

之后当你执行`nim c xx.nim`的时候，配置文件中参数自动传送给Nim编译器：
等于 `nim c -r -d:release xx.nim`

2018-01-18 18:30:00 codegay
小数誤差ついて調べる。

#動機
前回の投稿で小数誤差について無知で理由やら対処法やら何やらしりたくなって調べます。
https://docs.python.jp/3/tutorial/floatingpoint.html
python3の公式チュートリアルを参考にしました。

#小数誤差の原因
原因は至って簡単でした。
プログラムは二進数で動いているので小数の計算は無限に続いていて、結局近似値の計算になるっていうことでした。
`float`を使った場合は
>どこか有限の桁で止めると、近似値を得ることになります。近年の殆どのコンピュータでは float 型は、分子に最も重大なビットから始めて最初の 53 ビットを使い、分母に 2 の累乗を使った、二進小数を使って近似されます。1/10 の場合は、二進小数は 3602879701896397 / 2 ** 55 となります。これは、1/10 に近いですが、厳密に同じ値ではありません。

と書いてあるとおり、結局は近似値なのです。
だから、前回の例を取ると`x*1.08`と`x*108/100`は結果が異なって当然だったというわけでした。

#小数誤差の対処法
先述の通り小数を使わずに割り算で記述すればいいだけです。


また、一応ちゃんとプログラムを書いて53ビットか確かめてみました。

```py3

print(2**53)
x = float(input())
z = x/39
print(z*39)
"""
9007199254740992 
1.999999999999999  ひと桁少なくinput
1.999999999999999  結果

9007199254740992 
1.999999999999999  同じ桁数でinput
2.0                結果 
"""
```

というわけで、だいたい小数誤差についてはわかりました。

#おわりに
至らぬことが多く、ここにも間違った情報が書いてあるかもしれません。
間違った情報があればご指摘いただけると嬉しいです。
よりよいプログラムを書くためにがんばります！
GitListの設定

 [前の記事でgitリポジトリの管理としてGitea](https://qiita.com/0xffffff/items/ae38a464a342c985b2e4)を試してみました。残念ながら既存のリポジトリを移行する簡単な方法がないということで採用を諦めました。なので、次の候補を探していたところ[GitList](http://gitlist.org/)というツールを見つけました。
　Giteaと異なり、リポジトリの作成などはできず、単にリポジトリを閲覧することしかできません。その代わり、既存のリポジトリであっても、特に何もせずに一覧表示、コミットログの表示、ファイルの閲覧をすることが可能です。
 以下で、Ubuntu Server 16.04に、Apache2 + PHP 7でインストールする手順を説明します。

# インストール手順

## 必要なパッケージのインストール
GitListはPHPのSilexフレームワーク上で動作しますが、こちらはGitListに同梱されています。データベースは不要です。なので、Apache2 + PHP7のみをインストールします。
`$ sudo apt install apache2 php7.0 php7.0-gd php7.0-mbstring php7.0-xml libapache2-mod-php7.0`

## gitlistのダウンロードと展開
最新版のバージョン0.6をダウンロードし、/var/www/htmlに展開します。
`$ wget https://github.com/klaussilveira/gitlist/releases/download/0.6.0/gitlist-0.6.0.tar.gz`
`$ sudo tar -C /var/www/html -xzf gitlist-0.6.0.tar.gz`

## mod_rewriteとphpの有効化
Silexフレームワークはmod_rewriteを必要としますので、mod_rewriteを有効化します。
`$ sudo a2enmod rewrite`
`$ sudo a2enmod php7.0`
`$ sudo service apache2 restart`

## .htaccessによる設定の上書きを許可
000-default.confに"AllowOverride All"を追加します。
`$ sudo vim /etc/apache2/sites-available/000-default.conf`

```text:000-default.conf
<VirtualHost *:80>
  …
  DocumentRoot /var/www/html
  <Directory /var/www/html>
    AllowOverride All
  </Directory>
  …
</VirtualHost>
```

## .htacesssの変更
GitListをサブディレクトリgitlistに入れているので、.htaccessのRewriteBaseに/gitlistを指定します。
`$ sudo vim /var/www/html/gitlist/.htaccess`

```text:.htaccess
<IfModule mod_rewrite.c>
  …
  RewriteBase /gitlist
```

## キャッシュディレクトリを作成
`$ cd /var/www/html/gitlist`
`$ sudo mkdir cache`
`$ sudo chmod 777 cache`

## config.iniを設定
以下で、GitListのconfig.iniを設定します。ここでは以下のような設定にしていますので、ご自身の環境に合わせて随時変更してください。
サーバ名: gitserver
リポジトリパス: /home/git/gitrepos

`$ cd /var/www/html/gitlist`
`$ sudo mv config.ini-example config.ini`
`$ sudo vim config.ini`

```text:config.ini
[git]
client = '/usr/bin/git' ; Your git executable path
default_branch = 'master' ; Default branch when HEAD is detached
repositories[] = '/home/git/gitrepos/' ; Path to your repositories
[app]
theme=”default”
[clone_button]
; ssh remote
show_ssh_remote = true
ssh_host = 'gitserver'
ssh_url_subdir = 'gitrepos/'
ssh_user = 'git'
ssh_user_dynamic = false
```
## 動作確認
以下のURLにアクセスすれば、リポジトリの一覧が表示されるはずです。
http://gitserver/gitlist
リポジトリ名とその説明が表示されますが、説明はリポジトリ以下のdescriptionファイルに書かれている内容が表示されます。例えば、test.gitというリポジトリであればtest.git/descriptionに説明を記述します。
ファイル構造がわかりにくいかもしれませんが、以下のような構造になります。

```
/home
  git
    gitrepos
      test1.git
        description
      test2.git
        description
```
[初心者]Laravel始めたての人は寄って行って 

# はじめに
初心者学生エンジニアです。
私は現在業務でlaravelを使っているのですが、つまづいた箇所・紛らわしいなーという箇所を解説できたら初学者に役立つかなーと思い書こうと思いました。

- 自己紹介
 - 情報,数学系学科の学生
 - 現在はPHP,Goなどを使って開発を行なっている
 - サーバーサイドとフロントサイド一通でやったりやらなかったり
- 1年程前の私
 - サーバーって何？webって？MySQLってプログラミング言語？開発って何？みたいな状態
 - エンジニアになりたいと思い全く未経験でインターンとして開発に携わる

# 開発環境
**laradock**っていう便利なのを使いました。

- OS X 10.13
- PHP 7.1.7
- Laravel 5.5.3
- docker 17.09.0-ce
- docker-compose 1.16.1
- nginx + PHP-FPM + MySQL

**docker**っていうのは、自分のPCの内部に独立した実行環境（仮想環境）を作れるソフトウェアです。
自分のPCに擬似サーバーを作れるみたいな感じです。

**docker-compose**っていうのは、いくつかの実行環境をそれぞれdockerでコマンド打って立ち上げるのがめんどくさいので、それらを一括で立ち上げてくれるライブラリです。
大半の開発では複数サービスが必要(例えばnginx + PHP-FPM + MySQL)ですからね。



こういったインフラ系のことは最初から全部理解しようとするのは心が折れるので、まず使ってみて必要な分ずつ徐々に勉強していくといいと思います。

で、この**docker-compose**は手順書のようなものが必要なのですが、それが**laradock**っていうお助けキャラで、dockerとかあまりわかっていなくても割となんとかなります。
laradockについては説明は省くので、他のサイトを参考にしてください！
自分はこのqiitaの記事を参考にさせていただきました！https://qiita.com/yudaifuijta0121/items/846d5e8e86ec5b2d908e

あとはcomposerのインストールとかですかね。

# ディレクトリ構成
よく触るファイル

```
├── app
│   ├── Console
│   ├── Exceptions
│   ├── Http
│   ├── Models
│   ├── Notifications
│   ├── Observers
│   ├── Providers
│   ├── Services
│   └── helpers.php
├── database
│   ├── factories
│   ├── migrations
│   └── seeds
├── public
│   ├── css
│   ├── js
├── resources
│   ├── assets
│   ├── lang
│   └── views
├── routes
│   ├── admin.php
│   ├── user.php
│   └── web.php
├── storage
│   ├── debugbar
│   ├── framework
│   └── logs
├── bootstrap
├── config
├── tests
└── vendor
```

これが大体自分がメインだと思うディレクトリ・ファイルですね。
簡単に説明すると、

- app
 - `app` ってざっくりなディレクトリ名なのでわかりずらいですが、ビジネスロジックをがしがし書いてくところです。MVCのMCはapp以下にあります。
- bootstrap
- config
 - 諸々の設定ファイルがあるところです。データベースの接続情報とか色々設定してます。
- database
 - factories : テストの際にデータを保存できるかとかを確認しないといけないので、そのためのダミーデータを作ったりしするとこだと思います。テストまだ書いてないからよくわからない
 - migrations : テーブル定義をするファイル。ここにマイグレーションファイルっていう各テーブルにどんなカラムがあるかとかを書いたファイルをおいて、コマンド打つとDBにテーブルを作ってくれます。
 - seeds : テーブルにデータを入れるためのやつ。自分のプロジェクトでは値はロジックを書く場合と、csvを使って一括挿入する場合があります。
- public
 - コンパイルされたcssファイルとjsファイルとかが置かれてます
- resources
 - asstes : コンパイルされる前のjsファイルやsassファイルなどがおいてあります。
 - lang : 言語別のバリデーションのメッセージとか書くところですね。
 - view : MVCのVに当たるビューファイルがおいてあります。
- routes
 - 名前のままですが、ルーティングの設定をするところですね。
- storage
 - `debugbar`,`logs`はデバッグバーのキャッシュ的なものとエラーログとかがたまり続けるみたいです。定期的に消しましょう。
- tests
 - テストコードがあるファイルですね
- vendor
 - laravelが用意してくれてるフレームワークのコアなのでいじらないようにしましょう。composerがバージョン管理とかはしてくれるので、git管理もしません。



# とりあえずこんな感じ。
あえてニュアンスでとどめている箇所がいっぱいあるので、話半分くらいに読んでもらい、イメージを掴んでいただければいいかなと思います。

>続きはまた更新します。

と前回書いたのですが、久々に読むと書き直したいなーってとこがありつつ、更新するのめんどくさいのでわからないところはコメントしていただければ回答なり新しい記事なり作りたいと思います。(そろそろ1年弱くらい経つのでやっとこさ初学者の域は脱してきました。)


最後まで読んでいただきありがとうございました。
invalid bitcode signatureの対処法

こちらはXCodeでのエラー対処の記事になります。
XCode Version 9.2 (9C40b)

# 現象
- プロジェクト設定ではbitcodeをオフにしているにも関わらずタイトルのエラーが表示された。
- cocoapodsのライブラリも全てbitcodeをオフにしている状態。

# まず結論から
XCodeを再起動してDerived Dataを削除しビルドすれば解決します。

# Derived Dataの消し方
上のメニューバーから
optionキーを押しながら「Product」をクリックしサブメニューを表示
「Clean Build Folder」をクリック

なおCocoapodsのlibPods.aなんかも削除されてしまうようなので、再ビルドしてやる必要があります。

# 参考
https://stackoverflow.com/questions/43346793/invalid-bitcode-signature-on-xcode
https://ez-net.jp/article/C9/qUKZiJ9B/vI-nxInyf79k/
Docker導入するべき？するべきではない？

## これは何？
Dockerを導入するにあたって、漠然としたイメージしかないという方も多そうなので、

- どういうシステムに導入したらいいのか？
- どういうシステムなら導入しないほうがいいのか？
- 導入までにどんなことしないといけないのか？


をまとめてみました。
つっこみあればお願いします！

---
## 対象
下記のような方を対象として記載しています。

- Docker自体はなんとなく分かったけど、自分の組織でやった方がいいのかよく分からない
- 導入の検討しろって言われてるけど、具体的な内容まで落とせない


---

## 一般的なコンテナ(Docker)の特徴/メリット
---
- パフォーマンス
  - 仮想マシンと比較すると、オーバーヘッドが少なく軽量
  - 起動が高速
  
- 再現性、ポータビリティ
  - Dockerが動く環境であれば環境に依存しない
  - 1つのコマンドを実行した状態を再現
  - ホストと分離できる
  
- コードで管理できるのでバージョン管理が可能
  - ロールバックが容易

--- 

## メリットを活かすために必要なこと

---
- アプリケーションのマイクロサービス化
    - 1サービス1コンテナ
    - 永続データの考慮
        - ステート情報
        - 共有データ
        - ログ

- イミュータブルな環境の構築
  - CI/CDシステムの導入
     - バージョン管理システムとの連携
     - テストの自動化
     - デプロイ/ロールバック

- オーケストレーションツールの導入
  - クラスタの管理
  - スケジューリング
  - スケーリング

---

## 他のAWSソリューションとの違い

---
### CodeDeploy
- OSの状態は再現できない
- コードのみのロールバックなので、OSの変更には対応できない
    - コンテナはイメージごとロールバック

---
### AMI運用
- イメージの容量が大きい
  - 起動に時間がかかる
- 変更作業の負担が大きい
    - インスタンス起動 → 変更 → イメージの保存 → インスタンスの削除
    - Dockerはコードの修正 → 再ビルド
      - CI/CDシステムがあればさらに容易

---
## コンテナに対する誤解 (クラウドで使う場合)

---
- オーバーヘッドが少ないのでパフォーマンスがいい
  - 仮想サーバとの比較であって、クラウド上で使う場合は コンテナ on 仮想サーバ になるのでオーバーヘッドは増える

- どこでも同じ環境を再現できる
  - コンテナは環境に依存しないが、クラウドで利用する場合、LB等のクラウドサービスと組み合わせることが多いので、その違いの考慮は必要
  - [例外](https://qiita.com/horikeso/items/5f89cce339e1fc198007)もある

- 同一ホストにコンテナを相乗りさせることによに費用削減が可能
  - 1ホストを割り当てる必要がないレベルのコンテナがばかりであれば正しいが、ある程度のリソースが必要なコンテナであればトータルのリソース利用量はあまり変わらない


---
## 導入の問題点/課題
---
- 構成が複雑になる
  - ルーティングの複雑さ
  - ブラックボックス化
  - 障害時の調査/切り分けが難しい
  - 参考：[マイクロにしすぎた結果がこれだよ！](https://www.slideshare.net/mosa_siru/ss-64839846)
- リソース管理/分離が難しい
- 学習コスト
- 組織の体制、線引
  - Dev と Ops

---
## コンテナに向く/向かないシステム
---
### 向くシステム
- システムの変更が活発に行われる
- アップデート等の変更に対応していく必要がある
- バッチ処理のために起動するシステム

---
### 向かないシステム
- システムの変更がほとんどない
- 長期の安定性が求められる
- ライセンス管理、保守サポートが必要


---
## 導入のモチベーション
---
### 解決したい課題は何か？
---

### 共通インフラをつくりたい → X

- すべてのアプリケーションがコンテナに向いているわけではない
 
---
### そのまま移行したい → X

- コンテナ化すること自体に意味はない

---

### 費用削減 → X
- 使用するリソースは減らない

---

### パフォーマンス向上 → ☓
  - クラウドサービス上で使う場合、コンテナ on 仮想マシンになる
  - マイクロサービス化した場合、コンテナ(サービス)間はネットワークを介するので、そのオーバーヘッドも発生する

---

### 運用負荷軽減 → △
  - 頻繁に変更が発生する場合で、CI/CD Pipelineの仕組みを適切につくれている場合は負荷の軽減は可能
  - CI/CD Pipelineの構築には試行錯誤が必要

---

### 変化への対応を容易にしたい → ◯
  - アプリケーションのアジリティを高める

---
## 導入に向けてやらないといけないこと

---
- アプリケーション(再)設計
  - マイクロサービス化
  - 再実装
  - コードリポジトリの作成/導入
  
- Dockerイメージの作成
  - Dockerfileの作成
  - コンテナリポジトリの作成/導入

- インフラの設計/構築
  - オーケストレーションツールの導入
  
- CI Pipelineの作成
  
- 監視/運用フローの確立

---

## AWSで利用できるDockerオーケストレーションサービス
---

### Amazon ECS (Amazon EC2 Container Service)
  - AWS独自のオーケストレーションツール
  - 料金
    - ホスト(EC2)利用料金のみ発生
    - スポットフリート等のコスト削減に関するサービスが利用可能

---
### AWS Fargate
  - クラスタ、ホストの管理をAWSが提供するサービス
    - ユーザー側でインフラ運用が不要
  - re:Invent2017でリリース
  - 東京リージョン未対応 (2018年1月現在)
  - AWS独自の概念
  - 料金
    - 同スペックのコンテナをスポットフリートで構成した場合に比べると高額

---
### Amazon EKS (Amazon Elastic Container Service for Kubernetes)
  - AWSが提供するKubernetesのマネージドサービス
  - re:Invent2017で発表
  - プライベートベータが間もなく？(2018年1月現在)
  - 東京リージョンに来るのは・・・？

---
### まとめ

- メリットを理解し、導入するシステムの選定が必要
- 導入に際しやらなければいけないことを整理し、自分の組織で対応できるかの見極めが必要
- クラウドのマネージドサービスを理解し、うまく活用する
Unreal Engine 4メモ：TMapをネスト出来るようにする

どうもUE4のTMapはネスト出来ません。

```c++:やりたかった事
TMap<FString, TMap<FString, FTimespan>> Records;
```
```:エラー
error : Nested containers are not supported.
```

なので構造体の利用で工夫する・・・。

```c++:改良
USTRUCT()
struct AT_API FData
{
	GENERATED_BODY()

	UPROPERTY()
	TMap<FString, FTimespan> BestTime; // この部分をネスト
};

TMap<FString, FData> Records;

```
Dockerコンテナ起動時に環境変数を渡す

## やりたいこと

- Springアプリケーションを プロファイルを切り替えて Docker で起動する
- AWS認証情報 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY を渡す

```bash
docker run \
-e AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
-e AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
-e SPRING_PROFILES_ACTIVE=${PROFILE} \
-p 80:8000 \
-it $(docker images -q | head -1)
```
JavaScriptで画像処理 - 動画のモザイク処理

#サンプル
動画ファイル選択してください。chromeで.mp4しかテストしてません。Edgeでも動くみたいです。
動画の幅は320pxに固定しています。
<p data-height="600" data-theme-id="0" data-slug-hash="XVyMpg" data-default-tab="js,result" data-user="olj611" data-embed-version="2" data-pen-title="Video Mosaic" class="codepen">See the Pen <a href="https://codepen.io/olj611/pen/XVyMpg/">Video Mosaic</a> by Shinichiro Maki (<a href="https://codepen.io/olj611">@olj611</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

#モザイク処理のロジック
<a href="https://qiita.com/PG0721/items/1d1f088e39147b48e24a">こちら</a>を参照してください。

#動画をcanvasに描画
drawImageでできます。
XCTestのUITestでCellをタップさせる方法


## 概要
XCTestのUITestでCellをタップさせる方法がわからなかったので、経緯とともに自分用に残しておく。

## 答え
Cell自体をタップするのではなく、子要素をタップする。

```objc:サンプル
- (void)testExample {
    XCUIApplication *app = [[XCUIApplication alloc] init];
    // CellをタップするとNG
    [[app.collectionViews.cells elementBoundByIndex:0] tap];
    
    // Cellの子要素をタップするとOK
    [[app.collectionViews.cells elementBoundByIndex:0].staticTexts[@"タイトル"] tap];
}
```

## おまけ
上記の例ではタイトルというラベルがあることが前提になっているが、ラベルの文字列が固定じゃない場合は、indexで指定することも可能。

```objc:サンプル
- (void)testExample {
    XCUIApplication *app = [[XCUIApplication alloc] init];
    [[[app.tables.cells elementBoundByIndex:0].staticTexts elementBoundByIndex:0] tap];
}
```
[Swift]文字と文字のスペースを指定する

# その１

「のっぺさん今日はいい天気だなー」

という文章の「のっぺさん」と「今日はいい天気だなー」の間を開けたい時、スペースを挿入すると思ったよりも大きかったり、小さかったりして微妙な事がある。

```swift
name = "のっぺさん"
text = "今日はいい天気だなー"
name += NSAttributedString(string: name).then({
      guard name.count > 0 else { return }
      let r = name.index(before: name.endIndex)..<name.endIndex
      let nsr = NSRange(r, in: name)
      $0.addAttributes([Attribute.kern(20)], range: nsr)
})
attr += text
```

ちょっとThenとSwiftyAttributesを使っている例になりますが、こんな感じでnameとtextの間を20に指定出来る。

何をしているかというと、nameの最後の文字に対してkernを指定しているだけ。
kernは範囲指定した最後の文字にも適用される[^1]ので任意の場所に字間を開けられる。

追記：Attachmentあるとだめだわこれ

# その２
その１では問題がある。
例えばNSTextAttachmentを１つ入れたNSAttributedStringの場合、stringは空文字になるので空白がつかなくなってしまう。

```swift
name = "のっぺさん"
text = "今日はいい天気だなー"
let attachment = NSTextAttachment()
attachment.bounds = CGRect(x: 0, y: 0, width: space, height: 1)
let space = NSAttributedString(attachment: attachment)
name += space
attr += text
```

見た目上はこれでOKなはず。
space分の幅を持つNSTextAttachmentを挿入している。


[^1]: 「きつね」の全体に対してkernを指定すると「き つ ね 」といったように、最後にもkernが適用される。
ソースからbazelをコンパイルする時に"java.lang.OutOfMemoryError: Java heap space"というエラーが出たときの対処法

## 背景

AWSの無料利用枠、t2.microでbazelをコンパイルしようとしていました。
apt-getが使えないので、ソースをダウンロードしてきてunzipし、./compileしたところ、出てきたエラーがこれ

```
java.lang.OutOfMemoryError: Java heap space
```

Jave heap spaceというエラーで、どうやらJavaを実行する際に確保したメモリが足りないせいで出るらしい。

t2.microのメモリが1GBしかないのが原因らしいが(4GBが推奨と聞きました)、メモリが少なくてもコンパイルできる方法がわかったので書いていく。

## 対処方法

`compile.sh`を実行してbazelをコンパイルするわけですが、その中からまず
`run "${JAVAC}" -...`
という部分を探します。

bazelの場合は、`compile.sh`から`scripts/bootstrap/compile.sh`を読んでコンパイルしているので、`scripts/bootstrap/compile.sh`から`run "${JAVAC}" -...`を探して、`-J-Xms256m -J-Xmx512m`というオプションを追加します。より具体的には以下のように編集しました。

```
-  run "${JAVAC}" -classpath "${classpath}" -sourcepath "${sourcepath}" \
+  run "${JAVAC}" -J-Xms256m -J-Xmx512m -classpath "${classpath}" -sourcepath "${sourcepath}" \
```

これで僕の場合はコンパイルに成功しました。

### 参考

https://github.com/bazelbuild/bazel/issues/1341
Hyper-Vと組み合わせて使う時のQoSに関するメモ

参考URL
グループポリシー（QoS）
https://technet.microsoft.com/ja-jp/library/hh831689(v=ws.11).aspx
https://technet.microsoft.com/ja-jp/library/cc731745(v=ws.11).aspx
http://www.atmarkit.co.jp/ait/articles/0509/17/news048.html
DSCPの設定例
https://technet.microsoft.com/ja-jp/library/jj205076(v=ocs.15).aspx
DSCP
https://www.cisco.com/c/ja_jp/td/docs/sw/dcswt/nex1000vswt/cg/018/n1000v-qos/n1000v-qos-6dscpval.html

ネットワークポリシー
https://technet.microsoft.com/ja-jp/library/hh967471(v=wps.630).aspx
Hyper-V関係
https://msdn.microsoft.com/ja-jp/library/dn550728(v=ws.11).aspx#BKMK_QoS
https://technet.microsoft.com/library/jj735303.aspx#bkmk_guidelines



作った例
`New-NetQosPolicy "iSCSI" -IPProtocol TCP -IPDstPrefix "192.168.2.0/24" -IPDstPortStart 3260 -IPDstPortEnd 3260 -DSCPValue 46 -MinBandwidthWeightAction 40`
`New-NetQosPolicy "SMB" -IPProtocol TCP -IPDstPrefix "192.168.2.0/24" -IPDstPortStart 445 -IPDstPortEnd 445 -MinBandwidthWeightAction 10`
【Laravel】URLヘルパーを画面とバッチ（コンソール）との両方で使う場合値がずれることがある


Laravel5.5にて確認。

URL生成するヘルパー関数について。
* `url()`
* `route()`
など

## 遭遇したケース
メールを送信する機能があり、メール本文にはサイトのURLが記載される。  
メールは画面の操作をトリガーにしても送信されることもあるしバッチ処理から送信されることもある。

画面操作経由で送信されたメールとバッチ処理経由で送信されたメールとで、同じ箇所で作られているはずのURLの値が異なり、原因を調査していた。  

## `url('/login')` の出力例
* 画面経由 → http://test.example.com/login になる
* バッチ経由 → http://localhost/login になる

→URLのベース部分が異なる

URLは `url()` や `route()` といったヘルパー関数経由で作っていた。

## 画面経由の場合
URLのベース部分は `$_SERVER['HTTP_HOST'] ` の値になる

## バッチ（コンソールコマンド）経由の場合
URLのベース部分は `\Config::get('app.url')` の値になる

↓
画面経由とバッチ経由との両方で使う処理でURLヘルパーを使う場合値が一定にならないので、注意するか・ヘルパーを使わないほうがよさそう。

## 参考
* [URLヘルパー](https://github.com/laravel/framework/blob/5.5/src/Illuminate/Foundation/helpers.php#L919)
* [routeヘルパー](https://github.com/laravel/framework/blob/5.5/src/Illuminate/Foundation/helpers.php#L777)
* [UrlGenerator](https://github.com/laravel/framework/blob/5.5/src/Illuminate/Routing/UrlGenerator.php)

URLヘルパーがURLのベース部分を作っている箇所の処理を追っていくと Symfony\Component\HttpFoundation\Request::getHost() あたりにいきつく。  
<a href="https://github.com/symfony/http-foundation/blob/master/Request.php#L1137" target="_blank">https://github.com/symfony/http-foundation/blob/master/Request.php#L1137</a>
Raspberry Pi 2 Model BでUSB Web CAMの動画を配信する ～v4l2rtspserver編～

# Raspberry PiでUSB Web CAMの動画を配信する ～v4l2rtspserver編～

今回はServerとして[v4l2rtspserver](https://github.com/mpromonet/v4l2rtspserver)を用いる。

## 使用機材
- Raspberry Pi 2 Bodel B
- Logicool HD Web CAM C270
- 8GBのmicro SD Card

## OS
- RASPBIAN STRETCH LITE (2017-11-29)

## 手順

既にRaspbianをSD CardにInstallしてあるものとする。
[インストール方法については公式を参考](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)

Raspberry Piを起動し、ログインしておく。(今回の作業では標準ユーザー Pi で作業している。)

### Compileに必要なものをInstallしておく

```Shell
sudo apt-get install raspberrypi-kernel-headers
sudo apt-get install v4l2loopback-dkms
sudo apt-get install v4l2loopback-utils
sudo apt-get install liblog4cpp5-dev libvpx-dev libx264-dev libjpeg-dev
sudo apt-get install liblivemedia-dev libv4l-dev
sudo apt-get install git make cmake gettext libtool autoconf
```

### v4l2toolsをInstallする

```Shell
cd ~
git clone https://github.com/mpromonet/v4l2tools.git
cd v4l2tools
make
sudo make install
```

### v4l2rtspserverはlive555を使うとの事なのでこれもInstallしておく

```Shell
cd ~
mkdir live555
cd live555
wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz -O - | tar xvzf -
cd live
./genMakefiles linux
sudo make CPPFLAGS=-DALLOW_RTSP_SERVER_PORT_REUSE=1 install
```

### v4l2rtspserver本体をInstallする

```Shell
cd ~
git clone https://github.com/mpromonet/v4l2rtspserver.git
cd v4l2rtspserver
cmake . && make
sudo make install
```

### v4l2rtspserverを実行する

```Shell
sudo modprobe v4l2loopback video_nr=10
sudo v4l2compress_h264 /dev/video0 /dev/video10 &
sudo v4l2rtspserver /dev/video10 &
```

## 配信を見るには
RTSPに対応したPlayer(VLCなど)をInstallして、 rtsp://[RPiのIPaddress]:8554/ を開けば再生される。

## 雑記
- Systemdで自動化しようとしたところ/dev/video0と/dev/video10がダメになってしまい断念
    - /dev/video10が仮想デバイスなので、変なタイミングでこけるとOSから見て変な状態になるのか、device busy状態でアクセスできなくなる
    - psやfuserで見てもそれらしいものが見つからず。。。
- /dev/video0から入ってきた動画をv4l2compress_h264で変換している割には高速
    - 遅延も5秒いかないくらい
- 思いのほか画質は良い
- OSがDebian 9 Stretchベースになっているので調べて見つかる資料と手順に若干差異がある
- 自動化周りで思いのほか手がかかりそうなので、RTSPは諦めてMotion JPEGへ
pythonのdel (リストの要素の削除)

#はじめに
windows10上でpython3.6を用いてプログラミングを書いているのですが、今回は一つしょうもないミスをしたため、2度としないように書いておきます。

#pythonのリスト
pythonのリストには要素を削除するためにdelという関数があり、順番を指定することで簡単に要素を削除することができます。

出力結果
`[['a'], ['b'], ['e']]`


```python3:del1.py
a=[["a"],["b"],["c"],["d"],["e"]]
del(a[2:4])
print(a)
```

ちなみに、多次元配列であると、
出力結果
`[['a', 0], ['b', 1], ['e', 2]]`

```
a=[["a",0],["b",1],["c",3],["d",4],["e",2]]
del(a[2:4])
print(a)
```

元のリストに対してそれぞれのリストが要素として扱われます。

ここで、自分の犯したミスは`del[ : ]`に入れる数字を間違えて大きい数字から小さい数字にしてしまったことです。
`del[4:2]`
出力結果
`[['a', 0], ['b', 1], ['c', 3], ['d', 4], ['e', 2]]`

```
a=[["a",0],["b",1],["c",3],["d",4],["e",2]]
del(a[4:2])
print(a)
```

この場合、エラーは出ず、また要素も消去されていません。この順序を間違えたことに気づかず、要素が削除されてないことに30分悩んでしまいました...

エラーがでないことは覚えておきます
yukicoderの問題といてみた。

#yukicoderの問題を解いてみた話。
https://yukicoder.me/problems/no/285
この問題を解いた。
まず最初に見てクソ簡単やんって思った。
でも、甘かった。

```
x = float(input())
x = x*1.08
print(x)
```

~~何も間違っていない。
しかし、処理が重かったのだ。
これで重いのかよって少し絶望気味になった。
まあ結局は~~

```
x = float(input())
print(x*108/100)
```

~~で出したら、良かったんだけどね。。。
競プロってこんな細かいところまで必要なのかって思った。~~


申し訳ございません。ほとんど書いてることは嘘でした。yukicoderのyuki2006さんに指摘をいただきほとんど訂正します。小数誤差によって誤差で、たしかに試してみると値に誤差が出ました。
小数誤差について全く知らなかったので、とても勉強になりました。
terraform_remote_stateで値を取得する際にはoutputの位置が大事

#やりたかったこと
VPCとそれに乗るサービスを別々のTerraformで管理、VPCのIDをoutputで出力してそれを`terraform_remote_state`で呼び出して利用したかった。 これはできた

`workspace`として`vpc-dev`, `db-dev`を用意、`db-dev`をデプロイする際に`vpc-dev`のoutputを利用したかったが、まだ`workspace`をまたいでのoutputの利用はうまくできていない...ヘルプミー

とりあえずうまく行った部分だけ共有!

#だめな例
```
├── vpc
│   ├── main.tf
│   ├── output.tf
│   └── variables.tf
└── vpc.tf
```

```bash:output.tf
output "vpc_id" {
  value = "${aws_vpc.vpc.id}"
}
```
`main.tf`と`variable.tf`は省略

```bash:vpc.tf
module "vpc" {
  source = "./vpc"
}
```
上記だとmoduleのvpcの`output`になるが、以下の記事からterraformの`remote_state`はルートレベルのものしか許容していないため`remote_state`は利用できない

https://www.terraform.io/docs/providers/terraform/d/remote_state.html#root-outputs-only
> ルートレベル出力のみがアクセス可能です



tfstateを覗いて見るとルートにはoutputがなく、vpcモジュールにoutputがある

```json:terraform.tfstate
~~~~~~~~~略~~~~~~~~~~~~
    "modules": [
            {
            "path": [
                "root"
            ],
            "outputs": {},
~~~~~~~~~略~~~~~~~~~~~~
            "path": [
                "root",
                "vpc"
            ],
            "outputs": {
                "vpc_id": {
                    "sensitive": false,
                    "type": "string",
                    "value": "vpc-*******"
                }
            },
~~~~~~~~~略~~~~~~~~~~~~
```

#良い例
モジュールを呼び出した所で再度outputしてあげればOK

```bash:vpc.tf
module "vpc" {
  source = "./vpc"
}

output "vpc_id" {
  value = "${module.vpc.vpc_id}"
}
```

tfstateを見てみるとルートに値があることが確認できる

```json:terraform.tfstate
~~~~~~~~~略~~~~~~~~~~~~
    "modules": [
            {
            "path": [
                "root"
            ],
            "outputs": {
                "vpc_id": {
                    "sensitive": false,
                    "type": "string",
                    "value": "vpc-********"
                }
            },
~~~~~~~~~略~~~~~~~~~~~~
            "path": [
                "root",
                "vpc"
            ],
            "outputs": {
                "vpc_id": {
                    "sensitive": false,
                    "type": "string",
                    "value": "vpc-*******"
                }
            },
~~~~~~~~~略~~~~~~~~~~~~
```

これによって`remote_state`からoutputを取得できるようになりました


workspaceをまたいだ`remote_state`の利用ができるのかがまだわかっていないので知ってる人いたら教えてほしいです:bow:

#参考リンク
- https://github.com/hashicorp/terraform/issues/16652
【Java：備忘録】改行コードCRLFをLFにするまで

## 概要
とあるファイルの改行コードを変更？ためのプログラム。

元のファイルではCRLFだが、これをLFのみにしたかった。
文字コードは入出力ともにUTF-8。

## 環境
OS：Windows8.1 Pro
JavaのVersion：jre1.8

## 前提条件
ファイルの入出力については[こっちの記事](https://qiita.com/necocha0v0/items/d973e841f89592919dd1)を参照。

## プログラム
```Java

// レコードの最後に\LFを付与する.
while ( ( msg = br.readLine()) != null ) {
    bf.append(msg);
    bf.append("\n");
}
```

## 補足説明
* `\n`を`\r\n`にすればWindowsの改行コードに戻せます。
* ネットで探すとreplaceAllで置換したり、正規表現を使用したりと色々方法があったが、上記でも実現は出来るもよう。厳密にこの方法でいいのかは・・・・。
Deep LearningフレームワークのトレンドをGitHubリポジトリから自動で取得する

Deep Learningフレームワークの最新のトレンドを調べたいと思い、現時点の情報をGitHubリポジトリから自動で取得するpythonスクリプトを作りました。

## 取得する情報

各リポジトリに対して、以下の情報を取得します。

* Starの数
* Forkの数
* Issueの数

## 情報を取得するリポジトリ

以下のフレームワークのトレンドを取得します。

* Tensorflow
* Chainer
* Caffe

## 実行環境

* Ubuntu 16.04 LTS
* Python 3.6.0
* jqコマンド（sudo apt-get install jq）

## スクリプト

~~~python:github_trend.py

import subprocess

def res_cmd(cmd):
    return subprocess.Popen(
        cmd, stdout = subprocess.PIPE,
        shell=True).communicate()[0]

# targets
target_star = '.watchers'
target_fork = '.forks'
target_issue = '.open_issues'

# repositories
tensorflow = '/tensorflow/tensorflow'
chainer = '/chainer/chainer'
caffe = '/BVLC/caffe'

def repo_crawler(repo):

    def crawler_cmd(repo, target):
        cmd = "curl --silent 'https://api.github.com/repos{0}' -H 'Accept: application/vnd.github.preview' | jq '{1}'".format(repo, target)
        return int(res_cmd(cmd))

    star = crawler_cmd(repo, target_star)
    fork = crawler_cmd(repo, target_fork)
    issue = crawler_cmd(repo, target_issue)

    return repo, star, fork, issue

header = ('Repository', 'Stars', 'Forks', 'Issues')
ret_tensorflow = repo_crawler(tensorflow)
ret_chainer = repo_crawler(chainer)
ret_caffe = repo_crawler(caffe)

print(header)
print(ret_tensorflow)
print(ret_chainer)
print(ret_caffe)
~~~

## 実行しすぎるとGitHub APIの制限に引っかかる
GitHub APIのリクエスト制限が1時間に60回までなので、何度か実行するとエラーになります。
PHP Fatal error:  Uncaught Error: Call to undefined function ImageCreateFromJPEG()の対処法

AWSで運用中のサービスでP`ImageCreateFromJPEG()`関数使った時に出たエラー。
エラー内容は以下

```
PHP Fatal error:  Uncaught Error: Call to undefined function ImageCreateFromJPEG()
```

サーバー内に`php-gd`が入っていなかっただけなので、インストールをする。

## php-gdをインストール


```
$ sudo -i

$ yum install php-gd -y

$service httpd restart
```

`yum install`時にバージョンを指定しないとphpの最新バージョンがインストールされてしまうので、
`yum install phpバージョン-gd`とすればphpのバージョンにあったgdがインストールされます。
EC-CUBEのSymfony検証ブランチでPHPUnitを実行する

# 概要

EC-CUBEではSymfony検証が行われています。
EC-CUBE3.0からPHPUnitの導入方法が変わりましたのでメモしておきます。
EC-CUBE自体のインストール方法については[こちら](https://qiita.com/okazy/items/cf21ba1022f2284ba0d6)の記事をご覧ください。

# 導入方法
PHPUnitのインストールには2種類の方法があります。
- PHP Archive(PHAR)
- Composer
[公式ドキュメントより](https://phpunit.de/manual/6.5/ja/installation.html)

EC-CUBE3.0ではComposerでPHPUnitのインストールをしていましたが、Symfony検証ブランチではSymfonyのお作法にのっとりPHP Archive(PHAR)でのインストールを採用しております。

## PHP Archive(PHAR)でのインストール
Composerでのインストールではなくなりましたので、 `composer install` コマンドを実行してもPHPUnitはインストールされません。
PHPUnitの初回実行時にはリポジトリのルートディレクトリで以下のコマンドを実行してください。

```shell
php bin/phpunit
```

こちらを実行することで `bin/.phpunit/phpunit-6.5` のディレクトリにPHPUnitがインストールされます。
少し時間がかかります。

# PhpStormの設定

1. PhpStormのSettingを開きます。
2. 左上で `phpunit` で検索します。
3. `Languages & Frameworks -> PHP -> Test Frameworks` を開きます。
4. `+` ボタンから `PHPUnit Local` の設定を追加します。（既に設定がある人は不要）
5. PHPUnit libraryで `Path to phpunit.phar` を選択します。（EC-CUBE3.0では `Use Composer autoloder` だったところ。）
6. Path to phpunit.pharに `リポジトリのルートディレクトリ/bin/.phpunit/phpunit-6.5/phpunit` を指定します。
7. Test RunnerのDefault configuration fileに `リポジトリのルートディレクトリ/phpunit.xml.dist` を指定します。（既に設定がある人は不要）

これで3.0系と同様にPHPUnitの実行ができます！
Windows Server で動的コンテンツを EC2 + RDS で作ってみるの巻

#目的
検証用のアプリケーションを作成する

#目標
Web 動的コンテンツから、RDS Mysql へデータ書き込みを行う

#環境
EC2 t2.miclo WindowsServer2016
Eclipse 4.7 Oxygen の Windows 64bit Full Edition Java
Tomcat 8

その他、下のサイト参照
https://qiita.com/hatakkkk/items/cb8dd22041d75952c8d7

Eclipse 動かすのに t2.miclo は小さいかも。。。

#JDBC の導入
お勉強用に下のサイトを参考にした
http://web.sfc.wide.ad.jp/~tinaba/tutorials/mysql-j/
https://qiita.com/ononoy/items/4961ce6d5b12aff6c108
https://www.qoosky.io/techs/d2beb9dc80


Mysql の JDBCドライバについて、Aamazon から情報が提供されているようなので、下のサイトを確認する。
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/java-rds.html

##Mysql のJDBC ドライバをインストールする
下のサイトから、"mysql-connector-java-5.1.45.zip" をダウンロードする
https://dev.mysql.com/downloads/file/?id=474258

「あれ？ダウンロードが始まらないな？」というときは、
Web サイトの中央下付近にある文章"No thanks, just start my download." をクリック

今日はここまで。
StreamRelay.jarのGUIについて

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

### StreamRelay.jarのGUIについて

- -GUI で AWT の GUI 画面が起動する

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
lumen でお手軽にコマンドラインツールを作る


```
composer require laravel/lumen-framework laravel/framework
```

が通る様になったので、こういうことも出来るはず。

## 手順

\1. 適当なプロジェクト内で、 `lumen new my-cli` する。


\2. `my-cli/composer.json` に以下を追記

```
{
	...
    "bin": ["artisan"]
}
```

\3. プロジェクト側のリポジトリに パスを通すため、 `composer.json` に以下を追記

```
{
	...
    "repositories":[
        {
            "type": "path",
            "url": "./my-cli"
        }
    ],
    ...
}
```

\4. `composer require {my-cli/composer.jsonのname}:dev-master` してインストール

\5. `my-cli/boostrap/app.php` 側で `__DIR__."/../"`となっているところを `getcwd()` に置き換え

\6. `vendor/bin/artisan` を実行！
StreamRelay.NET.exeのログ出力機能

### ログの出力

- -Logging 標準出力に通信のログを出力する
- -LoggingHex 出力するログは Hex(16進数)で出力する
- -LoggingFile "Filename" ファイルにログを出力する
- -LoggingCharSet "ChasetName" ログを指定した文字コードとして標準出力に出力する
- -verbose とか -deugmode とかでより詳細(通信端末情報(IPアドレスとか)とか時間)も出力する

---
### プラグイン化

ver2.24.0.0 以降からロギング機能自体をプラグインとして外出しするようにした。
今までの実装(ファイルへのロギング、コンソールへのロギング)は、
plugins\Plugin.LoggingConsoleAndFile.dll
に移した。

---
### GUIなログ

plugins\Plugin.LoggingGUI.dll

オプションは「-LoggingGUI」

画面はこんな感じ
![loggui.jpg](https://qiita-image-store.s3.amazonaws.com/0/182822/8df57156-987e-0390-3ac7-40d612ebd804.jpeg)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
StreamRelay.jarのログ出力機能

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

### ログの出力

- -Logging 標準出力に通信のログを出力する
- -LoggingHex 標準出力に通信のログを16進表示で出力する
- -LoggingFile "Filename" ファイルにログを出力する
- -LoggingCharSet "ChasetName" ログを指定した文字コードとして標準出力に出力する
- -LoggingFileCharset "CharName" ファイルに出力する際に、ログを指定した文字コードとして認識/変換する
- -verbose とか -deugmode とかでより詳細(通信端末情報(IPアドレスとか)とか時間)も出力する

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)
Python > debug > disパッケージ > bytecodeの確認に使う

```txt:動作環境
Python 3 (Python 3.5)
```

[stackoverflow](https://stackoverflow.com/questions/48315777/understanding-if-lie-is-lie-is-lie)の質問にて、bytecodeの紹介がされていました。

> answered 20 mins ago
Daniel Lee

```py
dis.dis(f)
```

### disパッケージ

- [32.12. dis — Disassembler for Python bytecode¶](https://docs.python.org/3/library/dis.html)

### code

https://ideone.com/xHq3vT

```py
import dis
 
def f():
	return 314
 
dis.dis(f)
```

```txt:run
 4           0 LOAD_CONST               1 (314)
              3 RETURN_VALUE
```
【フォーム】フォームに吹き出しをつける

# フォーム入力時に吹き出しを出力させる
吹き出しを出力してくれるプラグイン[PowerTip](https://stevenbenner.github.io/jquery-powertip/)を使えばよい


# 使い方
## ソースを任意のところに配備
下記をhtmlに埋め込む(jqueryのバージョンは各自合わせる)
[ダウンロードはこちら](https://stevenbenner.github.io/jquery-powertip/)
## htmlに記述
ソースパスは各自で合わせる

```html:sample.html
<link rel="stylesheet" href="jquery.powertip.css" type="text/css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<script type="text/javascript" src="jquery.powertip.js"></script>
```
## 使う
呼び出し方は下記

```javascript:sample.js

$('#noteForXX').powerTip({
	placement: 'n', //北(north,上側)を指定中
});

```

# 五月雨にポイントを
* このままだととりあえず上に、マウスオーバーのタイミングで吹き出しがでる

|オプション| 方角|位置|
|:-----------------:|:------------------:|:------------------:|
|n|北|        上        |
|e|東|       右       |
|s|南|        下        |
|w|西|         左         |
|nw|北西|       ひだりうえ       |
|ne|北東|      みぎうえ       |
|sw|南西|       ひだりした       |
|se|南東|      みぎした       |
|nw-alt|北西|       吹き出しは上に、矢印はひだりうえ(ここはやってみてください)       |
|ne-alt|北東|      吹き出しは上、矢印はみぎうえ(ここはやってみてください)        |
|sw-alt|南西|       吹き出しは下、矢印はひだりした(ここはやってみてください)        |
|se-alt|南東|      吹き出しは下、矢印はみぎした(ここはやってみてください)        |

* クリックでだしたいなら


```javascript:sample.js
// run PowerTip - but disable the default event hooks
$('.tooltips').powerTip({ manual: true });

// hook custom onclick function
$('.tooltips').on('click', function() {
	// toggle the tooltip for the element that received the click event
	$.powerTip.toggle(this);
});

```
↑けどクリックしてから消えない(他のツールチップが表示されるまで)

```javascript:sample.js
$('.tooltips').powerTip({ openEvents: [ 'click' ], closeEvents: [ 'click' ] });


```
↑これでクリックしてもう一度クリックするとでてきえてする
さらにオプションを変更すれば左下ふきだし

```javascript:sample.js

openEvents: [ 'click' ],
closeEvents: [ 'click' ],
placement: 'sw-alt'
```
exportされていないフィールドの値を変更する #golang

## 公開されていないフィールドの値を変更する

以下のように、フィールドに対応する`reflect.Value`のアドレスを元に、`reflect.NewAt`で`reflect.Value`を作り直してやれば、`reflect.CanSet`が`true`を返すようになり、セットできるようになります。

なお、`unsafe`を使っているので、Google App Engineでは使えません。

https://play.golang.org/p/_Jdc0r3SInK

```go
package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

type hoge struct {
	n int
}

func main() {
	h := &hoge{n: 100}
	v := reflect.ValueOf(h)
	fv1 := v.Elem().FieldByName("n")
	fmt.Println(fv1.CanSet())

	fv2 := reflect.NewAt(fv1.Type(), unsafe.Pointer(fv1.UnsafeAddr()))
	if fv2.Elem().CanSet() {
		fv2.Elem().SetInt(200)
	}
	fmt.Println(h)
}
```

## 型がわかっている場合

*追記（2018/01/19）：社内から指摘をうけました！*

型がわかっている場合は、`reflect.NewAt`を使わずにできます。

https://play.golang.org/p/iF6RLTw-TXe

```go
package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

type hoge struct {
	n int
}

func main() {
	h := &hoge{n: 100}
	v := reflect.ValueOf(h)
	fv1 := v.Elem().FieldByName("n")
	i := (*int)(unsafe.Pointer(fv1.UnsafeAddr()))
	*i = 200
	fmt.Println(*i)
}
```

## メソッドはどうなのか

以下のように、メソッドは、`reflect.CanAddr`が`false`を返すので、`reflect.NewAt`が使えないのでダメです。

https://play.golang.org/p/9F9E3CtvMvF

```go
package main

import (
	"fmt"
	"reflect"
	"unsafe"
)

type hoge struct {
	n int
}

func (h hoge) N() int {
	return h.n
}

func main() {
	h := &hoge{n: 100}
	v := reflect.ValueOf(h)
	mv1 := v.Elem().MethodByName("N")
	fmt.Println(mv1.CanSet())
	fmt.Println(mv1.CanAddr()) // false

	mv2 := reflect.NewAt(mv1.Type(), unsafe.Pointer(mv1.UnsafeAddr()))
	if mv2.Elem().CanSet() {
		mv2.Elem().Set(reflect.ValueOf(func() int {
			return 200
		}))
	}
	fmt.Println(h.N())
}
```
Pythonの辞書からたった一行で値が最大のkeyを取得する

# 辞書型ってなに？
省略します。以下が分かりやすいです。
[Pythonの辞書 初心者向けガイド](https://qiita.com/oyakata@github/items/94238e542eaeb643ad12)

# とりあえず結論からいってみる

dictから値が最大の項目のkeyを取得するには、以下のコードを書きます。

```python3
max(dict.items(),key = lambda x:x[1])[0]
```

わぁ簡単！とはならず、なるほど分からん。
ってことで調べてみる。

# 分解してみた

## ①ひとまずそのまま出力してみる

実装

```python3
#辞書の定義
dict = {"a": 300, "b": 200, "c": 100}

#max値を求める
result = max(dict.items(),key = lambda x:x[1])[0]

#出力する
print("①max値の出力：",result)
```

実行結果

```
①max値の出力： a
```

## ②分解して出力してみる

実装

```python3
#辞書の定義
dict = {"a": 300, "b": 200, "c": 100}

#max値を求める
result = max(dict.items(),key = lambda x:x[1])[0]

#出力する
print("①max値の出力：",result)

#dict.itemsを見てみる
print("②dict.itemsの中身：", dict.items())
print("dict.itemsのtype：", type(dict.items()),"\n")

#keyを無くしてみる
print("③keyを無くして出力：",max(dict.items())[0])
print("keyを無くしてtype出力：",type(max(dict.items())[0]),"\n")

#lambdaの関数を変えてみる
print("④lambda式を変えて出力：",max(dict.items(),key = lambda x:x[0])[0])
print("lambda式を変えてtype出力：",type(max(dict.items(),key = lambda x:x[0])[0]),"\n")

#最後の参照先を変えてみる
print("⑤参照先を変えて出力：",max(dict.items(),key = lambda x:x[1])[1])
print("参照先を変えてtype出力：",type(max(dict.items(),key = lambda x:x[1])[1]),"\n")

#最後の参照先をなくしてみる
print("⑥参照先をなくして出力：",max(dict.items(),key = lambda x:x[1]))
print("参照先をなくしてtype出力：",type(max(dict.items(),key = lambda x:x[1])),"\n")
```

実行結果

```
①max値の出力： a
②dict.itemsの中身： dict_items([('a', 300), ('b', 200), ('c', 100)])
dict.itemsのtype： <class 'dict_items'> 

③keyを無くして出力： c
keyを無くしてtype出力： <class 'str'> 

④lambda式を変えて出力： c
lambda式を変えてtype出力： <class 'str'> 

⑤参照先を変えて出力： 300
参照先を変えてtype出力： <class 'int'> 

⑥参照先をなくして出力： ('a', 300)
参照先をなくしてtype出力： <class 'tuple'> 


```


## 考察してみる

- ②及び⑥の出力結果から、そもそもdict.itemsがまずタプルの集合であることが分かった。
タプルは、要は変更できないリストのこと。
([Pythonのリスト・タプル・ディクショナリ](https://qiita.com/yoshitaku_jp/items/d0240cb6f2897b897142))
- ③の出力結果から、max関数はオプションでkeyを指定しない場合、key項目のマックス値を取得することが分かった。(a < b < c)
- ④の出力結果から、keyに入れる項目に応じてどの項目を元にマックス値を取得するか判別していることが分かった。[0]の場合はタプルの1番目なので、keyを元に取得。[1]の場合はタプルの2番目なので、要素を元に取得している。
- ⑥の出力結果から、辞書にmax関数を適用させた場合は、返り値がタプルであることがわかった。


つまりこういう発想ね。

1. dict.items()：辞書からタプルに一旦置き換える。
2. max(dict.items())：タプル群の中から最大値を取得。（dictのkeyを元にする）
3. max(dict.items(),key = lambda x:x[1])：タプル群の最大値を取得するが、タプルの要素の2番目（辞書でいう要素部分）を元に最大値を取得する。
4. max(dict.items(),key = lambda x:x[1])[0]：取得した最大値タプルの要素の0番目（辞書で言うkey部分）を取得する。

なるほどすっきりした。

# あとがき
pythonは短いコード数で便利に書ける半面、中身がどうなっているか悩むことが多々ある。そのまま使い続けるだけでなく中身まで理解して使えるようになりたい。何か調査して欲しいことがあればコメントにて。
【更新中】SAP S/4 HANA勉強会（概要）

##前提知識
勉強会参加者である私の前提知識。
①ECC6.0の開発・導入を数年経験
②SAP S/4 HANAの知識はなし！
というわけで、個人的にECC6.0とSAP S/4 HANAで異なる点を中心に記載できればと思います。

##SAP S/4 HANAとは？
SAP S/4HANA はデジタルビジネスのためのリアルタイム ERP スイートです。
私のざっくりな理解だと、
・HANA：インメモリープラットフォームの基盤のこと
・S/4　：これまでのR/3みたいな、エンタープライズ用のアプリケーションのこと
という感じです。
http://special.nikkeibp.co.jp/atcl/NBO/15/sapblog/09/

##S/4 HANAとECC6.0の大きな違い
■Overview
個人的には従来のERPというよりは、デジタル基盤として位置づけられた、拡張性を持っているプラットフォームである印象と受けました。
例えば従来のERPのアプローチは下記の図の「CoreProcessの標準化」「MasterDataの簡素化・統合」によるBPRが主だった様に思っています。
しかしS/4 HANAはそれ以上に、「Analytics：ビジネスデータの可視化」や「LoB specific Apps」による、外部クラウドサービスとの柔軟な連携、最終的には「DataAutomation」にある様なAIなどを用いた業務の自動化・高度化を見据えて、開発されている模様です。
（下記の画像はネットからの拾い物です）
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/207094/544781b8-1622-85dc-e02e-024a4da34273.png)

##ライセンス面での違い
Enterprise Management、Products、Suiteという形でサービスを提供している。
後者のサービスになるにつれ、使用できる機能やサービスが増えていくイメージで、後者に行く程ライセンス料が高くなる。
※ライセンス面は良い資料が見つけられなかった。。。継続して探そう。

##システム面での違い
個人的に大きく変わったなと思ったのは下記点。
１、Simplification
データモデルの見直しを行い、テーブル数が大幅減（例えばSDモジュールなどは下記リンクの通り）![picture1_1036088.png](https://qiita-image-store.s3.amazonaws.com/0/207094/318e599b-db34-651f-34de-399c450cc9c1.png)



http://special.nikkeibp.co.jp/atcl/NBO/15/sapblog/09/
https://blogs.sap.com/2016/07/03/sap-s4-hana-simplifications-in-sales-distribution-data-models/

・UI/UX
SAP Fioriによりスマートフォンやタブレットを意識した画面となっており、それらのデバイスからのアクセスも可能。
以前のECCと異なり、ダッシュボードが実装されていたりして、よりデータのビジュアライズ化に力を入れている。
https://www.sap.com/japan/products/fiori.html


【執筆用メモ】
・
・移送やLSMWは同じっぽい。
numpyの解決例

***
## 線型方程式（numpy.linalg.solve）
### 簡単の例(2次元)：
 ```
 x + 2y = 5
 2x + 3y = 8      ⇒　 x = 1, y = 2
 ```
### 共通公式(多次元)：
 ```
 a11*x1 + a12*x2 + ... + a1n*xn = b1
 a21*x1 + a22*x2 + ... + a2n*xn = b2
  .
  .
 am1*x1 + am2*x2 + ... + amn*xn = bm
 ```

### numpy.linalg.solveで解決：
例１（２次元）：

```
 x + 2y = 5
 2x + 3y = 8
```
```python3:test.py
# -*- coding: utf-8 -*-
import numpy as np

A = np.array([[1.,2.] 
             ,[2.,3.]])
B = np.array([5.,8.])

X = np.linalg.solve(A, B)
# 計算結果の表示
print(X)  
```
結果

```
array([ 1.,  2.])
```

例２（３次元）：

```
 x + 2y + z = 8
 2x + 3y + 2z = 14
 3x + 4y + 3z = 20
```
```python3:test.py
# -*- coding: utf-8 -*-
import numpy as np

A = np.array([[1.,2.,1.] 
             ,[2.,3.,2.]
             ,[3.,4.,3.]])
B = np.array([8.,14.,20.])

X = np.linalg.solve(A, B)
# 計算結果の表示
print(X)  
```
結果

```
array([ 1.,  2.,  3.])
```
Windows Server 2016 に Java Web アプリケーションを構築するの巻

#目的
Eclipse で、Windows Server 2016 上にJava Web アプリケーションを構築する

#目標
現在時刻を表示させる動的Web コンテンツを作成する

#log
下のサイトを参照
http://www.javaroad.jp/opensource/js_eclipse6.htm

サイト内"動作確認" まで、進めて完了
今回は、つまらずに進めたので、以上。
ACF の Date Picker で範囲を指定する。

WordPress を使ってカスタムフィールド製造業をしていると、ACF で Date Picker を使う時があります。

<img width="271" alt="スクリーンショット 2018-01-18 16.13.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/72931/7ad37245-556d-3329-93e5-6b05acc55e05.png">

こんな感じで、どこまでも選択し放題な感じなので、範囲を決めたいと思った時に管理画面から出来ないので
管理画面に以下のような js を読み込めば大丈夫だと思います。

```JavaScript:example.js
(function($){
	var post      = $('#post');
	var postType  = $('#post_type').val();
	var postTypes = [ 'post', 'page' ];

	if ( -1 !== $.inArray( postType, postTypes ) ) {
		var datePickerField = $('#acf-xxxxxx'); // xxxxxx の部分は編集画面の表示オプションに Field Keys があるので、チェックして確認
		datePickerField.next('input').datepicker({ minDate: -1, maxDate: "+1d" }); // とりあえず前後一日を指定
	}

})(jQuery);
```
ファイルの読み込みは割愛します。

<img width="273" alt="スクリーンショット 2018-01-18 16.14.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/72931/3188cca3-50bb-5831-36f5-e84cf891bdea.png">

うまいこと読み込めれば、上記画像みたいになります。
すでに出てたり知っていたらすみません。

追記:
date_picker_args があるので、さっきの example.js は

```JavaScript:example.js
(function($){
acf.add_filter('date_picker_args', function( args, $field ){
	if ( 'field_xxxx' === $field.data('key') ) { // field_xxxx の部分は編集画面の表示オプションに Field Keys があるので、チェックして確認
		args.minDate = '+1d';
		args.maxDate = '+3m';
	}
	return args;
});
})(jQuery);
```
上記で大丈夫みたいでした