OmniAICreator/Qiita-1.07M huggingface dataset:
Python で FPGA/Zybo Z7 で Lチカ

# もっかい Lチカおさらい
[これが「Lチカだ」](https://qiita.com/ryos36/items/fa814c1c7bb0936163e1)でLチカをつくりました。main ルーチンはごく簡単でした。

```python:main
    def main(self):
        led_bit:bit = 1
        while is_worker_running():
            self.led(led_bit)
            led_bit= 1 - led_bit
            self._wait()
```

ぐるぐるまわって led_bit を 0/1 でひっくり返すだけです。

# Polyphony でコンパイル
gist に python のソースを置いておきます。

https://gist.github.com/ryos36/8411816a15915a97471aa778f564d8e3

このソースを polyphony でコンパイルします。 

```text:コンパイル
$ polyphony blink.py
$ ls *.v
Blink_blink.v  polyphony_out.v  test.v
```
## 出来たソースは？
Verilog のソースの冒頭部分はこんな感じ

```
> head Blink_blink.v
module Blink_blink
  (
    input wire clk,
    input wire rst,
    output reg led = 0
  );
```
# Vivado 2018.1 に入れてみる
XADC でつくったプロジェクトに無理やり入れてみます。
## Create Block Design
まずはお絵かき回路図で作業をしたいので、左の選択肢から IP INTEGRATOR -> Create Block Design を選択します。空のデザインができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/eaa3f79b-a3bf-f5d7-4e46-8982bb9f89b5.png)

## Blink_blink.v を Vivado のデザインに追加
Design Sources を右クリックして Add Sources... を選択し Blink_blink.v を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/e36502c3-98de-10dc-8a92-768e7be3fec9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/9a704589-512a-0320-792b-b690a2e1c19b.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/a3623fa4-8c4f-2b07-f034-3699e93b9915.png)

## Blink_blink.v をトップモジュールに
Blink_blink.v を選択して右クリックから Set as TOP を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/a2533715-ab16-755f-a318-c557dba0c8d3.png)

Zybo-Z7.xdc を Disable します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/f8cac4c9-cdfa-37de-c173-de8bde5077e1.png)

あらたに blink.xdc をつくります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/8397362f-df75-83aa-5bb6-042c1f55e4ab.png)

## blink.xdc の中身
Verilog のトップモジュールの各ピンをどこにアサインするか指定します。

```tcl:blink.xdc
set_property -dict { PACKAGE_PIN K17   IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=sysclk
create_clock -add -name sys_clk_pin -period 8.00 -waveform {0 4} [get_ports { clk }];

#LED
set_property -dict { PACKAGE_PIN M14   IOSTANDARD LVCMOS33 } [get_ports { led }]; #IO_L23P_T3_35 

set_property -dict { PACKAGE_PIN K18   IOSTANDARD LVCMOS33 } [get_ports { rst }]; #IO_L12N_T1_MRCC_35

```

## 合成とダウンロード
Generate Bitstream をクリックして合成してください。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/f9263c80-7721-18e8-9fcf-34bdf0a62002.png)

## 実行
Zybo Z7 を JTAG モードにして USB 経由で PC とつなぎ、bit stream をダウンロードします。うまくいけば LED チカチカが始まるはず、、、といいたいところですが、LED はひかりぱなしです。rst にアサインしたボタンを押すと LED は消えます。プログラムは動いていますが、clk が早すぎてチカチカに見えません。改良の余地がありそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/af23ab97-9975-1ba6-68a4-0ebfe7519bfd.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99921/0ddb96bc-42e3-256c-3de9-224d7b4b2626.png)
Laravel artisanコマンドの備忘録

Laravelを使い始めて、歳のせいかどうにもartisanコマンドを忘れてしまうので、使ったコマンドを纏めてみた。
※　全部は網羅しませんよー。

何のコマンドがあるか、一通り見たければ、下記コマンドで。

```shell
php artisan list
```

# DB関連

## テーブル作成用のマイグレーションファイルの作成

```shell
php artisan make:migration create_{テーブル名}_table
```
ファイル名にcreateが付いていると新規テーブル作成のファイルを自動で作ってくれる。
```--create={テーブル名}``` のオプションをつけてもOK

## テーブル修正用のマイグレーションファイルの作成

```shell
php artisan make:migration {ファイル名} --table={テーブル名}
```
テーブルと同様に決まったファイル名であれば、オプション付けなくていいかも。調べてない。

## マイグレーションの実行

```shell
php artisan migrate
```

## マイグレーションのロールバック

```shell
php artisan migrate:rollback
```
```--step={ロールバックする数}``` を付加するとその数分ロールバックされる。
マイグレーションの実行はmigrationsテーブルで管理されていて、ロールバックはその情報を元にロールバックされていて、stepが2の場合は、migrationsテーブルの最新の2レコード分がロールバックされる。

## Seederの作成

```shell
php artisan make:seeder {ファイル名}
```

## Seederの実行

```shell
php artisan db:seed
```
```--class={Seederクラス名}``` で個別実行可能

## 全テーブル削除(drop)後にマイグレーション

```shell
php artisan migrate:fresh
```
```--seed``` を付加するとシーダーも実行

# Controller / Model 関連

## Controller作成

```
php artisan make:controller {Controller名}
```
```--resource``` をつけるとindexとかcreateのメソッドを出力してくれる
```app/Http/Controllers``` 配下に生成されるけど、その配下でフォルダを作って入れたい場合、Controller名を ```{フォルダ名}/{Controller名}``` にするとフォルダ配下に置いてくれる

## Model作成

```
php artisan make:model {Model名}
```
Controllerと同様に```{フォルダ名}/{Model名}``` にするとフォルダ配下に置いてくれる

# router関連

## routeの確認

```
php artisan route:list
```

# Factory関連

## Factoryの作成

```
php artisan make:factory {Factoryファイル名}
```

# Test関連

## Testの作成

```
php artisan make:test {ファイル名}
```

# メンテナンス関連

## メンテナンス実行

```
php artisan down
```

503のエラー画面が表示されるようになる。
```--allow={IPアドレス}```を指定するとそのIPだけメンテナンスにならない。

## メンテナンスの解除

```
php artisan up
```
30代が転職を考える前に見つけるべき、たった1つの事

## 転職活動って大変ですよね

現職は3回目の転職先なんですが、会社見つけるのも大変ですし、
自分が楽しめる会社かどうかもわかりませんし、中々大変です。

エンジニアとして働き続けるのか、
本当にやりたいことにチャレンジするのか。

30代で考える事って、沢山あって辛い。

弊社に面接に来られる方も、悩まれている方が沢山いらっしゃったので、
少しでもお役に立てればと。

## 転職するしないに関わらずに、キャリアビジョンを探そう

今の環境が嫌だから、もっと成したい事があるから。とかとか、
転職理由は様々ですが、もう何回も転職できないだろうなーとか、
漠然と不安を感じながら、会社を探していてはもったいない。

**実は、現職が最適な会社だった**

なんて事になれば、転職してからじゃ後の祭り。

まずは、自分の人生の軸を見つける所からスタートしてみてはどうでしょうか。
それがキャリアビジョンです。

## キャリアビジョンって何？

キャリアビジョンって、一度は耳にしたことのある言葉かと思います。

大体、転職サイトに書いてありますが、
いろいろな所で使われていて、なんだかわかったような気になってしまう、キャリアビジョンを深堀していこうかと。

## キャリアってなに

キャリアは、自身が歩んできた人生そのものです。
生まれてから今日まで。

## キャリアビジョンってなに

ビジョンなので、未来のお話です。

**自分が将来なりたい姿**

と理解している人も多いのですが、その先を考えないといけません。

**その価値観を満たしていれば、満足する人生を送ることができる**

そんな価値観を叶えた未来を「キャリアビジョン」と言います。
その景色は、会社も仕事も、一切依存しません。

むしろ、そのキャリアビジョンを満たすために、会社も仕事も遊びも選びます。

なので、

「キャリアビジョンは、生涯プログラマとして活躍すること」

という言葉は、キャリアビジョンではなくて、敢えていうなら「ワークビジョン」です

## 価値観

キャリアビジョンにおける「価値観」は、
すごく簡単にいうと、「楽しいこと」です。

簡単な例を出すと、先ほどの

**キャリアビジョンは、生涯プログラマとして活躍すること**

と言っている人の「キャリア」上「楽しかったこと」を抽出してみると、

- プログラムを作っていて「楽しい」
- 設計をしていて「楽しい」
- ベンダー調整は「楽しく無い」
- 管理職は「楽しく無い」

となるのでは無いかと思います。

ここから導かれるのは

**作るのが楽しい**

という価値観。

なので、

**「一生、何かを作ることに携われていれば、満足できますか？」**

という問いに、「YES」と答えられれば、本当のキャリアビジョンになります。

>※ 本当はもっと深堀します。
　「なぜ、作っていると楽しいの？」とか、
　「なぜ、プログラムなの？」とか。。。
　CDAという資格があるくらいの内容なので...


## 企業にも職種にも縛られない、自分の軸

キャリアビジョンは、価値観を凝縮した、短いワードで表されます。
そのくらいまで、自身の価値観を見つめ切った先に、一つ見えるワードです。

そのワードが満たせれば、僕の人生は幸せになる。

という、強烈な軸に気づくことで、仕事探しも会社選びも、超スムーズに進みます。

## 見つかるのは30歳前後から

一般的には、「軸」は**30歳前後**から見つかるようになると言われています。

**その軸がどれほど強固で確実なものが見つかるかは、それまでの過ごし方になります。**

だから、歳とった人は、若い人に「若いうちは何でもやれ」と言うんですね。

## 沢山チャレンジしましょう

