OmniAICreator/Qiita-1.07M huggingface dataset:
deployerでどのコミットがデプロイされているか確認する

最近deployerを使い始めました。
手動でdeployしていると、どのコミットがデプロイされているのか把握できなくなる事がたまにあります。
(cricleci経由でデプロイする仕組みいれてればこのような事になりませんが・・・）

Deployerで気軽に確認したいなーと思ったので、作ってみました。

```php
// deploy.php

...

task('version:check', function(){
    cd('{{release_path}}');
    writeln('<info>release:' . run('pwd | awk -F "/" \'{ print $NF }\''). '</info>');
    writeln(run('git log -n 1'));
});

```

deploy.phpのタスクに追加するだけえ、どのコミットがdeployされているか確認できます。
gitのログ以外にリリース番号？も表示するようにしています。


deployerについてそんなに調べてないので、
もっとよいレシピとか方法を知っている方いたら教えてください・・・。

## 最後に

taskについて勘違いしてたツイートに[@nunulk](https://twitter.com/nunulk/)さんからリプライもらえて助かりました！！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あれ？ task = コマンド じゃないですか？ dep my_task で実行するやつ<a href="https://t.co/R1HiHlndlJ">https://t.co/R1HiHlndlJ</a></p>&mdash; ヌヌルク (@nunulk) <a href="https://twitter.com/nunulk/status/973134364593631232?ref_src=twsrc%5Etfw">2018年3月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
エンジニアの二年目病とその予防法⑤

こんばんは。10分で生産的なミーティングができるWebサービス「[minmeeting](https://minmeeting.jp/)」を開発している伊勢川です。

<a title="minmeeting - 10分で生産的なミーティングができる会議ツール" href="https://minmeeting.jp/" target="_blank"><img width="100px" src="https://qiita-image-store.s3.amazonaws.com/0/199506/32e65577-a5bb-2c3b-4d30-4690c3c5ce0f.png" /></a>

3月に突入し、もうすぐ新人エンジニアの皆さんも二年目の先輩エンジニアになることでしょう。そこで、余計なお世話ですが、<B>二年目エンジニアが陥りがちな症状と予防法</B>を何回かの連載で紹介しています。

近年、オープンソースのライブラリの充実っぷりは目覚ましく、何かやりたいことがある際はライブラリを組み合わせればかなりのことが実現できるようになってきました。本日は、そんな便利な時代にエンジニアになった人たちにたまに見られる症状を紹介します。

# オープンソース・ライブラリ依存症
第1回目で取り上げた「Google依存症」とも似ていますが、オープンソースのライブラリに依存しきって、それらの<B>ライブラリにできないことは実現できないと思い込んでいる</B>若手エンジニアをよく見かけます。

## 症例
採用しているオープンソースのライブラリに起因した不具合を発見した際に、ライブラリのせいなので対応できないと諦めてしまう。

既にあるライブラリが採用されている環境で開発をしている際に、そのライブラリでは実現できない要件が発生すると、（普通に自分で実装すれば実現できるのに）それは実現できないと思い込んでしまう。

## 予防法
ある<B>オープンソースのライブラリが対応していないからといって、それは実現できないことではありません</B>。すぐに諦めるのではなく、ライブラリを使わなかったら普通どうやって実現するのか、その実現コストはどのくらいか、実現した際に既存ライブラリとの住み分けはどうすべきかを検討してください。

ライブラリを使わない方が簡単に実現できることが多々あります。そんな際は余計なライブラリはさっさと捨てて、自分で書き直した方がよいです。

また、ライブラリを使わないと非常にコストがかかる場合も諦める必要はありません。オープンソースなのだから、issueに登録したり<B>直してpull requestを出し</B>たりすれば、問題が解決できる可能性はあります。

なお、<B>pull requestを出しても何も反応がない</B>ような死んでいるライブラリであれば、<B>さっさとリプレース</B>した方が将来のためでしょう。

# バックナンバー
1. [エンジニアの二年目病とその予防法①　Google依存症](https://qiita.com/Akira-Isegawa/items/220dcbd9a1639099a325)
1. [エンジニアの二年目病とその予防法②　すぐできる・なんでもできる病](https://qiita.com/Akira-Isegawa/items/d62eea7a7804ecc5fb2e)
1. [エンジニアの二年目病とその予防法③　雑用ホイホイ症候群](https://qiita.com/Akira-Isegawa/items/d6e181c354278bc0ab87)
1. [エンジニアの二年目病とその予防法④　放置プレイ依存症](https://qiita.com/Akira-Isegawa/items/9a5f2ddcdb47c7522c20)
yum(apt)のupdateを高速化したい

Dockerコンテナを建てる時にとりあえず入れている
```
yum update && yum -y upgrade
```
を、コンテナを作るたびに実施させていたら、これだけで時間を多く取られる事になります。
また、実行したタイミングによって、開発中も保守中も常にバージョンが安定しない可能性があるので、これを解消しようという狙いです。
Dockerfile自体はgitなりでバージョンを管理している想定です。

# 手順
https://orebibou.com/2015/04/ubuntu-server-14-04-ltsでaptサーバaptリポジトリミラーサーバを構築/
https://yosida95.com/2013/05/19/003744.html
を参考に進めてます。

作業をする前に136GB以上の容量を確保しておく、ぐらいでしょうか。
構築時に恐ろしく時間が掛かるので、気長にやりましょう。

構築自体は難しくないんですが、運用を考えた時に落とし穴が多いので、その話を。

# 運用のイメージについて
## yum(apt)のミラーをローカルに持つ
このコンテナ（サーバー）でupdate && upgradeを実施するタイミングを管理するために準備する。
実施タイミングが手動なら手動でも良いでしょう。

## LAN内のコンテナはyum(apt)を見るようにする
外のサーバーにデータを取りに行くのと比べるまでもなく速くなりました。
また、例えば1時間ずれただけでバージョンが更新されていた、なんてウッカリもないです。[^1]
[^1]: バージョンの差異はない：aptサーバーが同期してるので運用を間違えなければおかしくならないはず。

## 普通にyum(apt)
サクッと書いてますが、ちゃんと切り替え出来てるよね？という確認をしたい場合は一時的にyum(apt)サーバーのバージョンを古くして、そちらと同じバージョンになっている事を確認する必要があります。
あるいは、一週間寝かすぐらいがいいと思います。

が、本記事としては、そんな確認のために時間を掛けるよりは、起こっちゃったら環境を作り直したほうがなんぼか早いんじゃないでしょうか？
取り返しがつく範囲での運用が前提です。[^2]
[^2]: 取り返しがつく運用：データは割れ物だと思って運用してほしいものです…

# サーバーをupdateした場合
運用として、

* 全部updateする
* 来るべき時まで触らない

が考えられますが、さっさと上げてバグ取りした方が有意義な気がします。
というのも、いつの間にかバージョンが大きく変わって修正箇所が大量に！なんてことも考えられるからです。[^3]
サーバーの数が多ければ多いほど大変な作業になります。
**ウッカリupdate && upgradeが出来たから大丈夫、と思って運用を継続すると気付かないところにバグがあった、なんてことも。**
１サーバーずつupdate && upgradeして、運用に問題がない事を確認した方が安全です。

[^3]: 全然メンテされてない某バージョン管理サーバーのバージョンアップが恐ろしく大変だったのも、今となってはいい思い出

# 参考
https://orebibou.com/2015/04/ubuntu-server-14-04-ltsでaptサーバaptリポジトリミラーサーバを構築/
https://yosida95.com/2013/05/19/003744.html

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
Perlのbigint、自分の認識ミスについて

# 恥ずかしながらミスをしました！
Perlでの数値演算などは、OSのライブラリーに存じており、カーネルが32bitだと最大値は4,294,967,295です。
しかし、それを簡単に解決する方法が有ります！！
それが、bigintプラグマです！！
内部的にはMath::モジュールが使われて、Perl 5.8 からは標準機能です、これが32bitカーネルでも、精度を透過的に広げてくれるんです、やったねー！
# 不具合は静かに来る
ある時、連番がカウントアップしてない不具合に遭遇する。
なぜ？csvに出す時だけ、数値がカンストするの？
# 原因はprintf
簡単に言うと、bigintプラグマは32bitカーネルのときprintf は対象外！

```perl:sample1.pl
use bigint;
printf "%u¥n", 4294967295;
printf "%u¥n", 4294967296;
```
```text:結果1
4294967295
4294967295
```
これを正しく表示するなら以下のようにする。

```perl:sample2.pl
use Math::BigInt;
my $value = Math::BigInt->new( 4294967296 );
print $value->bstr(), "\n";
```
```text:結果2
4294967296
```
正しく表示されました！
なお、64bitカーネルならば、sample1.pl でも正しく表示されます。
え？今どき、32bitカーネルのサーバーがあるんかいな？とツッコまれそうですが、64bitカーネルに乗換える予定はあったのですが、その前に4,294,967,295を超えたんですよー！放置してたツケです！
それと、printfで出力するな、そのまま出力しろよ！とツッコミも有りますね、はい、全ては自分の認識ミスでございます。
ToolBarを超余裕で使う方法 Part1 文字を設定したり色を変えたりする

#今回の目標
- 文字をセットする
- 文字色を変える

#ToolBarに文字をセットする

1 .まずはレイアウトの上にToolBarを置きます。

```activity_main.xml

<android.support.v7.widget.Toolbar

android:id="@+id/toolbar" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentLeft="true" 
android:layout_alignParentStart="true" 
android:layout_alignParentTop="true" 
android:background="?attr/colorPrimary" 
android:minHeight="?attr/actionBarSize" 
android:theme="?attr/actionBarTheme"/> 
```
2.文字をセットする

```MainActivity.java
 @Override

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar=findViewById(R.id.toolbar); 
    toolbar.setTitle("セットしたい文字をここに入力します"); 
    setSupportActionBar(toolbar); 
    } 
```
 
括弧内のダブルコーテーションを外して [R.string.○○] とすることでString.xmlにある文字を呼び出すことも可能です。

### うまく行かないときは android.widget.toolbar をimportしている可能性があります!!!
その場合は android.support.v7.widget.Toolbar をimportしてみるか、最低対応androidバージョンをAPI21にしてみるといいかもしれません。

#ToolBarにセットした文字の色を変更する
さきほどは文字をセットしたわけですが、これからは色をセットします。

```MainActivity.java
 @Override

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar=findViewById(R.id.toolbar); 
    toolbar.setTitle("セットしたい文字をここに入力します"); 
    toolbar.setTitleTextColor(rgb(255,255,255));    
    setSupportActionBar(toolbar); 
    } 
```
HTMLcolorではなくRGBで指定することがコツです。上記では白ですがその他多くのカラーにセットできます。お好みなどに応じてセットしてみましょう。
[R.color.○○]　にすることでcolor.xmlから読み込むことができます。こうすればHTMLcolorが使えます。

#最後に
最初はToolBarってむずそうと思っていた方もかんたんだと思えたのではないでしょうか？
それではまたお会いしましょう！それでは!!!

[作者のGoogle+](https://plus.google.com/u/1/+HamaDroid)
[作者のTwitter](https://twitter.com/hamachi_geek)
PlayFramework 2.6 入門

【前回振り返り】
前回の記事は以下、今回は課題（？）についてのアクションをして行こうと思います。
https://qiita.com/lunalice/items/26a1690101172f70eda7

先人の知恵を借りてPlayFramework2.6の環境構築が完了したので、
今回は足りない知識のキャッチアップを行う。

前回悟ったが先人の知恵を借りてコード読み取って動作を確認して・・・となると学習スピードが鈍足だと感じたので今回使用したのは以下参考書。

【参考書】
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4798133922/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798133922&linkCode=as2&tag=lunalice04-22&linkId=cf3b1b3bdf7d1e348e8bbb550ea149b3">Play Framework 2徹底入門 JavaではじめるアジャイルWeb開発</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=lunalice04-22&l=am2&o=9&a=4798133922" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

この手の参考書ってバージョン上がると全く使い物にならなかったりするので、
初版が2013年ってちょっとやばいかもと思いつつ手にとったが全くそんな事はなく、ためになる内容でしたので凄くお勧めします。

そんな中で前回やった事は無駄ではなく、ギャップをあげるとするなら初期SBTをダウンロードしてplayseedを展開して・・・という内容がplayをインストールしてplay runして・・・という所以外は今の所感じてないです。

ちなみに前回やった所は以下リンクを参考にすれば私の記事よりわかりやすいので是非参考までに（英語出来ない方は翻訳すれば読める内容になってます。
https://www.playframework.com/documentation/2.6.x/Installing

【本題に入る前に】
Qiitaをやってバシバシ情報発信してる方的には今更な感じですが、
MVCアーキテクトを知ってますか？

といっても私も書籍とかでチラッと見たり詳しいわけではないので概念だけで言うとWEB開発のベースとなっている（と思っている）開発手法の一つで、他に派生してMVPとかMVVMとか派生とかじゃなくて別の手法とかあると思いますが今の私の中にあるのがMVCなのでこちら主体でまとめます。

MVCって何の略？と言われると以下になります。

Model
View
Controller

WEBアプリにおけるそれぞれに役割を決める事で作業分担と頭の中を整理して効率よく開発出来るねって簡潔に思ってます。その為いろんな手法が出てきてるんですねきっと。

ModelはWEBアプリにおいてメインロジックを操作する役割になってます。
DB周りのCRUD（クアッド）とかをメインに扱ったりします。

Viewは今見てる画面そのものです。前回のWEBアプリを作成した時はJSPが担当していた部分となります。

Controllerは画面遷移の操作を行います。Viewからフォームデータを受け取って入力データを判定しエラー画面返したり、正常画面を出力したりします。前回のWEBアプリではサーブレットが担当していた部分になります。

なぜ行き成りMVCの話になったかというと、JSPやサーブレットを使用してないが、PlayFrameworkはMVCアークテクトという手法で開発が行われるフレームワークだからです。（やっと言えた・・・

【本題】
本題といいつつまだまだですが、以下前回生成した環境をtreeして一部削ったものです。
├─app
│  ├─controllers
│  └─views
├─conf
├─gradle
│  └─wrapper
├─logs
├─project
├─public
│  ├─images
│  ├─javascripts
│  └─stylesheets
├─target
└─test
    └─controllers

先ほどのMVCの解説からなんとなく察せると思いますが、appフォルダ配下にjavaって行く事をPlayFrameworkで開発するといって差し支えないでしょう。ちなみにModelは初期ないのでappにフォルダ切って投入して行くつもりです。

もう一つPlayFrameworkで弄らないといけないファイルがあり、それはconfフォルダにあるroutesファイル（＋application.conf）です。

GET     /                           controllers.HomeController.index
GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

中を見て見ると何か見覚えがありますね？
サーブレットJSPの時やったGET、POSTのリクエスト定義みたいなもので上記フォルダに格納されてるjavaのindexメソッドを呼ぶ。って感じになってます。

依存関係を上げると
routes⇒controller（メソッド）⇒view（コントローラーから値受け表示）
こんな感じModelはcontrollerがnewしたりメソッド使ったりという流れ。

今回はものを作ってないのでここまで。
（本当はscalaとjavaのギャップを書き書きしたかったが・・・

【後書き】
平日はpaizaとかでスキルチェック（軽いの
土でスキルチェック（重いの
日で本読みつつ開発してQiitaアウトプットってそこそこ大変。
何が一番大変って買った参考書為になるけど500ページくらいあってまだ読みきれてなく作っていこうってなってない所（だから開発記事になってないんだけども
これからやっていこうと思った方がいたなら、入門書として読むなら薄ければ薄い方がいいと思う。例えばないと思うけどJAVAやりたい！⇒黒本ズドンとかだと面白みがなさ過ぎて飽きちゃうと思うんですよね。それでもいけるっていう方もいるかもしれませんが人生モチベーションが全てなのでとりあえず薄い本がーって読む（＋やって見る）もう少し詳しくなりたいなら分厚い本読むとか多分こんな流れがいいと思う。
私はとりあえずpaizaでスキルAになるまでこんな感じで進めようと思います。平日A問題やると嵌ると時間が消し飛びそうなので休日使わないとあかん・・・
rubocopのエラー(offense)が多い順にソートするには

# rubocopのエラー(offense)が多い順にソートするには

こういうことをやりたい：

```ruby
# rule to counter
{"Layout/SpaceInsideHashLiteralBraces"=>289,
 "Layout/SpaceBeforeBlockBraces"=>79,
 "Style/RedundantSelf"=>36,
 "Layout/DotPosition"=>31,
 "Style/TrailingCommaInLiteral"=>30,
 "Style/BracesAroundHashParameters"=>29,
 "Layout/SpaceAroundOperators"=>19,
 "Layout/EmptyLinesAroundClassBody"=>16,
 "Lint/UselessAssignment"=>16,
 "Style/GuardClause"=>14,
 "Style/AndOr"=>13,
 "Style/IfUnlessModifier"=>11,
 "Rails/Date"=>10,
 "Layout/SpaceInsideParens"=>7,
 "Layout/AlignParameters"=>7,
 "Metrics/PerceivedComplexity"=>7,
 "Rails/TimeZone"=>5,
..
}
```

## code

こんな感じにする：

```ruby
require 'rubocop'

def count_offences(paths = [])
  runner = RuboCop::Runner.new({}, RuboCop::ConfigStore.new)
  files = runner.send(:find_target_files, paths)
  files_offences = files.map {|file| runner.send(:file_offenses, file)}

  counter = {}
  files_offences.each do |file_offences|
    file_offences.group_by(&:cop_name).each do |cop_name, arr|
      counter[cop_name] ||= 0
      counter[cop_name] += arr.size
    end
  end
  counter
end
```

`count_offences.sort_by { | k,v | -v}.to_h`とすれば、上記の結果のように降順に並べることができる。

## ちょっと解説

どうやら、~~CLIのほうでは昇順降順にできないみたい~~。(`--auto-gen-config`つけてもちろんダメです。)そこで、スクリプトを書いて対処しよう。

追記）実は出来ました。コメント参考に。

http://www.rubydoc.info/gems/rubocop/RuboCop/CLI#run-instance_method に`RuboCop::CLI#run`がエントリーポイントであることが書いてるので、コードをちょっと追って行くと、

https://github.com/bbatsov/rubocop/blob/v0.53.0/lib/rubocop/cli.rb#L152-L156

にぶち当たる。`runner.run(paths)`が実体なので、https://github.com/bbatsov/rubocop/blob/v0.53.0/spec/rubocop/runner_spec.rb#L20　
とか参考にしつつ、上のコードを書けば良い。`find_target_files`や`file_offenses`はprivate methodなので、`Object#send`を使えばこれらを呼び出せる。

上記のコードの`arr`の要素の中身は[`RuboCop::Cop::Offense`](http://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Offense)クラスで、こんな感じになっている：

```ruby
#<RuboCop::Cop::Offense:0x007fa0e28009c8
 @cop_name="Lint/UnusedBlockArgument",
 @location=
  #<Parser::Source::Range /Users/kenta.nakajima/Documents/rails/test.rb 503...504>,
 @message=
  "Lint/UnusedBlockArgument: Unused block argument - `k`. If it's necessary, use `_` or `_k` as an argument name to indicate that it won't be used.",
 @severity=#<RuboCop::Cop::Severity:0x007fa0e2800950 @name=:warning>,
 @status=:uncorrected>
```

今回はルールを取り出したかったので、`cop_name`で所要の結果が得られたわけだ。
Swift5で実装予定のOwnershipオーナーシップとは




##メリット
メモリ管理をより高度に制御可能

以下が一部の機能

###読み取り専用
引数をコピーしないで読み取り専用にすることができる。

####サンプル
値をコピーしてその値を破棄するときに型のサイズに対してメモリの使用量が増えてしまうが、その無駄なコピーを減らしてメモリを管理することによって効率的に管理できるようになる。

読み取り専用 shared参照のサンプル
Swiftの場合sharedを追加


```
func hoge(fuga: shared Int)
```

これで引数fugaがさらに素早く値の引渡しができ読み取り専用になる。


###独占権の法則(Law Of Exclusivity)
同時にアクセスできないようにする



##逆にデメリットは？
一方、ownershipの登場によりさらに理解することが増えてしまうというデメリットもあるが（自分もよくわからん・・・）、
swift5で使われる場合にはowner shipを使わなくても良い（Rustでは必須）



参考
https://gist.github.com/Gankro/1f79fbf2a9776302a9d4c8c0097cc40e
https://www.infoq.com/jp/news/2017/04/swift-memory-ownership-model
pythonの一列に複数の値が入力され、それらを取得する方法


一列に

123 789

という値が入力され、

これを

x=123
y=789

で取得したいとき

```
x, y = input().split()
#x=123 y=789
```

で簡単に取得可能！！

僕的には新発見でした（笑）

どのような原理なのかは、コメント欄のshiracamusさんのコメントをご参照下さい！

LouiS0616さんより、整数ならばキャストした方が使いやすいというご意見を！
こちらに載せさせて頂きます！

x, y = map(int, input().split())
123 456
x, type(x)
(123, #class 'int')
y, type(y)
(456, #class 'int')


>引用
https://teratail.com/questions/66859
ActiveJob の queue_adapter は config/initializers/*.rb で登録してはいけない

ActiveJob の設定に関する雑なメモ。

ActiveJob を使う際に`queue_adapter`を以下のような感じで設定してしまうと、production環境であるにも関わらずアダプターが`:async`になってしまう場合がある。(なぜか上手くいく場合もあるので厄介)

```Ruby:config/initializers/sidekiq.rb
case Rails.env
when 'production'
  Rails.application.config.active_job.queue_adapter = :sidekiq
else
  Rails.application.config.active_job.queue_adapter = :async
end
```

理由は以下の記事が詳しいが、

- [Rails.application.config を config/initializers/*.rb で書き換えても反映されないケース](https://qiita.com/labocho/items/9ca9185cf82b824c8308)

簡単に説明すると、Railsの初期化時に`Railtie#initializer`が`config/initializers/*.rb`よりも先に走ってしまうことで、`queue_adapter`が設定されていない場合のデフォルトである`:async` (Rails4.xであれば`:inline`) が設定されてしまう、ということみたい。

環境ごとに書き換えたいなら`config/environments/*.rb`に書こう。(ちゃんとコメントが書いてある。)

```Ruby
# Use a real queuing backend for Active Job (and separate queues per environment)
# config.active_job.queue_adapter     = :resque
# config.active_job.queue_name_prefix = "application_#{Rails.env}"
```
zeppelin-solidityのcrowdsale

# crowdsaleを試してみる
[zeppelin-solidity](https://github.com/OpenZeppelin/zeppelin-solidity)にcrowdsaleというのがある。
ICOで使われるものだけど、これを使えばほんの10数行のSolidityコードだけで何とかなるというもの。

```minaToken.sol
pragma solidity ^0.4.18;

import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";

contract minaToken is MintableToken , BurnableToken{
    string public constant name = "minaToken";
    string public constant symbol = "MNTK";
    uint8 public constant decimals = 18;
}
```

```minaCrowdsale.sol
pragma solidity ^0.4.18;

import "zeppelin-solidity/contracts/crowdsale/CappedCrowdsale.sol";
import "zeppelin-solidity/contracts/crowdsale/RefundableCrowdsale.sol";
import "./minaToken.sol";

contract minaCrowdsale is CappedCrowdsale, RefundableCrowdsale {
    function minaCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet) public
    CappedCrowdsale(_cap)
    FinalizableCrowdsale()
    RefundableCrowdsale(_goal)
    Crowdsale(_startTime, _endTime, _rate, _wallet)
    {
        require(_goal <= _cap);
    }
    function createTokenContract() internal returns (MintableToken) {
        return new minaToken();
    }
}
```

```2_deploy_crowdsale.js
var Crowdsale = artifacts.require("./minaCrowdsale.sol");

module.exports = function(deployer, network, accounts) {

    const startTime = web3.eth.getBlock(web3.eth.blockNumber).timestamp + 86400;
    const endTime = startTime + 1814400;
    const rate = new web3.BigNumber(10);
    const goal = web3.toWei(100, 'ether');
    const cap = web3.toWei(1000 , 'ether');
    const wallet = accounts[0];

    deployer.deploy(Crowdsale, startTime, endTime, rate, goal, cap, wallet);
};
```

だいたいこれだけで基本的なcrowdsaleが行える。ここのコードの内容は、ほぼzeppelin-solidityのexsampleを使ったです。
ライブラリの方にはmigrateファイルがないのでこれ自体は他の方のBlogを参考にしたです。今この記事を書いてる時点でどこの方のを参考にしたのかがちょっと覚えてないで・・・すみません、割愛させてください。

# 何が問題かというと・・・
これで十分にデプロイできるのですが、ちょっと問題がありまして・・・。
Gas消費が570万程かかるので、Ropstenにデプロイ出来ない、ということなんですよね。

RopstenのGasLimitが470万程。大幅に足りないのと、Zeppelin-solidityのライブラリをそのまま使っているので、削るのも削れない。
ただ、SlackコミュニティのHi-Etherのところで質問させて頂いた所、GasLimitが470万でうまくいけてる方もいらっしゃるようでして。

調べたり試さなきゃいけないことも、また出てくるという話。
常に最新のPowerShellを配布して実行させるたった1つのシンプルな解

# 状況

社内LANの共有フォルダにps1ファイルを配置する。
利用者には常にこの最新のスクリプトを利用させたい。

**しかしファイルの署名はできない。**

# 前提条件

* ps1ファイルはバッチから実行する。
* 実行権限は `RemoteSigned`
* `makecert.exe` は使えない。＝署名はできない。

# とりあえず解

```runPS.bat
@echo off
copy /Y "\\192.168.0.100\scripts\myscript.ps1" "tmpscript.ps1"
powershell -ExecutionPolicy RemoteSigned -File ".\tmpscript.ps1"
del /q "tmpscript.ps1"
```

# 解説

コピーしてきて実行して削除する。
以上。

いろいろ悩みましたがこれが一番シンプルで確実でした。
保存先をテンポラリフォルダにするなど工夫の余地はありますが、業務で使用するのはこのレベルで充分です。

ちなみに、`-ExecutionPolicy` を `Unrestricted` にしても一応実行できますが、確認ダイアログが表示されるのはピンからキリまでのユーザーに配布する上でナンセンスであるとして行っていません。

# 参考記事

## powershellを楽に実行してもらうための非常に参考になる記事

Powershellを楽に実行してもらうには
https://qiita.com/tomoko523/items/df8e384d32a377381ef9

## 本来こうあるべきという物の例
PowerShell のスクリプトに署名を付与する方法
http://fnya.cocolog-nifty.com/blog/2017/01/powershell-6c78.html
pythonでdictionaryを扱う

pythonでdictionaryを扱うとき、追加や削除、検索など様々な方法があります。
今回は僕が学んだ追加・検索機能についてまとめました！

##dictionaryの追加機能
dictionaryの追加機能は二通りあります。（以下サイトから引用）

(1)イコールで追加する方法

```
mydict = {"apple":1, "orange":2, "banana":3}
mydict["peach"] = 4
print(mydict) 

#{"apple":1, "orange":2, "banana":3, "peach":4}
```

mydict={}で空のdictionaryを作成して、for文でどんどん追加していくこともできます。
また、xとyを変数として
 
 
```
def dic(x,y):
   　　 mydict[x]=y
```
 
 
という関数も作成できました。

(2)setdefaultメソッドを使って追加する方法

```
mydict = {"apple":1, "orange":2, "banana":3}
mydict.setdefault("peach", 4)
print(mydict)

#{"apple":1, "orange":2, "banana":3, "peach":4}
```

##dictionaryの検索機能
こちらもサイトから引用。

```
mydict = {"apple":1, "orange":2, "banana":3}
print("orange" in mydict.keys())
```

結果は

```
True
```

で返ってきました。

もちろん、検索して存在しない場合は、Falseで返ってきます。

＊＊
shiracamusさんより、こちらでも同様の結果が得られるようです！


```
mydict = {"apple":1, "orange":2, "banana":3}
print("orange" in mydict)
#True
```

 


if文で、あった場合、無かった場合で挙動をつけたい場合は、当たり前ですが、

```
if (key in mydict.keys())==True:
または
if (key in mydict.keys())==False:
```

で上手く作動します。

＊＊
こちらもshiracamusさんより

以下引用

これはお勧めできない書き方です。
こう書きましょう。

```
if key in mydict.keys():
または
if key in mydict.keys():
```

参考： PEP8: Python コードのスタイルガイド

ブール型の値と True や False を比較するのに == を使うのはやめましょう。:
良い:       if greeting:
悪い:       if greeting == True:
もっと悪い: if greeting is True:


他の方法もたくさんあると思うので、ご存知の方は是非コメントよろしくお願いします！


 
 
>#引用
https://www.sejuku.net/blog/24122#i-6
本当にあった color: -internal-quirk-inherit;

## 顛末

冬のオフィスで一人HTMLをコーディングているときでしたよ。
フロー状態に入っていたんでしょうね。気づけば窓の外は `#000` みたいに真っ暗闇。

ふと気づくとSlackの新着メッセージを知らせるバッジがおもむろにピカーッと、柘榴色`#ff4537`に光ってるんですね。

そのメッセージで…仮にAさんとしておきましょうか。開発者のAさんが「ステージング環境の`table`要素にどうしても`color`プロパティが当たらない」って妙なことを言うんです。

でもね、タスクランナーもLintツールもエラーの一つも吐かないし、CDNから読み込んでるCSSもない。なんかおかしいなーと思っているともう一度Aさんからメッセージが来るんです。「助けてくれー」って。

背筋にゾクッと冷たいものを感じながらも、あたしはなぜかデベロッパーツールを開ける気になっちゃいましてね。

嫌だなー怖いなーって思いながらマウスをカツーーーーンとクリックしてキーボードをカタカタカタカタ、カタカタカタカタ……デベロッパーツールの隅っこをよーく見たら、 薄ーい灰色の背景色に真っ赤な文字で
`table {color: -internal-quirk-inherit;}`なんて見覚えのないスタイル指定があった。こいつが文字色を新月の夜みたいな `#000` に変えちゃっていた。

![スクリーンショット 2018-03-12 18.47.01.png](https://qiita-image-store.s3.amazonaws.com/0/119598/3a9c2bdf-7a39-4aed-3f49-c883bb4e091d.png)

でもそんなスタイル指定を自分で書いた覚えがないし変だなー、「色が内部からねじれて引き継がれる」って何だろうおかしいなーおかしいなーって小一時間ハマっているとうぅ、ううぅ、ううぅ……汗が、わーっと、噴き出てくる。
うーんうーんと悩んでいたその時…ふっと予感がよぎった。

念のため確認しておこうとおそるおそるHTMLの1行目を見たら…

***「え？何かいる」***

<img width="212" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/119598/efe9723c-b981-f88d-7f2a-9f12902290a4.png">

HTML5の `<!DOCTYPE html>` 宣言の手前に何か文字が入っているとtable要素の文字色が `color: -internal-quirk-inherit;` になってしまう、そんなことが本当にあるんですね。
それじゃまた。

##　知見

<blockquote>
DOCTYPEは、htmlファイルの最初の行に存在する必要がある。その前に何か他のものがあれば（たとえそれが空白行であっても）、一部のブラウザはDOCTYPEが存在しないものとしてそのページを取り扱う。DOCTYPEがない場合、ブラウザはページを後方互換モードで表示する。これは非常に検出が難しいエラーだ。通常は、HTMLは余分な空白文字があっても問題ないために見過ごされがちだが、この場合に限って言えば非常に重要なのだ。
<br>
<cite> <a href="https://www.oreilly.co.jp/books/9784873114828/">『入門HTML5』</a> p.37</cite>
</blockquote>
Google Colaboratoryでお手軽Deep learning

会社で支給されたノートPCではDeep LearningのDの字も実現できず、セキュリティがきつすぎてsshで外に出ることも出来ず、困り果てたときに出会ったGoogle ColaboratoryについてGoogleへの感謝と備忘録を兼ねて。

# Google Driveのマウント
[参照]
https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935

# 必要なパッケージ(keras)の導入とか
Colaboratory環境だとkerasのバックエンドはデフォルトでtensorflowになるようです。
***GPUを利用したランタイムを使用する際、注意事項として、絶対にtensorflowやtensorflow-gpuをpipでupgradeしないこと！***
なぜかupgradeするとGPUがtensorflowから認識できなくなります。これで3日ほど無駄にしました。

```
!pip install -q keras
import keras
!apt-get -qq install -y graphviz && pip install -q pydot
```

# GPUを使えるか確認
[ランタイム]-[ランタイムのタイプを変更]で[ハードウェアアクセラレータ]をGPUにセット。pythonは2でも3でもOK

```python 
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```
うまく認識できてれば以下のようになります。

```
[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 4218635468701404478, name: "/device:GPU:0"
 device_type: "GPU"
 memory_limit: 11297803469
 locality {
   bus_id: 1
 }
 incarnation: 11094235734753279240
 physical_device_desc: "device: 0, name: Tesla K80, pci bus id: 0000:00:04.0, compute capability: 3.7"]
```

# Qausi-recurrent Neural Networks(QRNN)のモデルをセーブして読み込むときの注意
QRNNはLSTMにとって変わるとか変わらないとか言われているモデルだそうです。
詳しくはこちらで、詳しく解説されておりますので割愛
https://qiita.com/icoxfog417/items/d77912e10a7c60ae680e

kerasでの実装もあって、以下から取得できます。
https://github.com/DingKe/qrnn
この中のQRNNクラスをまるっとコピーすれば良いのですが、モデルをセーブして読み込む際に通常通り

```python
model.save("hoge.h5")
new_model = load_model("hoge.h5",{"QRNN",QRNN})
```

みたいにすると、うまく動きません。いろいろ調べると、重みデータしかセーブされていないようなので以下のように、モデルの骨組みを作る関数を噛ませて、重みを読み込むようにしてやるといけます。

```python
def createQRNNModel():
  in_out_neurons = 1
  hidden_neurons = 256
  model = Sequential() 
  model.add(QRNN(hidden_neurons, batch_input_shape=(None,LENGTH_OF_SEQUENCES,1),window_size=LENGTH_OF_SEQUENCES))
  model.add(Dense(units=in_out_neurons))
  model.add(Activation("linear"))  
  return model

# モデル作成
model = createQRNNModel()
model.compile(loss="mean_squared_error", optimizer="adam",metrics=['accuracy'])
early_stopping = EarlyStopping(monitor="acc", mode="auto",patience=0)
# モデル学習 
model.fit(X_train,y_train, batch_size=LENGTH_OF_SEQUENCES, epochs=30, callbacks=[early_stopping])
# モデル保存 
model.save(model_outfilename+".h5")

# モデル読み込み
loadmodel = createQRNNModel()
loadmodel.load_weights(model_infilename+".h5")
```

もしかするとこのQRNN以外でも自作のレイヤーを含む場合はこのやり方が安全かもしれません。

# なぜかうまく動かなくなったら(強制リセット)
自分の場合Googleドライブのマウントでなぜかファイルが見えず、Googleドライブ側からGoogleSDKの接続を強制的にきったりしたら、その後マウントできなくなる症状が発生。にっちもさっちもいかなくなったときに、ランタイムを初期状態に以下の方法で戻しました。

```
!kill -9 -1
```

90分アクティブでなければ勝手にリセットされますが、そんなに待ってられないときは上記方法でリセットできます。パッケージ類やら設定は最初からやり直してください。

# あとがき
現状自分がハマった部分の解決方法を記載しました。それ以外の部分は多くの先人が記載されていますのでリンクの記載にとどめてます。なにかまたハマって解決できたら追記します。
ドキュメント > 用語を統一しよう


### 例 > 用語不統一なドキュメント

GeForce GTX 1070を使ったTensorFlowによるDeep Learningが注目を集めている。

このGPUを使った機械学習の処理により、CPUを使った場合の処理よりも同じ時間で大量のデータを学習することができるようになった。

Graphical Processing UnitのStreaming Processingにより、大量の画像を深層学習(識別処理)に使うことができるようになったおかげで、Deep Learningの発展があると言っても過言ではないだろう。

GTX-1070はAnalog Discovery 2およそ2台分の価格でありながら、Machine Learningの計算速度は対象処理によっては数十倍の効果を発揮する。

GeForce 1070は最近ではノートPCにも搭載されつつあり、ユーザが気軽に機械学習の計算を実施する環境が整いつつある。
また、1070を外付けで接続して、ノートPCのDLの処理を高速化する装置も開発、販売されている。

### 用語を統一しよう

- GeForce GTX 1070 << こちらを使う
    - GTX-1070 :: 間違い
    - GeForce 1070 :: 間違い
    - 1070 :: 間違い
- GPU << こちらか以下のいずれかを使う
    - Graphical Processing Unit
- 機械学習 << いずれかの用語に統一しよう
    - Deep Learning
    - 深層学習
    - Machine Learning
    - DL

用語を統一しないと文章の可読性は下がってしまう。長い文章になるとその影響は顕著になる。

ソースコードでも同じだろう。１つの用途の変数名が各場所で不統一な名前を持つと、ソースを読む人にとっては「別のもの」として認識してしまうかもしれない。

気を付けたい事項である。

なお、Qiitaの記事において間違った用語が使われている場合、編集リクエストという機能で修正を提案されることは、エンジニアにとって良い環境を生むでしょう。
良いエンジニアはその編集リクエストに謙虚に対応すると思われる。
Eclipse JAX-RS(Jersey) + Guice アーキタイプを使用した新規作成

#概要
JerseyとGuiceを使ったAPIを新規に作成するメモ。
MITライセンスのMavenアーキタイプを使用します。

#Eclipse設定
ウィンドウ->設定->Maven->アーキタイプ
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/92451/2e85e174-4f83-6750-972d-5eb7391af928.png)

リモートカタログの追加から
[http://repo1.maven.org/maven2/archetype-catalog.xml](http://repo1.maven.org/maven2/archetype-catalog.xml)を入力
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/92451/0e169d5c-5337-857a-7753-0d966c4ed238.png)

#プロジェクト作成
Mavenプロジェクトを選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92451/f7967728-dc30-0d80-9393-6b661215c20d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/92451/0f37e08f-3c99-57e0-833a-0cc8d04eeea4.png)

java8-jersey2-guice4-webapp-archetype([Maven Repository](https://mvnrepository.com/artifact/me.thingle.archetypes/java8-jersey2-guice4-webapp-archetype/1.1.0))を選択する。
MITライセンスです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/92451/63cde804-fc9f-c560-5776-820d6b7dd9b6.png)

あとは、自身のプロジェクトの情報を入力して完了。

サーバーにtomcat8を追加して、プロジェクト右クリック->デバッグ、もしくは実行を選択する。

http://localhost:8080/プロジェクト名/app/error
http://localhost:8080/プロジェクト名/app/hello/任意
で動きを確認できます。
Azure Functions で Get の引数を受け取る

引数のない場合の例はこちら
[Azure Functions の使い方](https://qiita.com/ekzemplaro/items/acd91a11906ea1075c37)

```js:index.js
module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a query.')
    console.log ("*** start ***\n")
    var str_out = ""
    str_out += "*** start ***\n"
    if (req.query.user ) {
        str_out += "こんにちは\n"
        str_out += "user = " + req.query.user + "\n"
        if (req.query.password){
            str_out += "password = " + req.query.password + "\n"
        }

    str_out += "*** end ***\n"
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: str_out 
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string"
        };
    }
    context.done();
};
```

Curl でテストするコマンド

```bash:exec_get.sh
curl https://ekzemplaro02.azurewebsites.net/api/HttpTriggerJS1?code=ABCDE123jLn3NFT6UPpR4HlV8mTHo3xutth*******************==\&user="jiro"\&password="123456"
```

実行結果

```text
$ ./exec_get.sh 
*** start ***
こんにちは
user = jiro
password = 123456
*** end ***
```
url の title を素早く調べる方法

# そもそも

html の `<title>` をコピーしたいことが結構あります。
できれば、いつも開いているコンソールからできれば便利ですよね。

# コマンド

```bash
echo $(curl -L 8122.jp 2> /dev/null | xmllint --xpath "//title/text()" --html - 2> /dev/null)
```

不要な箇所があるように見えるけど、改行のため仕方なかった。

## もう少しまともにする

以下を定義しておくと、 `html_title 8122.jp` を実行すると `<title>` が取れる。

```bash
function html_title() { echo $(curl -L $1 2> /dev/null | xmllint --xpath "//title/text()" --html - 2> /dev/null); }
```

### 実行例

```bash
$ html_title 8122.jp
はいチーズ！スクールフォト・イベントフォトの撮影とネット販売
$ html_title google.com
Google
```
これで使いやすくなった。
ショップサーブ > フリーページにYoutube動画を埋め込むとプレビュー機能が停止してしまう件

# Youtube動画を埋め込むとプレビュー機能が動作せず、下記のエラーが出る
　「【このページは動作していません】このページで通常と異なるコードを検出したため、個人情報（例: パスワード、電話番号、クレジット カード番号）を保護するために、ページをブロックしました。」
# マニュアルではYoutube動画の読み込みは推奨されているよ
https://help.shopserve.jp/faq/faq.php?f=434&c=151
が、見本のタグがembedタグ…？
# Youtubeの仕様変更に対応しきれていない？
2015年にYoutubeではembedタグを使用した埋め込み（Flash APIを使った読み込み）を廃止し、iframeタグを使用したHTML5での読み込みを推奨するよう、仕様を変更した。
https://av.watch.impress.co.jp/docs/news/685855.html
が、恐らくショップサーブはその変更に対応しきれてない。
# 結論
プレビュー機能が動作しないだけで、更新はできる。
けれど機能が1つ使えなくなるとそれだけで不便感を強く感じる…なんとかならないかな。
pathの通し方

どのディレクトリでもコマンドが使えるようにパスを通す
#　~/.bash_profileに記述する
```
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
```
*例はnode.jsの場合のパスの通し方

#　再読み込みさせる
```
source ~/.bash_profile
```

sourceで再読み込みしないと使えないから再読み込み
MacでPython開発環境を構築する

# Python 環境
Pythonをインストールしたいけど使用しているツールがPython2系を要求したりPython3系を要求したり環境をローカル端末で構築すると厄介です。

そこで、pyenv + venv + direnv でディレクトリ(プロジェクト)毎にPythonのバージョンを指定する。

また、 requirements.txtを使用して"pip install -r  requirements.txt"とするとディレクトリ単位でパッケージ管理も可能。

## Mac編

### 1. pyenv
・インストール

```
$ brew install pyenv
```

・環境変数

```
$ vi ${HOME}/.zshrc
export PYENV_ROOT="${HOME}/.pyenv"
eval "$(pyenv init -)"
```

### 2. venv

```
$ python3 -m venv <project dir>
```

### 3. direnv
・インストール

```
$ wget https://github.com/direnv/direnv/releases/download/v2.12.2/direnv.darwin-amd64
$ mv direnv.darwin-amd64 /usr/local/bin/direnv
$ chmod 755 /usr/local/bin/direnv
```

・設定

```
$ echo ‘eval "$(direnv hook zsh)"’ >> ~/.zshrc
```

次回インストールしたこれらのツールの使い方を説明します。
Azure上のWindowsServer2016で、VDIサーバを構築する（更新中）

# 実施すること
Azure上に仮想デスクトップコレクションを展開して、RDS経由でWindows10にログインする。

# 1.Azureリソース
## 1.初期デプロイ
jsonを使ってデプロイする
**やること**
・リソースグループの作成
・仮想ネットワークの作成
・ストレージアカウントの作成

以下はjsonファイル

```xxx.json
ｘｘｘ
```

## 2.HVサーバのデプロイ
ポータルからポチポチ作成する

以下はjsonファイル

```xxx.json
ｘｘｘ
```

## 3.DNS名の登録
RDPが楽になるので、pipにDNS名を登録しておく

# 2.HVサーバの構築
## 1.Networkの信頼
Networkを信頼する

## 2.日本語化
以下のURLを参考に、日本語化を実施する
https://kogelog.com/2016/10/18/20161018-01/

Powershellで実行するのが良い。

## 3.WindowsUpdate
下記を参考に、Powershellで実行する。
[Windows Server 2012 / 2012 R2 の Windows Update による定期的なパッチ適用のメモ](https://blog.engineer-memo.com/2015/07/27/windows-server-2012-2012-r2-%E3%81%AE-windows-update-%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9A%E6%9C%9F%E7%9A%84%E3%81%AA%E3%83%91%E3%83%83%E3%83%81%E9%81%A9%E7%94%A8%E3%81%AE%E3%83%A1%E3%83%A2/)

## 4.ドメイン参加
今回は既に存在するADへ参加する

## 5.Hyper-Vの役割インストール

```Install-HV.ps1
Install-WindowsFeature -Name hyper-v, failover-clustering,Multipath-IO -IncludeManagementTools
```

## 6.仮想スイッチの作成
```make_vSwitch.ps1
$SwitchName = "vSwitch01"
$AdapterName = "vEthernet ($SwitchName)"
$NAT_Gateway_IP ="192.168.10.1"
$NAT_Subnet_Prefix_Length ="24"
$NATOutsideName = "vNat01"
$NAT_subnet_prefix = "192.168.10.0/24"
New-VMSwitch -SwitchName $SwitchName -SwitchType Internal
$NewAdapter = Get-NetAdapter -Name  $AdapterName
$ifIndex = $NewAdapter.ifindex
New-NetIPAddress -IPAddress $NAT_Gateway_IP -PrefixLength $NAT_Subnet_Prefix_Length -InterfaceIndex $ifIndex
New-NetNat -Name $NATOutsideName -InternalIPInterfaceAddressPrefix $NAT_subnet_prefix
```

## 7.Windows10VMの作成

# 3.RDサーバの構築
## 8.コレクションの作成

Disk拡張
http://blog.yottun8.com/archives/594

バグ
https://satsumahomeserver.com/blog/3617
16進数カラーコードから補色を算出する

## 補色 とは

[補色 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%A3%9C%E8%89%B2)

> 補色（ほしょく、英: complementary color）とは、色相環 (color circle) で正反対に位置する関係の色の組合せ。相補的な色のことでもある。

## 要件

+ 手元にあるデータはカラーコードのみ。
	- 数百件ほど。
+ 全部の補色カラーコードを求める。

## 計算方法

参考にさせていただいたのは、[反転色と補色を求める。](http://www.wave440.com/php/iro.php)で紹介されたAdobeの[カラーの反転色または補色への変更](https://help.adobe.com/ja_JP/Illustrator/14.0/WS714a382cdf7d304e7e07d0100196cbc5f-6288a.html)という所。

> カラーの各構成要素を、選択したカラーの最大の RGB 値と最小の RGB 値の合計を元にして、新しい値に変更します。現在のカラーの RGB 値のうち最大と最小の値が合計され、その値から各構成要素の値を引いて、新しい RGB 値が生成されます。例えば、RGB 値がレッド 102、グリーン 153、ブルー 51 であるカラーを選択したとします。この場合、まず最大値である 153 と最小値である 51 を合計して 204 という値が算出されます。この値から既存のカラーの RGB 値がそれぞれ差し引かれます。つまり、新しいレッドの値は 204 - 102（現在のレッドの値）= 102、グリーンの値は 204 - 153（現在のグリーンの値）= 51、ブルーの値は 204 - 51（現在のブルーの値）= 153 となり、新しい補色の RGB 値が生成されます。

この内容をPHPで書いたものがこちら。

```php
// RGB値が、レッド102、グリーン153、ブルー51
$r = 102;
$g = 153;
$b = 51;

// 最大値である153と最小値である51を合計して204という値が算出される
$buf = max($r, $g, $b) + min($r, $g, $b);

// 上の値から既存のカラーのRGB値がそれぞれ差し引かれる
echo $buf - $r;	// 102
echo $buf - $g;	// 51
echo $buf - $b;	// 153
```

## まとめて処理するために
関数にしてしまう。カラーコードを渡せば補色が返ってくる。

```php
// $code = getComplementary("#F1E2D3");
function getComplementary($masterCode) {
	// 頭に#が付いたり付いてなかったりするので、無くす方向で統一
	$masterCode = str_replace("#", "", $masterCode);

	// 2文字ずつ取得(substr)し、16進数から10進数へ(hexdec)
	$r = hexdec(substr($masterCode, 0, 2));
	$g = hexdec(substr($masterCode, 2, 2));
	$b = hexdec(substr($masterCode, 4, 2));

	// 最大値と最小値の和を算出
	$buf = max($r, $g, $b) + min($r, $g, $b);

	// 補色のRGB値を計算し、16進数に変換(dechex)
	$cr = dechex($buf - $r);
	$cg = dechex($buf - $g);
	$cb = dechex($buf - $b);

	// 桁を揃えて結合
	return sprintf("%02d", $cr) . sprintf("%02d", $cg) . sprintf("%02d", $cb);
}
```
ncftpgetでのエラー時の対応

ncftpを使った際のエラーの対応方法
`Could not traverse directory: could not parse extended file or directory information.
ncftpget: bad parameter given to library.`

エラー内容は、
接続先で空ディレクトリがあったため、再帰的検索できないため、エラー。

対応方法は、
空ディレクトリを削除かなにかダミーのファイルを入れる
統合開発運用環境4Dのメリット・デメリット

5年ほど触って、そろそろ一旦お別れの予定なので、忘れないように書いておきます。
# 4Dとはなんぞや

4Dって、皆様ご存知でしょうか。4次元ポケットでも、CINEMA 4Dでもなく、知る人ぞ知る統合開発運用環境4Dです。
> 4th Dimension(4D)とは、動作プラットフォームとして、macOSおよびWindowsをサポートする珍しいリレーショナルデータベース総合開発環境。

正直、日本では余り聞く名前ではありません。メディアサイトで取り上げられることも少なければ、日本語版Wikipediaには現在ほとんど書いてなく、ほとんどの人にはよくわからないでしょう。

[4th Dimension (software)
- Wikipedia(en)](https://en.wikipedia.org/wiki/4th_Dimension_(software))に、おフランス、アメリカ、イギリスが主要な市場で12言語にローカライズされていると書いてありました。


## 4Dの特徴
4Dがどんなものか想像できない人には、Access + VBA + SQL Server + Visual Studio + Phpという説明をします。つまり、プログラムと実行環境とデータベースとIDEその他が全部一体化しちゃっています。

他のサーバー、ミドルウェア、その他製品と比べてどこが良いかと言うと、、、

- 開発のスピード
- 環境構築・配布の容易さ

でしょうか。

### 開発スピード
フォームはAccessやVisual StudioのようにGUIで簡単に作れ、データベースはフォームやプログラムから直接参照できます。UIやUXにこだわりがなければ、コーディングはほとんどビジネスロジックで済みます。

コンセプトは、プロのエンジニアが居なくても業務システムを作れることのようです。教育コストも少なく、ささっと画面作って、処理書いて、完成。ちょっとやるだけなら、チュートリアルでも見ればよく、深い知識なんていりません。

マスタメンテ画面ぐらいであれば1機能1~2時間もあれば作れます。ダサいけどデフォルトの見た目であれば、4Dが一瞬で勝手に作ってくれます。

### 環境構築・配布の容易さ
サーバーを立ち上げるにしろ、シングルで立ち上げるにしろ、ソフトをインストールして起動、開発フォルダを指定するだけで、準備完了。
開発が終わって、その開発フォルダをコピーすれば、環境のコピーも完了。コンパイルはしてもしなくても、ちょっとやるだけならどちらでもOK。

Windowsの場合、サービスに登録すれば、サーバーを勝手に起動してくれます。設定にチェック入れるだけでWEBサーバーも使え、SQLサーバーも使えます。

### メリット
- WindowsでもMacでも使える。
- 開発フォルダが一つのフォルダで完結できる。
- とにかく開発は早いし簡単。設定はほとんどGUIでできる。
- 開発速度重視の汚いコードでもかなり健闘する。
- データベース操作のメソッドは大量に用意されている。
- 公式サポートが手厚い。日本支社がある。
- 日本語マニュアルがある。ただし一部未翻訳。
- 原則として同じプログラムをクラサバとしてもシングルでも使用可能。
- もちろんクラサバで開発できる。
- デバッグも容易。クラサバでもデバッグできる。
- 同じメソッドがサーバーサイトでもクライアントサイドでも使え、クライアントからサーバーメソッドを蹴ることも容易。
- 本体のバージョンアップに伴って、旧Verで開発したモノを初めて起動すると勝手にバージョンアップしてくれる。
- プラグインがあれば何でもできて、プラグインは自分でも開発できる（C言語）
- WEBサーバーとしてもPHP(5.3.11)サーバーとしても一応使える
- メソッドのプロパティに設定すると、メソッドがそのままURLで叩ける。
- SQLも使え、ODBC接続できる。
- JSONが扱える。テーブルのレコードを一発変換もできる。（以前はプラグインだったが、公式対応）
- テーブル設計のGUIがER図も兼ねており、リレーションもその場で設定できる。

### デメリット
- 大規模データのバッチ処理にはちと重い。V16以降は書き方次第で複数コアを使って高速化できるらしいが、未体験ゾーン。普通に書けば、並列処理にならず、マルチコアの意味がない。
- 手元のフォルダにある4Dファイルが「一体何か」「いつのものか」等を知るには、起動が重たいソフトウェアを立ち上げて開かないと見れない。
- 本体のメジャーアップデート等の後、日本語が苦手な時がある。shift-JISやIMEの動きに注意
- マニュアルにないちょっと変わったことをしようとすると、開発・実行コストがかかる。
- プロジェクトが大きくなると、メソッドやフォームを整理しないと探すのが大変になる。
- 4Dって何？って聞かれる。
- オブジェクト指向って何？メソッドはちゃんと名前で並べてね。
- ソース管理って何？無くてもぎっとダイジョブ。
- サービスで立ち上げた時は、対話型サービスにチェックをしないと、管理できない。Windows Server 2016だと困る。
- マニュアルの検索機能が日本語では役立たずのため、Google検索で site:doc.4d.com を付けて検索する必要がある。

次回は4Dプログラミングの特徴。 

後日追記：
↑と思ったらしいですが、力尽きたようでした。
これから４Dに触れる方、楽しい４Dライフを！
[iOS9]MPMediaLibraryAuthorizationのavailableに惑わされた件

# この記事について
iOS 8からiOS 10のあたりってApple Musicが発表されたり、メディアライブラリへのパーミッション設定が必須になったりと音楽関係のライブラリが大きく変わっているタイミングなんですよね。

それもあってかiOS 9.3.5の環境の動作がゴチャってました。
だいぶ今更感もありますが、パーミッション部分の整理しました。
###### 参考
[[iOS] iOS 9.3 の新機能を使用して Apple Music の曲の再生とライブラリへの追加を行う](https://dev.classmethod.jp/smartphone/iphone/apple-music-ios-9-3/)
[[iOS 10] 各種ユーザーデータへアクセスする目的を記述することが必須になるようです](https://dev.classmethod.jp/smartphone/iphone/ios10-privacy-data-purpose-description/)
# 結論
　~~もう面倒だし、対応バージョンiOS 10以降でいいんじゃね？~~
　パーミッションの差異を気をつけつつ、バージョンに合った動作をさせましょう。
　- **MPMediaLibraryAuthorization**（ミュージックライブラリを参照したい場合）
　　→ iOS 10以降からチェックする。（iOS 9.3系ではチェックしない）
　- **SKCloudServiceAuthorizationStatusAuthorized**（AppleMusicを扱いたい場合）
　　→ iOS 9.3以降からチェックする。

# 事象
　**MPMediaLibraryAuthorization**は`@available(iOS 9.3, *)`なのでiOS 9環境でもパーミッション確認を出すことができます。

　しかし、**パーミッションの設定に関係なく、ライブラリが参照できます。**←

　そのため、許可してないのにライブラリ全部表示されてしまい、小一時間苦悩しました。。
　加えて、パーミッションの設定画面も「MEDIA_LIBRARY」と書かれており、明らかにローカライズが準備されてない表示です。。
 ![t.png](https://qiita-image-store.s3.amazonaws.com/0/135259/a1d8dcd9-a9e8-62da-29fa-345de990abbd.png)

# 最後に
　iOS 9.3.0 〜 iOS9.3.5というかなり限定的なバージョンのお話になってしまいましたが、
　流石にiOS9のマイナーバージョンアップは無いでしょうし、アプリケーション側でカバーしてあげる必要があります。
　正直致命的でもないですし、下位互換性の気遣いあるアプリを作るという面で少しでもお役に立てたら幸いです。

　~~んーでも、やっぱり対応バージョンをiOS 10以降にした方がよくね。~~
[ Android ] 丸く広がるRippleを、サクッと実装 

簡易的にタッチフィードバックのないボタンやレイアウト、タップ範囲が狭くなってしまったボタンなどに、範囲外に丸く広がるRippleでタップ感、領域を少し増やします。

こんな感じ(画質悪くてごめんなさい..)

![](https://media.giphy.com/media/BCdieh4HbI0jNvqgbJ/giphy.gif)

Rippleを出したい要素の外側を、[FrameLayout](https://developer.android.com/reference/android/widget/FrameLayout.html)(パーツをひとつだけ配置して使用するレイアウト)で囲って、重ねてあげます。
この実装は、FrameLayoutを継承しているレイアウトでも使えます。

表示したいRippleの範囲は、paddingして操作できます。

```xml:
<FrameLayout
    style="@style/RippleFrameStyle"
    android:padding="20dp">

    <Button
        style="@style/ButtonStyle"
        android:background="@drawable/icon" />

</FrameLayout>
```

適用するスタイルはこんな感じです。
切り分けてあげると使いまわせます。


```xml:style.xml
<!--リップルエフェクトを出すための親レイアウト-->
<style name="RippleFrameStyle">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_centerVertical">true</item>
    <item name="android:background">?attr/selectableItemBackgroundBorderless</item>
    <item name="android:clickable">true</item>
    <item name="android:focusable">true</item>
</style>

<!--配置する見た目となるレイアウト-->
<style name="ButtonStyle">
    <item name="android:layout_width">30dp</item>
    <item name="android:layout_height">30dp</item>
    <item name="android:layout_centerVertical">true</item>
    <item name="android:clickable">false</item>
</style>

```

タッチフィードバックを親となるViewGroupに指定してあげるイメージです。

FrameLayout側でclickableとfocusableをtrueにして、クリック、フォーカスを可能にしてあげます。
さらに、内部のパーツがクリック可能であれば、clickableを取り除いてあげます。

そして、親となるFrameLayoutに、おなじみ[`?attr/selectableItemBackgroundBorderless`](https://developer.android.com/training/material/animations.html?hl=ja)を設定してあげます。

ちなみに、selectableItemBackgroundBorderlessは、APIレベル21（Lollipop）以上限定です。

>*[カスタム アニメーションの定義](https://developer.android.com/training/material/animations.html?hl=ja)*

ですので、何らかの動的な処理(onClickListenerやら)を設定する場合、FrameLayout自体を指定してあげて下さい。

UIにそんなに実装コスト割けないけど、取り急ぎ[Material Design](https://material.io/guidelines/)ぽいタップ感出したい！って言う方はこれだけやってあげると少し華やかになる、かも、しれないです。

もっと素敵な実装方法有りましたらご教授頂きたいです。
【tvOS】角丸ボタン

# 出来ること
- StoryBoardでも確認できる
- Focusのイベントをコントロールできる
- ボタンのTitleが中央揃えにする

<img width="270" alt="スクリーンショット 2018-03-12 17.42.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/242761/f4f273fc-4e6c-928d-6746-860d8838abb2.png">

```swift:RoundButton.swift
import UIKit

@IBDesignable
class RoundButton: UIButton{
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.initView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.initView()
    }
    func initView(){
        self.titleLabel?.textAlignment = .center
    }
    
    @IBInspectable var cornerRadius: CGFloat = 0{
        didSet{
            self.layer.cornerRadius = cornerRadius
        }
    }
    override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
        
        coordinator.addCoordinatedAnimations({
            if self.isFocused {
                // in focus
                UIView.animate(withDuration: 0.1,
                               animations: {
                                self.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
                                self.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor
                                self.layer.shadowOffset = CGSize(width: 5, height: 5)
                                self.layer.shadowOpacity = 1.0
                                self.layer.shadowRadius = 5.0
                },
                               completion:nil)
                
            }
            else {
                // leaving focus
                UIView.animate(withDuration: 0.1,
                               animations: {
                                self.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
                                
                                self.layer.shadowOffset = CGSize(width: 0, height: 0)
                                self.layer.shadowOpacity = 0.0
                                self.layer.shadowRadius = 0.0
                },
                               completion:nil)
            }
        }, completion: nil)
        
    }
}
```
# 使い方
- StoryBoardでUIButtonのCustomClassをRoundButtonにする
- StoryBoardでCorner Radiusの値を調整する

# 留意
StoryBoardに反映できない場合がある。その際、以下を確認ください。

- RoundButtonクラスを追加した時点、一旦、Xcodeを再起動したら、問題なく反映できると思う。
- XcodeのEditor/Automatically Refresh Viewsをオンにするかを確認する
centOS7で日本語入力できるようにする（ibus-mozc）

なんかこれでいけたのでメモ
centOS7を簡単インストールしたら言語設定が英語でibus-mozcをインストールしても動かなかった。

#問題
- 日本語が入力できない
- ibus-mozc使いたい
- 難しいことはよくわからない

#手順（やった順）
時系列順なので最短手順ではないです
## 0. CentOS7インストール後
ウインドウシステムが入っていないので起動すると黒い画面が起動する
以下を参考にGNOME Desktopを入れた
[CentOS7最小限のインストールからのGnomeデスクトップ環境構築](http://zero-config.com/centos/gnome-0001.html/)
最小限のインストールでwifi設定とかが入っていたのでなんとか有線LANとかは接続する必要なかった
デフォルト設定を変えていないので起動しても黒い画面が表示される、`startx`でウインドウシステムを起動する必要があった
ウインドウシステムの言語設定を日本語にしてもメニューはすべて英語の状態

## 1.ibus-mozcをインストール
[CentOS 7.0にibus-mozcをインストールする](http://note.kurodigi.com/centos7-ibusmozc/)
これをやる。

**ここまでやって、ターミナルやテキストエディタでは日本語が入力できるようになったけど、ブラウザやemacsで日本語が入力できない状態になって困っていた**

## 2.centOSを日本語環境にする・グラフィカルインストールをデフォルトにする
以下の手順をこなす
[日本語環境にする](https://www.server-world.info/query?os=CentOS_7&p=japanese)
[ランレベルを変更する](https://www.server-world.info/query?os=CentOS_7&p=runlevel)
PCを再起動する、言語設定が日本語になった
ちなみに、`yum groupinstall "Japanese Support"`は古いので使えないらしい
## 3.ibus-mozcを再設定
再設定しないと日本語入力ができないので、
[CentOS 7.0にibus-mozcをインストールする](http://note.kurodigi.com/centos7-ibusmozc/)
これの「ibus-mozcの登録」をもう一度行う

これでブラウザでも日本語が入力できるようになった。

#参照
[CentOS 7.0にibus-mozcをインストールする](http://note.kurodigi.com/centos7-ibusmozc/)
[日本語環境にする](https://www.server-world.info/query?os=CentOS_7&p=japanese)
[ランレベルを変更する](https://www.server-world.info/query?os=CentOS_7&p=runlevel)
ansible ひとりもくもく会

#  まずはansibleコマンド

> http://docs.ansible.com/ansible/latest/intro_getting_started.html

/etc/ansible/hosts のyml

親のhostsでぶら下がるホストを定義

children内のhostsでは重複でホストを呼んでグループ化できる = 1ホストが複数グループに所属可

```yml
all: # keys must be unique, i.e. only one 'hosts' per group
  hosts:
    sv1:
    sv2:
    sv3:
  vars:
    mytype: ALLLLLLLLL
  children:
    dmz:
      hosts:
        sv1:
        sv2:
      vars:
        mytype: "Overrided by group_vars {{ group_names }}" 
    internal:
      hosts:
        sv3:
      vars:
        mytype: "Overrided by group_vars {{ group_names }}" 
    mygroup:
      hosts:
        sv2:
        sv3:
      vars:
        mytype: "Overrided by group_vars {{ group_names }}" 
```

試す

```sh
ansible all -m ping
ansible dmz -a hostname
```

## 変数を使う
bashの変数になるかと思ったら違った。

```sh
ansible all -a "echo {{ mytype }}"       # なんとgroup_varsに上書きされる
ansible mygroup -a "echo {{ mytype }}"   # variablesの上書きがいまいち
```

変数の上書きはしないほうがよさそう。

# ansible playbook

> http://docs.ansible.com/ansible/latest/playbooks.html

playbookの中に対象ホストを書くのが意外だった。

```yml
$ cat playbook.yml
---
- hosts: mygroup
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
```

試す

```sh
$ ansible-playbook playbook.yml --syntax-check
$ ansible-playbook playbook.yml --list-hosts

# 実行
$ ansible-playbook playbook.yml
PLAY RECAP ***********************************************************************************************************************
sv1.kidc.jp           : ok=1    changed=0    unreachable=0    failed=1   
sv2.kidc.jp          : ok=2    changed=0    unreachable=0    failed=0   
```

apacheがない sv1 はちゃんとエラーになった。

playbookの書き方は特殊だなー、これがDSLというのだろうか。覚えるの大変そう・？

---

時間取れ次第、続き書き足していく予定。
Eclipseでサーバーを停止せず終了しTomcatが動き続けた時の対処法

Eclipseでサーバーを停止せず終了しTomcatが動き続けてしまった時の停止のしかたメモ。

#動作環境
・Mac Book Pro
・Eclipse 4_7_2

#起こった問題
EclipseでJava EEで開発していたところ、サーバーを起動しようとしたら
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178136/3bb3c5c7-3db2-a59a-be73-0182fcfdcd27.png)
というエラーで起動できない。

#原因
どうやら前回Eclipseでサーバーを停止せず終了したためTomcatが動き続けているためらしい。。

#解決しようとして奮闘
http://www.eclipsetotale.com/tomcatPlugin.html
Eclipse上からTomcatの起動や停止が行える便利なプラグインがあるのにEclipse 4_7_2には対応していなかった

そこでターミナルでshellスクリプトを実行したが止まらない。。。
どうやらEclipseからTomcatを起動してサーバーを停止せず終了した場合はTomcatをShellスクリプトでは停止できないらしい。

のでアクティビティモニタで「java」と検索し
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178136/ceeb9a77-9bde-04ef-0c8e-2620f4ce798d.png)

これを終了。
無事サーバー起動できました。
FreeBSDでsuコマンド（pkgも）使えるようにする

今回はFreeBSDにおける詳細設定の方法を紹介していきたいと思います。
まず最初にFreeBSDをインストールした際にアカウント作成を行ったと思います。私の場合は以下のようになっていました。

```python:アカウント設定
Username	: name
Fullname	: ○○ ○○
passwd      : ××××
Uid	        : 1001
Class		:
Group		: name
Home		: /home/name
Home Mode	: /bin/sh
Looked		: no
```

FreeBSDをインストールし、さあ作業を始めよう！と思っても色々と困ることがあります。まず **su** コマンドが使えない・・・
もう何もできません・・・
そんな方はアカウントの作成時にミスがあったかもしれません。上の図で言うと **Group** の行を見てください。

　　
ここが自分のユーザー名や他の適当な名前になっている場合はsuコマンドが使えない場合があります。


　　
ここの　Group名を **wheel** にしておくとsuコマンドが使えるようになります。（確かpkgコマンドも使えるようになります。）
では、実際にアカウント情報を訂正していきましょう。



```python:アカウント訂正
# /etc/groupを書き換える
# vi は最初から入っているエディタです
vi /etc/group

wheel  : * : 0 : root , name
daemon : * : 1 :
kmem   : * : 2 :
sys    : * : 3 :
...

# 一番最初の行がFreeBSDうんぬん・・・と書いてあるのでそこは読まなくていいです
# wheelと先頭に書いてある行に注目
# おそらくrootとしか書かれていないので自分のアカウント名を , で区切って追加してください
```

以上で終了です。他の行は特にいじる必要はありません。
Water Walking Ball, The Cheap And Funny Water Game

![water-zorbing-ball.jpg](https://qiita-image-store.s3.amazonaws.com/0/243346/23d99529-4a6d-c5fd-7e2a-13c9c51835bd.jpeg)

[Water walking ball](https://www.airfunspace.com/product-category/water-park/water-balls/), the colorful inflatable ball, is cheap and funny. When you play on the water walking ball, you will feel a lot of resistance when you walk on the water, and the balance is difficult to control. If you walk a few steps, you will fall down, but you won't get hurt, it's very funny. In summer, many people want to play in the pool or water park. Water walking ball is a good choice for them. It can make you catch the feeling of walking on the water.

Our [water walking ball](https://www.airfunspace.com/product-category/interactive-inflatables/bubble-soccer/) uses environmentally friendly, non-toxic and harmless materials, which fully protects the health of the visitors.

Attention to the use of water walking ball:
1, Visitors should not carry sharp and hard articles (such as knives, scissors, keys, etc.) to play this product, in the process of use, the hard objects should be avoided to pierce the product.
2, People with high blood pressure, heart disease and alcoholism are not suitable for this product.
3, Each walk on the water must not exceed 2 visitors each time, and the time stay in the ball should be controlled within 10 minutes each times.
4, Each ball needs to be tied up with safety rope. The operator should pay close attention to the situation of the field. When finding abnormal, use the safety rope or use other ways to quickly pull the ball and visitors to the shore, so as to ensure the safety of personnel.
5, Visitors up and down, should be in the special platform, not in other places to stop
https://www.airfunspace.com/product-category/water-park/water-balls/
SeleniumやWebDriverについての自分の理解の図

![Seleniumを用いたE2Eテストをする際の構成 (1).png](https://qiita-image-store.s3.amazonaws.com/0/124098/8d47a3e6-8b05-0cce-5a55-207b251edc0e.png)



SeleniumやらWebDriverやら複雑でややこしかったので自分なりの理解を図にしてみた。
合ってるかどうかの責任は持てないのでこれを見る人は自身の責任で参考にして下さい。



### 以下まだ良く分からないので詳しい方いたら教えて下さい。

- 一つのマシンにテストコードとブラウザがあるのにSelenium Serverが必要なケースとそうでないケース(WebDriver次第？)
- selenium-server-standaloneというjarがなぜ"standalone"なのか。
- Seleniumが定義したWebDriver仕様とW3CのWebDriver仕様の現状とブラウザはどちらに対応しているか。(Seleniumの仕様は見つからないからもしかしてW3Cに統合された？)