いろんな事にチャレンジした人。一つのことに必死に打ち込んだ人。
どちらも沢山の経験（と言う名の楽しい・つまらないの判断）をしてきているので、
しっかりとした軸を見つけるのも早いです。

ただ漠然と、漫然と過ごした人は、楽しい・つまらないではなくて、
楽か大変か。の判断しかできないので、「楽」な道を選びがちです。

人生に正解は無いですが、、、僕の価値観では、前者の方が充実した人生が送れそうだなと感じます。

## たまに見つめ直す

と言うことで、何かを振り返る時は、
**「楽しかったな」**
**「つまらなかったな」**
の軸で、自分の仕事や遊びを振り返ってみることをお勧めします。

あー、こういうの「好きなんだな」って気づくだけで、
次、その仕事をする時や遊ぶ時、「楽しい！」ともっと感じられるはず。

**そう言う経験が、モチベーションになり、さらに深い経験となり、
自身の軸として、価値観として、キャリアビジョンとして、根付いていきます。**

ちなみに「キャリアビジョン」はそうそう大きくは変わらないです。
ただ、新しい経験を重ねていけば、少しづつ変わります。

## 偶キャリという考え方

素晴らしいキャリアは、「偶然」が連れてきてくれます。
この「偶然」を引き寄せるのは、自分の「好き」を知り、
沢山「発信」し、アンテナを貼り続けましょう。

という考え方が今は主流です。

価値観と頑固に捉えるのではなく、価値観を知ることで、
自分の人生を豊かにしてくれる選択ができるようになる。と捉え、
変化も楽しみながら、キャリアを重ねていきましょう。

> まー、家族とか守るものがあると、価値観だけじゃ決めれないんですけどね！
> それはそれで、別のお話なので、割愛。

## まとめ

キャリアビジョンは「その価値観を満たすと幸せになる」です。
30歳前後になるまでは、価値観を蓄積する期間
それ以降は、価値観を見つけ、それを満たす期間

エンジニアリングだけではなくて、自身の「人生」に大きく関わることも、
しっかり意識して、楽しく幸せなエンジニアライフを送りましょう。
Serverless + AngularでSPAを作った話

# はじめに

この記事はServerlessアドベントカレンダー2018 14日目の記事です。
トレタ アドベントカレンダー2018 14日目の記事でもあります。

ここ数ヶ月でサーバーレスアーキテクチャ + Angularを使ってWebサービスを作る機会があったので、その時のことについて。(Angularの話はほぼ無いです)

## サーバーレスアーキテクチャを選んだ理由
新しいシステムを0から作る段階で最初に決まっていた要件は、

- 社内業務用のアプリケーション
- フロントエンドは他のプロダクトと共通したいライブラリがあるのでSPAにしたい
- 開発メンバーは少人数
- システム自体に今後の機能追加はあまりない

ということで、サーバーの構成を検討するにあたり、

- サーバー側はなるべく薄く作りたい
- 工数少なめで短期間でローンチしたい
- インフラの保守する工数はない

ので、検討としてあがったのは
AWSでサーバーレスか、HerokuでRails or Sinatra。
というところで、技術的な挑戦もしたかっったのでservelessを選びました。(この時serverless初挑戦)

## システム構成
<img width="787" alt="スクリーンショット 2018-12-07 15.59.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/36813/ebbc08b1-6a26-c56c-9d87-22334464f6b1.png">

わりと一般的な構成かと思います。

- フロントエンドのAngularアプリケーションをS3に格納、CloudFrontから配信
- サーバーはLambdaで、データをDynamoDB
- APIGatewayでlambda上のAPIを配信してAngularから利用
- Cognitoでアプリケーションのユーザー認証

この構成に決めて最初はAWSのコンソールからポチポチしてたんですが、デプロイどうすれば...と思って調べたらちゃんといいのありました。(初心者なのでその辺無知でした。。)
![serverless-framework-logo.png](https://qiita-image-store.s3.amazonaws.com/0/36813/e2dd268c-8afe-57f0-268a-b7cba5867b2f.png)
>
The Serverless Framework is an open-source CLI for building and deploying serverless applications. With over 6 million deployments handled, the Serverless Framework is the tool developers trust to build cloud applications.

ServerlessFrameworkは主にデプロイするためのツールです。AWS CloudFormationにLambdaのデプロイを追加した感じです。
ServelessFrameworkをインストールしてみてみるとserverless.ymlとちょっとのファイルがあるだけ。おもにserverless.ymlにAWSの設定をひたすら書き込みます。
serverless.ymlの書き方は[公式のドキュメント](https://serverless.com/framework/docs/providers/aws/guide/serverless.yml/)に記載されていますが、網羅的に記載されていません。CloudFormationのテンプレートがベースとして使われるので、[CloudFormationのドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)を見ると細かく載っています。

## セキュリティ

<img width="627" alt="スクリーンショット 2018-12-07 16.35.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/36813/9987ba42-1edf-c40b-2469-6e1dbbada79a.png">


サーバーレス構成にしてAPIをセキュアにするにはどうするのかを検討してみたのがこちらです。

- API GatewayでAPIキーの認証とCognitoのユーザー認証の二重認証
- アプリケーションのログインはCognitoをそのまま利用
- CloudFrontにBASIC認証

APIキーをAngularに埋め込んでしまっているので危険なんですが、CloudFrontにBASIC認証をかけて防いでるのでなんとかセーフ。これ社内アプリだからいいけど、パブリックなサービスだったらどうすればいいんでしょうかね?

ちなみにAPI GatewayにBasic認証をかけるには、Lambda@Edgeというのを使うのですが、これがus-eastリージョンでの提供しかなく、ServerlessFrameworkで複数リージョンの設定ができないので個別管理になりました。。

## サーバーレスでツラかった点

DBを選ぶ時に、Lambda x RDBはアンチパターンという記事がすぐ見つかります。Lambdaが実行されるたびにDBに毎回コネクションを貼ってしまうのでコネクション数がすぐにパンクする、というのが原因なので確かに避けた方が無難です。

ただ、今までRDBでばかり使っていたのでNoSQLになれるのが大変でした。
DBの制約はかけられないし、複雑なクエリはできない、トランザクションが行えないなど、管理画面をつくるには向いていないという感想です。

※ LambdaでRDSを使うベストプラクティスが発表されてました(https://dev.classmethod.jp/cloud/aws/reinvent2018-srv301/)
※ DynamoDBでトランザクション機能がでたそうです(https://aws.amazon.com/jp/blogs/news/new-amazon-dynamodb-transactions/)

## さいごに
今回はスモールスタートでの開発にサーバーレスアーキテクチャを利用したという点で、比較的短期間で本番稼働開始できたのが、非常にメリット大きかったと感じています。
小さめのアプリケーションや、初期段階のバックエンドを作るときは積極的に活用していきたいと思いみます。
💩これは世界一の臭いであるウンコードを出力します💩

タイトルを再翻訳テキストっぽくしたのは趣味です。

# tl;dr

- クソみたいなコード(通称ウンコード)を眺めていて、これは臭うって思った
- 本当に臭いコードとはなにか考えた
- Pythonスクリプトをうんちに変えるプログラムを作った

# はじめに

[ウンコード・マニア](http://unkode-mania.net/)というサイトがあります。有志の方々が集めたクソなコードいわゆるウンコードが投稿されています。

有名なコードの例だと、128個のcaseが並ぶswitch文や、謎の連番で命名された変数など...(記事投稿時にメンテナンス中だったため、スクショを貼れなかった...)

**真面目な話をすると、ウンコードを勉強すると反面教師のようにこうやってするとダメなんだなっていう勉強になったりもします。**アンチパターンならぬウンチパターンを知っておこうということです。

わりとそのコードの中にも議論を呼ぶものもあります。「果たしてこれは本当にウンコードといっていいのか?」や「この書き方は正しいor正しくない」みたいな話もあがったりします。勉強になる。参考→[ウンコードに掲載されているコードは本当にウンコなのか - 蟲！虫！蟲！ - #!/usr/bin/bugrammer](http://bugrammer.g.hatena.ne.jp/nisemono_san/20120731/1343761734)

そこで、誰でも**これはウンコードだ**と言えるコードを見つけました。(褒め言葉)↓
[Pythonで1行ででかい💩を表示するまでの道のり - Qiita](https://qiita.com/ys-0-sy/items/b38d7371997ccc4142e6)

そこで`"💩"`を使ったなにかをつくりたくなりました。

#すべてのPythonコードを💩に変えるツール

をつくりました。

例えば

```python
for i in range(10): print(' '*(10-i) + '💩'*i)
```

を

```
 💩💩  💩💩  💩💩 💩💩💩💩 💩💩💩  💩   💩      💩💩 💩  💩  💩      💩💩 💩  💩 💩💩 💩💩💩   💩      💩💩💩  💩  💩💩    💩 💩💩 💩💩💩  💩💩  💩💩💩 💩💩  💩 💩  💩 💩     💩💩   💩  💩💩      💩 💩  💩  💩💩💩 💩   💩      💩💩💩     💩💩💩  💩  💩💩 💩  💩 💩💩 💩💩💩  💩💩💩 💩    💩 💩     💩  💩💩💩  💩       💩  💩💩💩  💩 💩 💩   💩 💩     💩💩   💩  💩💩      💩 💩💩 💩 💩💩 💩  💩  💩 💩  💩  💩       💩 💩 💩💩  💩       💩  💩💩💩💩💩💩💩    💩  💩💩💩💩💩💩  💩  💩 💩 💩 💩  💩  💩  💩💩💩  💩 💩 💩  💩💩 💩  💩  💩 💩  💩
```

に変換します。わお臭い。
ちゃんと実行できます。

以上を実行すると、

```
         💩
        💩💩
       💩💩💩
      💩💩💩💩
     💩💩💩💩💩
    💩💩💩💩💩💩
   💩💩💩💩💩💩💩
  💩💩💩💩💩💩💩💩
 💩💩💩💩💩💩💩💩💩
```

が出力されます。

# 作ったウンコード
以下が変換とかをしているコード。
pythonコード(スクリプト)をUTF-8の文字列として扱い、バイナリに変換。そのバイナリを`💩`と` `(半角スペース)に変換します。実行するときは逆の操作をしてPythonコードにもどして、`exec()`してるだけ。
コードを分割するときに以下の記事を参考にさせていただきました。
[文字列を指定した文字数ごとに分割する。RubyとPythonで。 - Qiita](https://qiita.com/yasunori/items/551a7c20ef9b81474e2a)

```poolib.py
def __bin2poo(bin_str):
    return bin_str.replace('0', ' ').replace('1', '💩')

def __poo2bin(poo_str):
    return poo_str.replace(' ', '0').replace('💩', '1')

# https://qiita.com/yasunori/items/551a7c20ef9b81474e2a
def __split_n(text, n):
    return [text[i: i+n] for i in range(0, len(text), n)]

def python2poo(code):
    return ''.join(map(__bin2poo, (['%04d' % int(bin(int(d, 16))[2:]) for d in code.encode('utf-8').hex()])))

def poo2python(code):
    return bytes.fromhex(''.join(map(str, map(lambda b: hex(int(b, 2))[2:], map(__poo2bin, __split_n(code, 4)))))).decode("utf-8")

def runpoo(poocode):
    exec(poo2python(poocode))
```

以上を読み込んで、以下のコードを実行すると

```sample.py
from poolib import python2poo, poo2python, runpoo

code = "for i in range(10): print(' '*(10-i) + '💩'*i)"
poo = python2poo(code)
print("org code")
print(code)
print("poo code")
print(poo)
print("run poo")
runpoo(poo)
```

先ほどの例になります。

# 参考リンク
- [ウンコード・マニア](http://unkode-mania.net/)
- [ウンコードに掲載されているコードは本当にウンコなのか - 蟲！虫！蟲！ - #!/usr/bin/bugrammer](http://bugrammer.g.hatena.ne.jp/nisemono_san/20120731/1343761734)
- [Pythonで1行ででかい💩を表示するまでの道のり - Qiita](https://qiita.com/ys-0-sy/items/b38d7371997ccc4142e6)
- [文字列を指定した文字数ごとに分割する。RubyとPythonで。 - Qiita](https://qiita.com/yasunori/items/551a7c20ef9b81474e2a)
メモ：sshのエラー、パーミッションで。

```sh:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/xxxxx/xxxxxx/xxxxxxxxxxxx/xxxxxxxxxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/xxxxx/xxxxxx/xxxxxxxxxxxx/xxxxxxxxxx.pem": bad permissions
xxxxxxx@xxx.xxx.xxx.xxx: Permission denied
```

ssh接続、外出先で繋ごうとしたらエラーが出たね。
記事にするほどでもないエラーだけどメモる。

よく読むと`bad permissions`と書いてあるもんね。

`chmod 600`にして解決した。。
[Fetch API] Ajaxの代わりのありがちなアレ

最近Fetch APIに興味を持ち始めて、ぼちぼち調べている。
Promiseって、理解すると凄く便利そうだなぁと思う今日この頃。

とりあえず、Ajaxでうんたらかんたらする代わりに、fetchでやってみよう！というお話。
とにかく、シンプルで使い回せそうなものを見付けるのである (´･ω･｀)

```js:hoge.js
function hoge() {
    var form_data = new FormData();
    form_data.xxx_id = 1;

    fetch('./hoge.php', {
       method: 'POST',
       body: form_data 
    })
    .then(response => {
        return response.json();
    })
    .then(json=> {
        console.log(json.data);
    });
}
```

`fetch()`が済んだらresponseを返し、そこからjsonを取り出して値を取り出して。
いぇー (  ･`ω･´)
C++ Builder 10.2 Tokyo > 静的ライブラリが見つかりません: bdertl.lib > bdertl.libとは | エラー対処

```txt:動作環境
C++ Builder 10.2 Tokyo
```

XE4で実装していたプロジェクト(FastReport VCL 5使用)を10.2 Tokyoへ移行しようとしている。

下記のエラーが出た。

![2018-12-07_18h23_34.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2bd1a66f-51ba-8e63-13d4-88ba40509c6a.png)

bdertl.libとは何か?

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Talk:Static_Runtime_Libraries
> Static library for the "BDE DB components" package.

### `#pragma link "bdertl.lib"`

下記は関連するかどうか。
https://forums.embarcadero.com/message.jspa?messageID=880246
> After doing it a second time on my laptop the linking error for BDE is still there, the line `#pragma link "bdertl.lib"` needs to be added.

追加してみたけど、上記のエラーはやはり出る。

### .cbprojファイル

.cbprojファイルでbdertl.libが記載されているのは下記の二か所

`
<AllPackageLibs>rtl.lib;vcl.lib;IndySystem.lib;KTools.lib;IndyCore.lib;IndyProtocols.lib;Tee.lib;vclimg.lib;vclx.lib;DbxCommonDriver.lib;dbrtl.lib;frx25.lib;fs25.lib;fqb250.lib;bdertl.lib;vcldb.lib;frxe25.lib;frx25.lib;fs25.lib;fqb250.lib;frxe25.lib</AllPackageLibs>
`

`
<LinkPackageStatics>rtl.lib;vcl.lib;IndySystem.lib;KTools.lib;IndyCore.lib;IndyProtocols.lib;Tee.lib;vclimg.lib;vclx.lib;DbxCommonDriver.lib;dbrtl.lib;frx25.lib;fs25.lib;fqb250.lib;bdertl.lib;vcldb.lib;frxe25.lib;frx25.lib;fs25.lib;fqb250.lib;frxe25.lib</LinkPackageStatics>
`

エディタにて2箇所から`bdertl.lib`を削除した。
IDEで開きビルドするとエラーはなくビルドできた。
**が、後述のダイアログでの対処の方が標準的な方法と思われる。**

### ダイアログ > リファレンスから削除

![2018-12-07_18h23_34.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2bd1a66f-51ba-8e63-13d4-88ba40509c6a.png)

エラーダイアログにおいて「リファレンスから削除」というチェックがある。
こちらを使えば、自分でエディタで修正する必要はなさそう。
リファレンスから削除するか、グローバルライブラリパスに追加するかは判断の上で実施する。
W3C形式のログをApache形式のログに変換する

Diverse Advent Calendar 2018の10日目です。

昨日は @SAMUKEI さんのLookerについてのお話でした。
私も触ってみましたが、ブラウザをぽちぽちするだけでキレイなグラフがでてくるのは感動モノです！
本日は私のシェルTipsです。週頭のお口直しにつまんでみてください。

## 時間無いから一言で言って

「Apacheログ形式」でアクセスログを要求されたけれど、弊環境でのログは「W3Cログ形式」だったので頑張って変換した。

## どうしてこうなった
「直近１ヶ月分のアクセスログを分析したいのでくださーい（ApacheログのCombine形式で）。」
と言われ手元に持ってきたログはCloudFrontのログ形式でした。

ちなみにApacheログ形式はこんな。

```
%h %l %u %t ¥"%r¥" %>s %b ¥"%{Referer}i¥" ¥"%{User-Agent}i¥"
リモートホスト名　クライアントの識別子　認証ユーザー名　日時（[DD/M/yyyy hh:mm:ss + 9:00]）　"リクエストの最初の行の値" 最後のレスポンスのステータス　送信されたバイト数　"Refererの値" "User-Agentの値"
```

で、CloudFrontのログ形式はこんなです。基本はW3C拡張ログ形式ですね。

```
date time　x-edge-location　sc-bytes　c-ip　cs-method	cs(Host)　cs-uri-stem　sc-status　cs(Referer)　cs(User-Agent)　cs-uri-query　cs(Cookie)　x-edge-result-type　x-edge-request-id　x-host-header	cs-protocol　cs-bytes　time-taken　x-forwarded-for	ssl-protocol　ssl-cipher　x-edge-response-result-type cs-protocol-version　fle-status　fle-encrypted-fields
日付(yyyy-mm-dd) 時刻 エッジロケーション バイト数 クライアントIPアドレス アクセス方式 CFディストリビューションのドメイン名　パスURI ステータスコード リファラー User-Agent クエリ文字列 クッキーヘッダー CFのレスポンス分類　識別文字列 リクエストドメイン名 プロトコル ヘッダを含むバイト数 サーバー時間 IPアドレス SSLバージョン 暗号方式 CF分類 フィールド数 
```

順番バラバラですし、なにより日付形式が形式が大きく違っております。
今回一回だけのことなので、手元で変換するべくBash+awkでこねくりまわしました。

## 結局のところ何したの

1. とりあえずダウンロードしてきたファイル群をまとめて解凍
2. 解凍したファイルを一件ずつ処理開始
2. 日毎に１ファイルになるように、ログ日をファイル名として変数格納
3. ファイルをオープン→文字列を変換→ファイルに追記
4. 最後にまとめて圧縮して完了

今回のカレンダーでネタにしよう！　
と思ってローカル内を漁ったものの、すべてが dev/null に吸い込まれて揮発していました。😱
残っていたのは↓の変換するワンライナー部分だけでした。

```bash
cat $元ファイル名 | awk '
　　　　{
　　　　　　split($1,ar,"-");
　　　　　　mon=ar[2];
　　　　　　m=(mon==10)?"Oct":"Sep";
　　　　　　datestr=ar[3]"/"m"/"ar[1];
　　　　　　gsub(/%2520/," ",$11);
　　　　 print $7,"- - ["datestr":"$2"]",$6,$8,$9,$4,$10,$11
　　　　}
' >> $出力ファイル名
```

注意点：日付が9月10月にしか対応していません！


## まとめ
普段シェルを触らないと、こういうときにまごついちゃうよねー。という知見を得ました。
誰かのお役に立てれば幸いです（なさそう）。

明日は @aono099 さんの　「みんなでやる競合調査」です！　楽しみですね！
あなたの翻訳が気に入らないわ(Zabbix)

# はじめに

Zabbix Advent Calendar 2018の7日目です。

ZabbixのWebインターフェースを日本語表示にも切り替えて利用できることはご存知とは思いますが、その翻訳が気に入らないことがあるかもしれません。
日本語の翻訳は、現在Zabbix Japanの代表をされている寺島広大さんが翻訳されたものをベースに、私も一緒になってコミュニティなどからも意見を受け付けながら更新してきたものです。

でも、「あなたの翻訳が気に入らないわ」という方の為に、日本語翻訳の変更方法をご紹介しましょう。


# 使用されている技術

まず、ZabbixのWebインターフェースでは、gettextというソフトウェアを利用して多言語対応を行っています。

**gettext** [https://www.gnu.org/software/gettext/](https://www.gnu.org/software/gettext/)

各言語用のPOファイルを用意して、msgfmtコマンドを使用してプログラムからより高速に扱いやすいバイナリ形式のMOファイルに変換しておきます。PHPはそのMOファイルから値を取り出して、表示時に設定されている言語設定に合わせた翻訳語に置き換えて表示するようになっています。

例えば、Webインターフェースでログイン後に表示される「ダッシュボード」という言葉は、/usr/share/zabbix/include/menu.inc.phpの46行目あたりに「_('Dashboard')」と表記されているのが翻訳元の文字列の表記です。これに対応させて、日本語なら「ダッシュボード」という文字列に置き換えるようにするわけです。


# 日本語翻訳の編集方法

それでは、日本語翻訳の編集方法を説明していきましょう。

ここでは、RHEL 7(CentOS 7)にZabbix 4.0.2のWebインターフェースをパッケージでインストールした環境であると仮定させて頂きます。
そうすると、各言語の用のMOファイルが、/usr/share/zabbix/localeディレクトリ以下に、各言語ごとに用意されていることを確認できると思います。
他のOSであっても、localeディレクトリからの相対位置で対応はできますので、localeディレクトリの位置を確認しておいてください。

あとは、ここからどう進めるかですが、Zabbixでは、翻訳対象の文字列の洗い出しと更新反映の為のスクリプトが用意されています。
とはいえ、最近はパッケージでインストールした時にインストールされなくなってしまいましたので、そのスクリプトはソースのtar.gzファイルから取り出して利用することとなります。

現在インストールしてあるZabbixのバージョンに合わせてソースファイルを取得してきてください。

**ダウンロードページ：**
[https://www.zabbix.com/download_sources](https://www.zabbix.com/download_sources)
[https://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/](https://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/)

Zabbix 4.0.2のソースファイルは「zabbix-4.0.2.tar.gz」となります。

まずは、翻訳用のファイルを配置します。
ソースファイルを展開して、翻訳語更新に必要となるスクリプトと、ベースとなる元の翻訳ファイルを取り出します。

```sh
# tar zxvf zabbix-4.0.2.tar.gz
# cp zabbix-4.0.2/frontends/php/locale/*.sh /usr/share/zabbix/locale/
# cp zabbix-4.0.2/frontends/php/locale/ja/LC_MESSAGES/frontend.po /usr/share/zabbix/locale/ja/LC_MESSAGES/
```

ソースに含まれる翻訳済のPOファイルは古い場合があるので、PHPから最新の情報を取集してPOファイルを最新の状態にします。

```sh
# cd /usr/share/zabbix/locale/
# ./update_po.sh
```

あとは、ja/LC_MESSAGES/frontend.poを変更します。

```sh
# vi ja/LC_MESSAGES/frontend.po
```

先ほどの「ダッシュボード」であれば、POファイル内に以下のような記述があると思います。

```sh
#: app/controllers/CControllerDashboardView.php:157 include/menu.inc.php:46
msgid "Dashboard"
msgstr "ダッシュボード"
```

日本語翻訳を変更したいのであれば、msgstr側のダブルクォーテーションで括られた中を変更するわけです。
それ以外も、変更したい翻訳箇所があれば、該当する翻訳語のmsgstrを変更するだけです。
「#:」で始まる行は、その翻訳語がどのPHPファイル内で使用されているかが書かれているので、変更したい場所を特定するのに使用するとよいでしょう。

「msgstr ""」という行があったら、その部分は翻訳されていない文字列です。

frontend.poの編集が終わったら、MOファイルへの変換とWebサーバーの再起動を行います。

```sh
# cd /usr/share/zabbix/locale/
# ./make_mo.sh
# systemctl restart httpd
```

ブラウザでリロードすれば、変更が反映されているはずです。

各バージョンの最新の翻訳は、以下のサイトでも確認することができます。

**Zabbix翻訳システム** [https://www.zabbix.org/pootle/ja/](https://www.zabbix.org/pootle/ja/)

翻訳システムとソースとの同期はあまり頻繁ではなかったりするので、ここからダウンロードしてもすべて翻訳された状態ではない場合もあるかもしれません。

また、あまり勝手に更新されないよう、日本語翻訳の更新権限を持つ人は限定させて頂いています。
TYPOなど軽微な誤りであれば、ご連絡頂ければすぐに翻訳システム上を修正致しますので、何かありましたらご連絡ください。
大幅な変更に関しては、ご意見は伺いますが反映するかどうかは検討させてください。

# 注意点

ただし、独自に翻訳した画面のメッセージを利用してコミュニティや公式な問い合わせ窓口に問い合わせしないでくださいね。
どの画面のどのメッセージや状態に関する問い合わせであるのかを特定できません。
最初の英語の画面か、各Zabbixのバージョン用のデフォルトの日本語翻訳を使用してお問い合わせ頂きますようお願いします。
AWS Toolkit for JetBrainsで新規プロジェクトを立ち上げる際に no such option --infoとなる場合

AWS Toolkit for Jetbrainsがついにリリースされましたね！
https://aws.amazon.com/jp/pycharm/
これでSAMをもっと手軽に開発できるようになりました!わーい!

# 問題: 新規プロジェクトがCreate出来ない
<img width="787" alt="スクリーンショット 2018-12-07 17.17.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/171398/462f38d3-18f8-f688-3b52-c1467fc5155b.png">

# TL;DR (先に結論)
わかる人はこれで。
aws-sam-cliのversionが古いからです。(--infoオプションがv0.7.0から)
旧versionのsamをアンインストールします。
*アンインストールはsamをすでにインストールしている人のみ。

```
$pip uninstall aws-sam-cli
```
最新versionをインストールします。

```
$pip install aws-sam-cli
```

インストールできたら

```
$sam --info
>{
  "version": "0.8.1"
 }
```
となればもう使えてます。JSONで表示されるんですね...

# なぜこのエラーになるのか
エラー文のまんまですが、主な原因は2種類あります。
## Cause1 : aws-sam-cliがインストールされていない
AWS Toolkit for Jetbrainsは単独で動作するのではなく、aws-sam-cliライブラリを前提としたプラグインです。
ですのでpipでaws-sam-cliをインストールしてあげればいけるはず。
pipのインストール方法はsuzuki_yさんのが参考になります
https://qiita.com/suzuki_y/items/3261ffa9b67410803443

## Cause2 : aws-sam-cliのバージョンが古い
aws-sam-cliはライブラリのアップデートが激しく、日々最新機能が追加されています。
今回の --infoも v0.7.0の[#776](https://github.com/awslabs/aws-sam-cli/pull/776)で追加されたようです。
18日前に0.7.0で現在0.8.1ですから本当に開発スピードが早いですね..

以上です。皆様のお助けになれれば幸いです。
transitionで透明度を変えるアニメーション効果を入れたら要素が変形してしまった際の対応

#はじめに
原因などは調査していないため、現象と解消方法のみ載せてあります

#現象
- 背景画像を設定したdiv要素にhover時に透明度を下げるtransitionを入れたら、画像が変形するものとしないものがあった

## その際のコードサンプル
```
.thyumbnail-wrapper .thumbnail{
	width: 100%;
	background-image: url(/img/path/file.png);
	background-repeat: no-repeat;
	background-position: center center;
	background-size: cover;
}
.thyumbnail-wrapper:hover .thumbnail{
	opacity: 0.7;
	-webkit-transition: all 0.5s ease;
	-moz-transition: all 0.5s ease;
	-o-transition: all 0.5s ease;
	transition: all 0.5s ease;
}
```

#解消方法
## 結論
要素に`-webkit-backface-visibility: hidden;`を入れる

## 解決したコードサンプル
```
.thyumbnail-wrapper .thumbnail{
	width: 100%;
	-webkit-backface-visibility: hidden; <<<<<< 1行追加
	background-image: url(/img/path/file.png);
	background-repeat: no-repeat;
	background-position: center center;
	background-size: cover;
}
.thyumbnail-wrapper:hover .thumbnail{
	opacity: 0.7;
	-webkit-transition: all 0.5s ease;
	-moz-transition: all 0.5s ease;
	-o-transition: all 0.5s ease;
	transition: all 0.5s ease;
}
```
【Android】MacでSigned Apkを作るときにKey StoreのAliasを忘れてしまったときの対象方法

## :white_check_mark: conclusion

- keytoolというコマンドを使って確認する事ができる
- そのためにはkey storeのパスワードが必要
- パスワードをわすれてしまったときは[http://maxcamillo.github.io/android-keystore-password-recover/:title]を使う

## :pencil2:  article

key storeをそのaliasのアンマッチが発生した際に

```
No key with alias 'alias-name' found in keystore 
```

というようなエラーが発生します。
そういうときは、　```keytool```コマンドを使ってaliasを確認します。

僕の環境ではiTerm2ですが、Android Studioからも「View」 -> 「Tool Windows」 -> 「Terminal」からコマンドを実行する事ができます。
実行するコマンドは以下です。

```
keytool -list -keystore /your-path-to/name.store
```

※/your-path-to/name.storeの部分を適宜置き換えください。

そうすると作成日付の前にalias文字列が表示されます。

## :paperclip:  refs

[http://vancelucas.com/blog/listing-aliases-inside-an-android-keystore-file-with-keytool/:title]

[https://qiita.com/mmusasabi/items/e0dbd1fb01c0410f791a:embed:cite]

[https://cpoint-lab.co.jp/article/201803/【android】リリース版アプリをビルドするときにkey-aliasを/:embed:cite]

[https://code.google.com/archive/p/android-keystore-password-recover/:title]
よく使うターミナルコマンド

普段よく使うものは覚えてきても、たまにしか使わないものは忘れることがあるので、メモ！
当たり前かもしれないけど、キーボードだけで作業ができるようになりたい。

## ls
カレントディレクトリにあるファイルを表示

## cd
指定したパスに移動する

```ruby:example
cd <パスを指定> 
```
指定しない場合はホームディレクトリに移動

```ruby:example
cd ~/
```
.. で一つ上の階層に移動する

```ruby:example
cd ..
```
## pwd
カレントディレクトリのパスを表示する

## touch
中身が空のファイルを作成する

```ruby:example
touch <ファイル名>
```

## mkdir
```ruby:example
mkdir <ファイル名>
```

## mv
ファイルやディレクトリの移動、名前の変更

```ruby:example
mv <移動元> <移動先>
```

```ruby:example
mv <元の名前> <変更後の名前>
```

## cp
ファイルやディレクトリのコピー

```ruby:example
cp <コピー元ファイル> <コピー先ファイル>
```

```ruby:example
cp-r <コピー元ディレクトリ> <コピー先ディレクトリ>
```

## rm
ファイルやディレクトリを削除

```ruby:example
rm <ファイル名>
```

```ruby:example
rm-r <ディレクトリ名>
```

## open
Finderでファイルを開く
ゲームプラットフォームQAの極意　~Part.3 一大イベント集~

# 前置き
この頁はゲームプラットフォームQAの特徴について記載していく。
対象としては**長期運用**しているプラットフォームであり、新規開発の際のQAでないことは念頭に置いていただきたい。

[Part1.ゲームアプリQAとの違い](https://qiita.com/bug-taro/items/ebf9f4d11f66e09ae24a)
[Part2.イレギュラーテスト](https://qiita.com/bug-taro/items/e09866f8e7501ff469a4)

# ゲームプラットフォームQAの一大イベント
Part3はゲームプラットフォームQAにおける一大イベントについて記載する。
(宣言していた課金機能周りではなく申し訳ございません)

ゲームプラットフォームQAの大規模施策は
**年一で必ず到来するイベント**と**数年に一度発生するイベント**の2種類が存在する。
具体的な施策は下記になる。

 - 年一で必ず到来するイベント
  - 新ガジェット発売
  - 新OSリリース
 - 数年に一度発生するイベント
  - 法改正
  - 規約の大幅な変更
  - 新課金機能導入

### 新ガジェット発売
新しいスマートフォン発売などがこれにあたる。
上記の中でも**新規機能が搭載されている場合**や**新iPhoneが発売される場合**は温度感が非常に高くなる。
特に林檎信者の多い日本ではiPhoneへの感度が非常に高く、多くの開発チームから依頼が来るため
ガジェット数起因でテストが止まらないよう**必要数を事前に調査しておく必要がある。**

意識すべき点として検証タイミングがリリース後となるため**検知した不具合がそのまま市場不具合になってしまう。**
そのため不具合の影響を可能な限り小さくする必要があり
前端末との機能差異などを参考にしつつ**事前に検証項目に優先度をつけて**効率的にテストを実施する場合が多い。

### 新OSリリース
新OS、特にスマートフォンの主要OSであるiOSとAndroidの新Verリリースがこれにあたる。
iPhoneの場合など上記のガジェット発売と連動することも多く、必然的にテストが立て込むことになる。
同じOSとはいえiOSとAndroidとでは意識すべき点が異なってくる。

新iOSで意識すべき点として**全iPhoneが一斉にアップデートされる**
そのため新OS上で問題があった場合に広範囲に影響が出てしまうためβ版などで事前にテストを実施する必要がある。

対して新Androidで意識すべき点として**一斉アップデートではなく一部スマートフォンから順次アップデートになる。**
そのためユーザーに影響が出始めるのがiOSに比べて非常に遅くなる。
QAとしては喜ばしいことなのだが、その弊害として開発側の温度感が低くなる傾向になり
**QA側でスケジュール管理をしないとグダグダになる危険性がある**ことは注意が必要である。

### 法改正
消費税の増税などがこれにあたる。
基本的には「〇月1日0時から新しい税が適用されます」というケースが多くテスト項目数も膨大になるため
**深夜対応と大規模な検証リソースの管理が約束されたイベントになる。**

意識すべき点として上記のように深夜の大規模稼働になる場合が多いので
**事前からのリソース調整と深夜稼働体制の確立が必須となる。**

### 規約の大幅な変更
Google/Appleの規約変更がこれにあたる。
例としてはそれぞれのプラットフォームで専用通貨の設定が必要になった規約変更が記憶に新しい。

意識すべき点としては法改正の場合と同様にリソース調整と深夜稼働体制の確立に加えて
**綿密な影響範囲の洗い出し**が必要になることが多い。
規約を参照している箇所や規約へのリンクが存在するページは非常に多いため
漏れがないように事前に開発側と認識を合わせてテスト内容をすり合わせる必要がある。

### 新課金機能導入
文字通り新しい課金機能の導入がこれにあたる。
月をまたぐことで課金額がリセットされることの確認などが発生するため
記載したイベントの中で唯一**リリース時のテストが複数月にまたがることが約束されている。**
また課金額のリセットなどが基本的に1日の0時であることや
ユーザーへの影響を最小限にとどめるために深夜リリースになる場合が多いことから
**複数回の深夜対応が発生する場合が多い。**

意識すべき点としてシステムの作りにもよるが**ゲームプラットフォームとGoogle/Appleの表記が連動していないことがある。**
そのためゲームプラットフォーム上で"100円"と記載されていてもGoogle/Apple上では"200円"で設定されているケースがあるためそれぞれの画面上での確認が必須となる。
また他の課金機能に影響が出ることもあるため**影響範囲のすり合わせおよびリグレッションテストは必ず実施することになる。**

# 最後に
どのゲームプラットフォームQAでも上記のイベントが発生することになると考えられる。
そして各項目に記載したように細かい調整や体制の検討、さらに都度の深夜対応が必要になるため
**頭も体も疲弊する覚悟をもって臨んでいただきたい。**

Part4ではゲームプラットフォームの課金機能周りのQAについて記載する。
探索アルゴリズムとソートアルゴリズムの動き

# 探索アルゴリズム

探索アルゴリズムとは、以下のようなデータの列から欲しいデータをさがすアルゴリズムです。

| インデックス|0|1|2|…|n|
|:--:|:--:|:--:|:--:|:--:|:--:|
| データ|d0|d1|d2|…|dn|

探索アルゴリズムには、いくつか種類があります。
この中から、メジャーな線形探索と二分探索についてみてみましょう。

## 線形探索
一番簡単な探索方法です。
データの先頭d0から、順番に末尾dnまでインデックスを1つずつ増やしながら、目的のデータと一致するかどうか調べます。

## 二分探索
二分木を使った探索方法です。
この探索方法を使う時は、データが昇順、または降順にソートされていることが前提となります。
二分探索では、範囲の真ん中のデータと目的のデータを比べて、探索する範囲をどんどん狭めていきます。

実際に昇順でソート済みのデータ列から2を探してみましょう。

|2|4|5|8|9|10|22|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|

二分探索では、まず調べる範囲の中央の値に注目します。
ここでは、中央値として8に注目します。
目的のデータ2は8よりも小さいので、2があるとすれば8よりも左側だと考えられます。

そこで、探索範囲を8より左のデータ列に狭めます。

|2|4|5|
|:--:|:--:|:--:|

また、この範囲での中央値4と目的のデータを比べます。
2の方が小さいので、このデータ列に2があるとすれば、4より左側ですね。
更に、左側に範囲を狭めましょう。

|2|
|:--:|

この範囲の中央値は2です。
目的のデータ2と比べると、一致します。
このデータ列から目的のデータ2を見つけることができました。

# ソートアルゴリズム
ソートアルゴリズムとは、データ列を昇順、または降順に並び替えるアルゴリズムです。
今回は、有名なバブルソートと選択ソートを見ていきます。

## バブルソート
バブルソートでは、隣り合う要素の大小を比較して、入れ替える操作を繰り返すことでデータ列を並び替えます。

実際に次のデータ列を昇順にソートしてみます。

|5|4|3|
|:--:|:--:|:--:|

まず先頭のデータ5と2番目のデータ3を比べます。5の方が大きいので、5と3を入れ変えます。

|4|5|3|
|:--:|:--:|:--:|

次に、2番目の要素と3番目の要素を比較します。
2番目の要素5の方が大きいので、5と4を入れ替えます。

|4|3|5|
|:--:|:--:|:--:|

末尾の要素との比較が終わると、末尾に一番大きい数字が表れます。
よって末尾はこれで固定します。
末尾の要素をソートの範囲から外します。

|4|3|
|:--:|:--:|

末尾を外したデータ列で、一番値の大きいデータを同様の処理を繰り返してこの範囲の末尾に移動させます。

|3|4|
|:--:|:--:|

これを繰り返すことで、データ列を昇順に並び替えることができます。

|3|4|5|
|:--:|:--:|:--:|


## 選択ソート
昇順の選択ソートでは、先頭より小さい要素を見つけるたびにその要素と先頭の要素を入れ替えることで、並び替えます。

実際に次のデータ列を昇順にソートしてみます。

|5|4|3|
|:--:|:--:|:--:|

まず、先頭の要素5と2番目の要素4を比べます。
4の方が小さいので、データを入れ替えます。

|4|5|3|
|:--:|:--:|:--:|

次に現在の先頭の要素4と3番目の要素3を比べます。
3の方が小さいので、データを入れ替えます。

|3|5|4|
|:--:|:--:|:--:|

末尾までチェックしたら、先頭にはデータ列の中で1番小さい要素がはいっています。
そのため、ソートする範囲から先頭を取り除きます。

|5|4|
|:--:|:--:|

同様の処理を狭めた範囲でも繰り返すことで、最終的にデータ列を昇順に並び替えることができます。

|3|4|5|
|:--:|:--:|:--:|
electron上のreactから外部コマンド(child_process)を使う

### 概要/要約
electron上のreactから直接ローカル環境にアクセスすることはできない。
一度windowオブジェクトを挟んでrequireすることで解決できる。

```js

const childProcess = window.require("child_process")
childProcess.exec("ls", (error, stdout, stderr) => {
if(error != null){
   console.log(error)
}else{
  console.log(stdout)
}
})
```



# はじめに

electronが参照するhtmlファイルとしてreactによってbuildされたファイルを指定することで、electron上でreactを使うことができる。
https://qiita.com/maecho/items/c34de805101ae489532e
https://qiita.com/tashxii/items/290a3421d520bdae0c36

reactのために蓄積された資源をデスクトップアプリに用いることができるのでとっても便利。
しかし、もともとwebのために作られた技術なのでいろいろ問題もある。

# 問題点

electronはローカルで動作するアプリケーションであるため、ローカル環境にアクセスすることができる。(ローカルにインストールされたコマンドを実行、ローカルのファイルを扱う、など)
しかし、reactからこのような処理を実行しようとするとエラーとなってしまう。

```js

const childProcess = require("child_process")
childProcess.exec("ls", (error, stdout, stderr) => {
if(error != null){
   console.log(error)
}else{
  console.log(stdout)
}
})
```

```
TypeError: Cannot read property 'exec' of undefined
```


# 解決法
一度electron側のオブジェクトを挟めば良い。
直接require()するのではなく、window.require()とする。

```js

const childProcess = window.require("child_process")
childProcess.exec("ls", (error, stdout, stderr) => {
if(error != null){
   console.log(error)
}else{
  console.log(stdout)
}
})
```


# 原因
調査中

reactはhtmlファイルを生成するだけなのでelectron側を直接見ることができない、ので、
requireが参照する場所がelectronとは違う場所になっちゃうからみたいな理由かなぁ......

requireが参照してる場所をしらべればわかりそう。


# おわりに

electron+reactを使うと雑アプリが量産できるのでおすすめ。


### おまけ
cloneしてnpm installするだけで動く雛形をつくったのでご活用ください。
(テストとかは全くしていないので僕の環境以外で動くかどうかはわからないです)
https://github.com/tortuepin/min-react-electron
仮想通貨とブロックチェーン技術

## はじめに
今年に入ってから知ったブロックチェーンと仮想通貨に関して、個人的に興味あるところを簡単にポイントを纏めたものになります。

## ブロックチェーン
　ブロックチェーンとは
　・分散型台帳技術

　ブロックチェーンで実現できること
　・事例

```
　　→ 仮想通貨（中央集権ではない取引の正当性の保証）
　　→ 医療への活用（整合性を保ちつつ削除される恐れもなく共通のデータベースでデータを管理することができる）
　　→ 食肉や電力での利用（どこで誰が生産したものかを証明する）
　　→ 本やソフトの中古販売を取引履歴をブロックチェーン上に保存すれば、
　　　出版社やライセンス元への利益の一部の還元を行うことが可能になる
```

## 仮想通貨
　ビットコイン

```
　・元となる仕組みは日本人の「ナカモトサトシ」
　・仮想通貨の最大の取引所のマウントゴックスは日本の渋谷にあった
　ICOで発行された多くの仮想通貨
　・仮想通貨が乱立していて、ICOは米国では下火
```

　今後は、大きく価値を変動させながらいずれ価値が安定化していき、安定化した後リアルに現実世界でも利用されるようになる見方が一般的

## 仮想通貨に関わるブロックチェーンの技術
ブロックチェーンを俯瞰

```
　・ビットコインとアルトコイン
　・Bitocoin2.0、イーサリアム
　・ICOとDAPPS
　・これから

　　アルトコインは大体パラメータ変えただけのもの
　　2013年にアルトコイン２０００種類になる
```

2.0プラットフォーム

```
・Asset Issuring(別のコインを発行)
・マルチパーパス（認証、取引など）
```

2.0イーサリアム

```
・何でも出来るプラットフォーム
　Turing complete, virtual machine
   Arbitrary Script
```

イーサリアムの問題

```
  ・トランザクションが遅い
  ・バグが取りきれない
  ・Dappコインが多すぎる
```

新しい動き

```
・ハイスピードなコンセンサスプロセス
・Decentralized Exchange Protocols
・Inter Blockchain Protocols
・Layer 2 Solutions
```

## ビットコインの課題
・全てのトランザクションを全ノードで共有する必要があり
　トランザクションが増えるとそれに耐えられなくなってくる

性能限界

```
  VISA  8000Tps
  ビットコイン　7Tps
　イーサリアム　10Tps
　Tps:1秒あたりトランザクション数
```

ブロックサイズ制限
　ブロックあたり１MBが上限

現状

```
・ネットワーク需要はすでにブロックサイズ上限に達している
　ブロックへの取り込み待ちトランザクションが溢れている
・マイナーはトランザクション手数料の支払いが多い順にブロックに取り込むため、
　手数料をケチると後回しにされ、何日も取り込まれない可能性がある
```

匿名性とプライバシー

```
・匿名性高いから危険？
　全世界に公開されているので、そこまで匿名性高くないと言われている
```

匿名化の試み

```
・攪拌サービス（現在は殆ど使われていない）
・CoinJoin（Bitcoinトランザクション上で攪拌サービスができる）
・リング署名（一つ署名に一人、リングは１つの署名に複数人）
・秘匿トランザクション（送金額をブロックチェーン上から省く）
・TumbleBit（送金元と送金先を隠す、中央の人が隠す）
・ゼロ知識証明（完全な匿名性を目指して）（ZerocoinとZeroChache）
・Lightning　Network;
・Minblewinble（途中経路を消すことができる）
```

## イーサリアム最前線
Sharding

```
・ある種の処理は恩恵を受けられない
　イーサリアム２.０はCasperとShardingその他技術を盛り込んだものとして開発されている
　Shardを跨いだ一括Txが一瞬で済ませられないことで、外部コントラクトよびだしなどは最大性能が出せなさそう
　1個の価値を別のコントラクトに持ってくるということができない
　13000Tps理論値、おそらく7000Tps
```

Plasma

```
・Solidity使うとセキュリティ落ちる
　EVM Plasmaとセキュリティ
　EVMが使えるPlasmaは、お金を引き出そうとするTxを許可していいものか確認するコストが
　高くなるため基本的に、Plasmaの形態を取れず、Parity BridgeなどでFederationで引き出しを実装する
・イーサリアムと関係ないEVMと別
　引き出す時のコストが高かったけど、誰か一人に報酬の代わりに検証させようとする仕組み
　引き出しの安全性をお金で買う、ということ
```
AE　テキストの色や線幅をjsonで一括管理

#※2019/01/10記事最後に更新あり

#やりたい事
今回大量のテキストがあるのでテキストの管理をjsonで行う。

管理する内容は
テキストの塗り
テキストの線の塗り
テキストの線幅
レイヤースタイル等々

#内容
①jsonファイルに設定パラメーターを書いておく。内容はこんな感じ↓

```json
{
	"dropShadowSetting":{
		"spred":20,
		"size":20
	},
	"textSetting":{
		"fill":"f0f8ff",
		"stroke":"f0f8ff",
		"LineWidth":0
	}
}
```

②テキストレイヤーにアニメーターを追加。
・塗りのカラー
・線のカラー
・線幅
今回はこの３つ

③アニメーターにエクスプレッションを書く。
まず色のエクスプレッション

```jsx
//まずはjsonのデータを受け取る。
stroke = footage("common.json").sourceData.textSetting.stroke;
//↑これでjsonファイルのstrokeに格納された「f0f8ff」を取ってくる。

//次にRGBに変換するメソッド
function colorSetToRgb(set){
        var bigint = parseInt (set, 16);
        var r = (bigint >> 16) & 255;
        var g = (bigint >> 8) & 255;
        var b = bigint & 255;

        return [r/255,g/255,b/255];
   }

//メソッドを呼び出してjsonのデータを処理する
myClolor = colorSetToRgb(stroke);
//↑これでaの中にはRGBの３次元の配列が格納されている。
//ただこれではまたRGBの３次元配列なのでAEでは使えない。AEでは４次元が必要で、[R,G,B,Alph]のAlphが必要。

//ここでAlphを配列にプッシュする。
myClolor.push(0);

//これで完了mycolorが[r,g,b,a]の4次元になっています
myClolor 
```

線幅に関しては簡単でそのままjsonのデータを取ってくるだけです。
アニメーター線幅にエクスプレッションを書く。

```jsx
footage("common.json").sourceData.textSetting.LineWidth
```
このような感じで残りのレイヤースタイルのパラメーター等も設定できます。
jsonで行うとすごーく便利ですね。

あとからちょっとドロップシャドウちょっと変えてなどと言われてコンポジション開けて
テキストレイヤー選択してパラメーター開いて・・・
そんなのを何十・何百もあった日には・・・

＃最後に
いまだにAEはテキストパネルのパラメータはextendscriptからしかいじらしてもらえないですね。
これもExpressionで可能になれば、便利になるんですけどね。

今回の内容はjsonの使い方で以前にも似たような記事で紹介しましたが、今回はカラー設定で少し工夫が必要だったので
記事を書いてみました。
ぜひ参考にしてみてください。

#2019/01/10追記内容
エクスプレッションのリファレンスを見たのですが、このような記事を発見

16 進数から RGB へのカラー変換メソッド（エクスプレッションのリファレンス）
この hexToRgb() カラー変換メソッドは 16 進カラー値（例： #FF00FF）を RGBA カラー値に変換します。これは、カラーパラメータを JSON や CSV／TSV データソースでは 16 進文字列として表現されるカラー値にリンクするのに役立ちます。

エクスプレッションメソッド：

hexToRgb(hexString) は 16 進トリプレットスペースのカラーを RGB に、または 16 進カルテットスペースを RGBA スペースに変換します。16 進トリプレットでは、アルファはデフォルトで 1.0 になります。

パラメーター：

hexString	数字または A～F の文字のみを含む 16 進トリプレット（6 桁、アルファチャンネルなし）またはカルテット（8 桁、アルファチャネルを含む）を表現する文字列。オプションの先頭文字の 0x、0X、または # は無視されます。8 桁を超えた文字は無視されます。
戻り値：

RGBA カラー値の配列。

例：

次のいずれもが [1.0, 0.0, 1.0, 1.0] を返します。

hexToRgb("FF00FF")
hexToRgb("#FF00FF")
hexToRgb("0xFF00FF")
hexToRgb("0XFF00FFFF") 注意：8 桁の 16 進カルテット：最後の 2 桁はアルファを 1.0 に設定します。

#試してはないけど
環境がwindows7なのでAfter Effects CC (16.0)にアップデート出来ないため（泣）
After Effects CC (16.0)からhexToRgb（）のメソッドが追加されたのですね。

なのでもっと簡単になりますね。
この記事は遠回りの方法として見てください(笑)
試しては無いのですがjsonから値を取ってきたとして
hexToRgb(stroke)でいけるかと。。。
Railsのmigrationで後からNULL制約を設定する


NULL制約の追加には `change_column_null` を使います。
引数にはテーブル名、カラム名、null falseかtrueか、変更後のデフォルト値

```ruby
class ChangePointColumnOnPost < ActiveRecord::Migration[5.2]
  def change
    change_column_null :posts, :point, false, 0
  end
end
```

https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-change_column

## これだとちょっと問題が…

ここで設定されるdefaultは現在nullのカラムを変更するためだけのもので、テーブルの制約にdefault値が設定されるわけではないので、nullでレコードの追加をしようとした際にコケてしまいます。
そのため別でデフォルト値の設定が必要になります。

NULL制約追加＋デフォルト0を設定するコード
postsテーブルのpointカラムがNULL制約なし、デフォルトNULLになっているのを、NULL禁止、デフォルト0に変更するマイグレーションになります。

```ruby
class ChangePointColumnOnPost < ActiveRecord::Migration[5.2]
  def change
    change_column_null :posts, :point, false, 0
    change_column_default :posts, :point, from: nil, to: 0
  end
end
```

※自ブログからの転載です
http://akinov.hatenablog.com/entry/2019/06/20/164836
py-translator を使ってみる（IndexError: list index out of rangeエラーの回避）

https://pypi.org/project/py-translator/ に従って、installして実行してみた。

> https://pypi.org/project/py-translator/ より引用：

> Google Translate - Python Library. The end goal is a simple application for translating text in the terminal. Text can be generated interactively or programmatically in the shell environment.

# 環境

```
$ python --version
Python 3.6.7
```

# インストール

```
$ pip install py_translator==1.8.9
```


# 実行

```
$ python
Python 3.6.7 (default, Nov 15 2018, 16:29:08)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from py_translator import Translator
>>> s = Translator().translate(text='Hello my friend', dest='es').text  <== スペイン語に翻訳
>>> print(s)
Hola mi amigo
>>> s = Translator().translate(text='Hello my friend', dest='ja').text  <== ja指定してみる
>>> print(s)
こんにちは、友よ
```

# エラーが出る場合


実際のところ、install直後は、次のようなエラーが出ていた

```
$ python
Python 3.6.7 (default, Nov 15 2018, 16:29:08)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from py_translator import Translator
>>> s = Translator().translate(text='Hello my friend', dest='es').text
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python/lib/python3.6/site-packages/py_translator/client.py", line 172, in translate
    data = self._translate(text, dest, src)
  File "/usr/local/python/lib/python3.6/site-packages/py_translator/client.py", line 75, in _translate
    token = self.token_acquirer.do(text)
  File "/usr/local/python/lib/python3.6/site-packages/py_translator/gtoken.py", line 184, in do
    self._update()
  File "/usr/local/python/lib/python3.6/site-packages/py_translator/gtoken.py", line 56, in _update
    self.tkk = self.RE_TKK.findall(r.text)[0]
IndexError: list index out of range
```

[Google updated how token is displayed in response. #8](https://github.com/markolofsen/py_translator/pull/8/commits/410ccdcafdcc2a087b455b4e6a5eb7fef13f1c69)
に従って、

/usr/local/python/lib/python3.6/site-packages/py_translator/gtoken.py
を以下のように修正。

```gtoken.py
    RE_TKK = re.compile(r'TKK=\'([^\']*)\';', re.DOTALL)  <--- この行を消して
    RE_TKK = re.compile(r'tkk:\'(.+?)\'', re.DOTALL)　　<--- この行を追加
```

参考：[py_translator stopped working with “IndexError: list index out of range”](https://stackoverflow.com/questions/53567759/py-translator-stopped-working-with-indexerror-list-index-out-of-range)
docker で nuxt.js を開発環境を建てるだけ

docker で nuxt.js の動作環境を構築

## インストール

下記、サイトよりインストール  
Macなので、download for macからDownload  
https://www.docker.com/get-started

```
$ docker -v
Docker version 18.09.0, build 4d60db4
```

インストール後、ターミナルにて確認。  


## DockerFileを作成
CentOSイメージにNode.jsを構築する形でも良いが、  
OfficialなNode.jsイメージがあるようなので、そちらを利用する。  
[DockerHub - node.js (official))](https://hub.docker.com/_/node/)  

```Docker:Dockerfile
# イメージの指定
FROM node:10.14.1-alpine

# コンテナ内で cd /app しているようなもの
WORKDIR /app

# コマンド実行
# linux 最新化,gitのインストール、npm最新化、vue-cli インストール　をしている。
RUN apk update && \
    apk add git && \
    npm install -g npm && \
    npm install -g vue-cli

ENV HOST 0.0.0.0
EXPOSE 8080
```

## docker-compose.ymlの作成

[Docker Compose](http://docs.docker.jp/compose/toc.html)  
[docker-composeを使うと複数コンテナの管理が便利に](https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)


```yml:docker-compose.yml
version: '3'

services:
  nuxt:
    # Dockerfileの場所
    build: .
    tty: true
    # コンテナ起動時のコマンド
    command: npm run dev
    # ホストOSとコンテナ内でソースコードを共有
    volumes:
      - .:/app
    # コンテナ内部の3000を外部から８０８０でアクセス
    ports:
      - "8080:3000"
```

## ビルド

```sh
$ docker-compose build
```
完了後、下記のようにimageができている。  

```sh
$ docker images

REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
nuxt-docker-sample_nuxt   latest              69c41d18ce12        About an hour ago   137MB
node                      10.14.1-alpine      c7f513f4c081        3 days ago          70.7MB
```


## Nuxt.jsのStart

コンテナ内で、npmなどを実行したい場合は下記のように指定する  

```sh
docker-compose run --rm <コンテナ名> <コマンド>
```

#### nuxt.js セットアップ
```s
$ docker-compose run --rm nuxt npx create-nuxt-app

Creating network "nuxt-docker-sample_default" with the default driver
npx: installed 402 in 21.927s
> Generating Nuxt.js project in /app
? Project name nuxt-frontend
? Project description My fantabulous Nuxt.js project
? Use a custom server framework koa
? Use a custom UI framework element-ui
? Choose rendering mode Universal
? Use axios module yes
? Use eslint no
? Use prettier no
? Author name
? Choose a package manager npm
Reinitialized existing Git repository in /app/.git/
```

### コンテナ立ち上げ

```sh
$ docker-compose up -d
```
これだけで、起動し、dockerc-compose.ymlの「command: npm run dev」を
実行してくれる。

-d はデーモン起動の為。

#### 状態確認

```sh
$ docker ps

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS                              NAMES
aa4c6ac25962        nuxt-docker-sample_nuxt   "npm run dev"       About an hour ago   Up About a minute   8080/tcp, 0.0.0.0:8080->3000/tcp   nuxt-docker-sample_nuxt_1
```

落とすときは...

```sh
$ docker-compose down
```

以上で、完了です。
[React Native] Androidビルドで Error: Duplicate resources

突然Androidのビルドができなくなりました。

```
  [drawable-xxxhdpi-v4/node_modules_reactnavigationstack_dist_views_assets_backicon] {PROJ_DIR}/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigationstack_dist_views_assets_backicon.png        [drawable-xxxhdpi-v4/node_modules_reactnavigationstack_dist_views_assets_backicon] {PROJ_DIR}/android/app/build/generated/res/react/debug/drawable-xxxhdpi/node_modules_reactnavigationstack_dist_views_assets_backicon.png: Error: Duplicate resources
```

エラーでぐぐると[これ](https://stackoverflow.com/questions/47084810/react-native-android-duplicate-file-error-when-generating-apk)がヒットします。
試してみましたが解決せず。

[こっち](https://stackoverflow.com/questions/52632950/react-native-0-57-1-android-duplicate-resources)の方法で解決しました。

- 既存の `android/app/src/main/res/drawable*/*` の画像をすべて削除
- `./gradlew assembleDebug` を実行


午後いっぱい潰れてしまいました。
AR ( Vuforia ) で Effekseer

こんにちは。サイドスポイラーこと、ねもこです。klis16のおばさんです。
この記事は [AmusementCreators AdventCalendar2018](https://adventar.org/calendars/3442) の７日目の記事でございます。

※初心者記事なのでご注意ください

#なにをするの？
ARマーカにエフェクトを描画するアプリを作りたかったので、

- Unity 2018
- Vuforia (AR)
- Effekseer (エフェクト)

でやってみます。

#各種コンポーネントの導入
##Vuforia
この記事を参考にさせていただきました。
[【Unity】Vuforiaを使ってARを表示する手順（2018年版）](http://nn-hokuson.hatenablog.com/entry/2018/08/28/192028)

古いバージョンのエディタだとこの通りでないので、まずバージョンアップしましょう。"Vuforia" にチェックするのをお忘れなく。

##Effekseer
公式に全部書いてあります。
[Effekseer UnityPlugin Manual](https://effekseer.github.io/Help_Unity/index_ja.html)

エミッタコンポーネントは Vuforia の ImageTarget の子として配置します。
ヒエラルキーはこんな感じ。
`ARCamera`
`ImageTarget`
`--EffekseerEmitter`

#苦戦したところ
エミッタから再生はできたのですが、スクリプトから再生するのに苦戦しました。

`EffekseerSystem.PlayEffect("effect", transform.position);`
だと、再生はされるのですが、座標系が違うのでARにならない。
座標周りで脳みそを使いたくなかった（使ったところでわからない）ので、エミッタにアタッチされている`EffekseerEmitter.cs`のなかの`Play()`で再生することにしました。

```
this.effekseerEmitter = GameObject.Find("ImageTarget/EffekseerEmitter");
this.effekseerEmitter.GetComponent<EffekseerEmitter>().Play();`
```

`GameObject.GetComponent<T>()`でそのGameObjectが持つコンポーネントの中の色々にアクセスできるらしいです。

#できた
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/314840/2dacb682-7a07-fe3a-5373-30077848e8eb.gif)
わーい！できたー！！（ここまで何一つ理解していない）
これは .apk を生成してAndroid 実機で動作確認した様子です。
（マーカださいとか言わないこと！）

天才が多い分野は脳細胞１ニューロンも使わなくてもなんかできちゃうからいいっすね！
あとは作りこむだけです！

※エフェクトは投稿エフェクトページにございました [BrokenDesk 様](https://effekseer.github.io/jp/contributes/MAGICALxSPIRAL/index.html)のものを使用させていただきました


#p.s.
雙峰祭とか、PCゲームの試遊だけでなく色んなタイプのゲームを提供できたら面白そうだなと思うんですけど、後輩諸君いかがですか？（他力本願）
Bootstrapを使う際のRailsでのフラッシュの仕組み

#初めに
「Ruby on Rails tutorial」　や　「Ruby on Rails 5 の上手な使い方」にのっていたflashメッセージの表示するシステムを忘れないように書きます。

#flashについて

```ruby:flash.rb
flash[:notice] = "フラッシュです"
redirect_to path
```

見たいな感じで使います。

#bootstrapのカラーについて
bootstrapでは
alert alert-***　
みたいなクラスを設定することでいい感じでデザインしてくれます。
![al.png](https://qiita-image-store.s3.amazonaws.com/0/207921/8be69064-476c-076c-4188-775630588dfa.png)

こんな感じです

いろんな色が用意されていて

alert-success
alert-danger
alert-info
alert-warning

があります。

この四種類のalertを別々に書いてやろうとすると…

```erb:flash-all.rb
if flash[:notice]
  <div class="alert alert-notice">
    <%= flash[:notice] %>
  </div>
elsif flash[:info]
  <div class="alert alert-info">
    <%= flash[:info] %>
  </div>
elsif flash[:danger]
  <div class="alert alert-danger">
    <%= flash[:danger] %>
  </div>
elsif flash[:warning]
  <div class="alert alert-danger">
    <%= flash[:danger] %>
  </div>
end

```

と結構長くなってしまいます。


#application_helper.rbにヘルパーメソッドを書く


この長いのをどうにかするためにapplication_helper.rbに


```ruby:application_helper.rb

def flash_message(message, klass)
  content_tag(:div, class: "alert alert-#{klass}") do
    concat content_tag(:button, 'x', class: 'close', data: {dismiss: 'alert'})
    concat raw(message)
  end
end


```

#application.html.erbでさっきのメソッドを使う

```erb:application.html.erb

<%= flash_message(flash[:success], :success) if flash[:success] %>
<%= flash_message(flash[:error], :danger) if flash[:error] %>
<%= flash_message(flash[:alert], :warning) if flash[:alert] %>
<%= flash_message(flash[:notice], :info) if flash[:notice] %>

```


こうすれば解決です。

ちょっとすっきりしました。

何か間違いがあればご指摘いただければと思います。


参考文献
「Ruby on Rails5 の上手な使い方」
https://www.amazon.co.jp/Rails-5の上手な使い方-現場のエンジニアが教えるRailsアプリケーション開発の実践手法-Engineers-Books/dp/4798153095/ref=sr_1_4?ie=UTF8&qid=1544168971&sr=8-4&keywords=ruby+on+rails+5
VSCodeでターミナルのプロセス コマンド '/bin/bash -l' を起動できませんでした (終了コード: 1)の対処方法

# 問題
vscodeの統合ターミナルで分割を押すと
`/bin/bash -l' を起動できませんでした (終了コード: 1`
が返ってくる。

/bin/bashは存在するにも関わらず分割できない。作業が捗らない。

# setting.jsonの修正
`"terminal.integrated.splitCwd": "inherited",`
として設定されているが、
`"terminal.integrated.splitCwd": "initial",`
に変更する事でこの問題を対処した。

ただ私の技術力不足で、なぜこれで解決したのかはわからなかった。
申し訳ないですが、もし同じ問題が発生した場合、やって見て下さい。
2018年スタイルズ Advent Calendar まとめ

https://qiita.com/advent-calendar/2018/stylez
Stylez Advent Calendar 2018 の 25日目です。

StylezでAdvent Calendarを始めたのは2015年の ownCloudからでした。
ownCloudの情報をアウトプットすることを目標に始めたのが始まりです。
ちょっと、どういう感じだったか振り返ってみましょう

## 2015年
Advent Calendarというのを知ったのがこの時で、25日中スタイルズのメンバー(3名)が10日分書いています。

ownCloud Japan Advent Calendar 2015 - Qiita
https://qiita.com/advent-calendar/2015/owncloud

まだ、会社としてAdvent Calendarをやろうとは考えておらず、1部署内だけで実施しました。
全部埋まりきらなかったのですが、社外の人にも書いていただいて嬉しかったことを覚えています。
ちなみに、この時の記事がownCloudの書籍の元になったような気がします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/b3784efd-8be0-71f7-a341-48db9f62566d.png)


## 2016年
2016年は自分でQiitaに結構な数の記事を書いたので社内でもやってみようと思い立ち、社内の誰にも相談せずに立ててみました。

Stylez Advent Calendar 2016 - Qiita
https://qiita.com/advent-calendar/2016/stylez

この時は書いてくれる人は 7人でした。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/4018146b-e6a6-86da-39e8-c525614d318c.png)

1日目にこんなエモい記事を書いています..。
僕がQiitaに記事を書く理由 - Qiita
https://qiita.com/ynott/items/b3b93c36da43e52607db

最終日に`社員比率で言えばイケてるよ!`という無謀な論調で閉めています。
Stylez Advent Calendar の締め - Qiita
https://qiita.com/ynott/items/de2da50f2097aac15281

## 2017年
2017年は昨年社内でいろいろ告知したにもかかわらずあまり埋まりませんでした。また別のAdvent Calendarで忙しくて私自身書けませんでした。投稿してくれたのは毎年投稿してくれているH君だけでした(ありがとう、0じゃなかった)

Stylez Advent Calendar 2017 - Qiita
https://qiita.com/advent-calendar/2017/stylez
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/d1a1806c-626c-eab8-42b5-da7748e5587a.png)

## 2018年
今年は随分と風向きが変わりました。

2018年12月24日の状況です。
14人の方が参加していただきました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/c7f596b5-d9dc-84d5-8f56-655f297407a6.png)
複数書いていただいている人もいますが、全般的に昨年とは随分違います。今回は、今年入社の新人から中堅と社長まで書いていただけました(各所にAdvent Calendarへの参加を促してもらった @tanamimi さんありがとう!)。

投稿内容も幅広くものとなっており、スタイルズらしいと思います。
今年は社内勉強会やLT大会なども実施され社内の体制も随分と変わってきたように思います。
来年もさらに発展の年にできるように頑張ります。

# まとめ
来年のAdvent Calendarが楽しみです。