OmniAICreator/Qiita-1.07M huggingface dataset:
pandas.read_csvで圧縮ファイルも読み込めちゃうの。とても便利！

[この前書いた内容](https://qiita.com/shotakaha/items/05287cd625176945322a)の続きをちまちまとやっていて、最初につまずいていたのが`gzip`圧縮されたログファイルを読み込むところでした。

# 圧縮ファイルの読み込み

[gzipモジュール](https://docs.python.org/3/library/gzip.html)使えばいいでしょ、ふふん簡単♪、とつまずく気配を感じていなかったのですが、これがどうにも読み込めない・・・もう、どんなエラーだったか忘れてしまったんだけれど、なぜだったんだろう？（もちろん、エラーメッセージで色々検索はしてみました）

う〜ん、と悩みつつ、なぜか、[pandas.read_csv](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)のリファレンスを眺めていました（なんで眺めていたのか分かりません）が、そしたら、なんと！`compression`というオプションがあるではないですか！

> compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
> For on-the-fly decompression of on-disk data. If ‘infer’ and filepath_or_buffer is path-like, then detect compression from the following extensions: ‘.gz’, ‘.bz2’, ‘.zip’, or ‘.xz’ (otherwise no decompression). If using ‘zip’, the ZIP file must contain only one data file to be read in. Set to None for no decompression.

> New in version 0.18.1: support for ‘zip’ and ‘xz’ compression.

オプションをきちんと読んでびっくり〜、キミは圧縮ファイルも空気読んで読み込んでくれる子だったのかー！

```python
import pandas as pd
df = pd.read_csv('gzipで圧縮されたファイル.gz', sep='\t', header=None)
```

デフォルトだと`compression = 'infer'`となっていて、ファイルの拡張子をみていい感じに判断してくれるそう。なので、`read_csv`の引数には明示しなくても大丈夫なはずです。

ただし、実行してみたら読み込みエラーが出たので`sep='\t'`を指定。また、読み込んだログの1行目がデータフレームの列見出しになってしまったので`header=None`も指定しました。

# 圧縮ファイルの書き出し

圧縮ファイルを読み込めるならば、圧縮ファイルを書き出しできるのではと思って、[pandas.DataFrame.to_csv](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html)もきちんと読んでみました。そしたら、やっぱり、`compression`オプションがありました。


> compression : str, default ‘infer’
> Compression mode among the following possible values: {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}. If ‘infer’ and path_or_buf is path-like, then detect compression from the following extensions: ‘.gz’, ‘.bz2’, ‘.zip’ or ‘.xz’. (otherwise no compression).
> Changed in version 0.24.0: ‘infer’ option added and set to default.

お〜、キミも空気読んで圧縮形式を選んでくれるんですね！


```python
df.to_csv('gzip圧縮したいファイル.gz', index=False, compression='gzip')
```

CSV形式で書き出す時に、`pandas.DataFrame`のインデックスは不要なので`index=False`にする。あと、たまに空気を読めていない時があったので`compression`は明示することにしました。
チームビルディングに心理学(MBTI性格診断)を用いると良い3つの理由

#MBTI is 何？
日本人が自分の血液型を知っているように、アメリカではこのMBTIという診断テストのタイプを使っています。MBTIは、性格を分析するようなテストで、心理学者カール・ユング氏の提唱する人間の情報処理機能を定義づけたタイプ論に基づく診断テストです。

アメリカでは、CIAや米軍にも取り入れられており、今時な大企業でも取り入れられているようです。
MBTIを使うとなぜ良いのかというのか？なぜ必要なのか？を今回説明します

MBTIテストは、[16personalities](https://www.16personalities.com/ja">16Personalities)このサイトから簡易的に受けることができます。出てきた結果をメモしておきましょう。

この診断結果の意味を詳しく知りたい人は[こちらから、MBTIについてを参照ください](https://uranaino.net/archives/684)

また、チームビルディングをするときには、この結果を周りの人と共有することで、初めて価値があるので、包み隠さず共有しましょう。

MBTIのスタンスとしては、あなたの性格傾向をあくまで示しているものであり、優劣を示しているわけではありません。なので、ENTJ型が優れているとかINTP型は優れていないという考え方はナンセンスです。

#MBTIを用いると良い理由
##その1. 相手のことを考え方・価値基準を理解できるようになる

ENTPやISFJのように診断結果のアルファベットの３文字目に注目してください。

このT/Fというのは、情報を取り入れたとき、その人はどのように情報を処理しているかを意味しています。
Tの場合には、物事の筋が通っているか、効率的か、といったように、ときには冷酷になるような判断基準を取っており、人倫と物事の真理であれば真理を取るような判断をとります。
Fの場合には、人として正しいかどうか、思いやりを持っているかどうか、といったように協調性を持っているか、人として正しいかどうかで物事を判断します。

そのように、相手の価値基準・情報処理がどういう風に行われているか理解することで、相手に共感することなくても理解し認めてあげることができるでしょう。

また、このTとFのどちらが正しいかという話になると、哲学の話になります。
[弁証法](https://pdmagazine.jp/background/aufheben/)の末に、[メビウスの輪](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%93%E3%82%A6%E3%82%B9%E3%81%AE%E5%B8%AF)のように裏表を定義づけできないというのが現状です。
異論がある方は論文でも書いて世界を論破してみましょう。


##その2.初見でもだいたいタイプがわかるようになる。
このMBTIを用いると、結果として16パターンの人格に性格を分類されます。この方法は類型論と言われていますが、ざっくりとしたイメージを掴むのには最適です。例えば、ENTP型の人が現れたときには、情報の受け取り方・処理の仕方などが同じ傾向にあるので、対処方法も似てくるようになります。

自分の苦手な性格タイプがあったとしても、その対処法や認識の違いもあらかじめ理解しておくことができるので、上手く付き合いができるようになるでしょう。

例えばハッカソンでのチームビルディングのようなシーンでも、MBTIを取り入れお互いに認識し理解するだけで、関係は円滑化されるでしょう。

MBTIは他者理解のフレームワークとも言えるので、社会不適合者だと自覚している人ほど使っていくべきツールなのかもしれません。

##その3.自己分析をすることができ、自分の苦手を相補できる
MBTIはざっくりとその人の個性を４文字のアルファベットで表していますが、厳密にはそれらのアルファベットも深い意味があり、ENTPとENTJは１文字しか違いませんが、性格は全く異なるものとなっています。
詳しいことを学ぶのであれば、まずはユングの提唱した真理機能について説明した[タイプ論について](https://uranaino.net/archives/631)を読んでみてください。

例えば、ENTP型の人は、独創的なひらめきがあるのですが、ISFJの人が持っているような人への優しさや勤勉さが足りない傾向があります。
自己分析ツールとしても使用することができ、より良い人生や自分の立ち位置を明確にする意味でも、MBTIは有効でしょう。
nuxt.jsにvue-carouselを導入してスライダーを作成

# 導入
https://ssense.github.io/vue-carousel/guide/
こちらの公式ガイドを参考に

コマンドラインでvue-carouselをインストール

```
npm install -S vue-carousel
```
開発中のプロジェクトファイルの`plugins`フォルダの中に
`vue-carousel.js`ファイルを作成
以下を記入

```javascript:vue-carousel.js
import Vue from 'vue'
import VueCarousel from 'vue-carousel'

Vue.use(VueCarousel)
```

nuxt.config.jsファイルに追記

```javascript:nuxt.config.js
plugins: [{ src: '~/plugins/vue-carousel', ssr: false }],
```

スライダーを作成するファイルにimportする。

公式ガイドの通りの記載だと読み込みが出来ずうまく行かなかったので、
https://qiita.com/ProjectEuropa/items/9c9f5fbd1e786b9762ba
こちらの@ProjectEuropaさんの記事を参考にCarouselとSlideをそれぞれ別箇にimportするとうまく動きました。

ありがとうございます！



```html:slider.vue
<template>
  <carousel>
    <slide>
      <img src="@/assets/images/slide1.jpg" />
    </slide>
    <slide>
      <img src="@/assets/images/slide2.jpg" />
    </slide>
  </carousel>
</template>

<script>
import Carousel from 'vue-carousel/src/Carousel.vue'
import Slide from 'vue-carousel/src/Slide.vue'
export default {
  components: {
    Carousel,
    Slide
  }
}
</script>
```

# カスタマイズ

https://ssense.github.io/vue-carousel/api/
こちらの公式ガイドを参考に`<carousel>`タグ内に色々と記載すると簡単にカスタマイズが出来ます。

スタイルも`.VueCarousel-slide `で指定するとカスタマイズ出来ます。
めちゃめちゃ便利です！！

```haml:slider.vue
<template>
  <carousel
    :per-page="1"
    :autoplay="true"
    :loop="true"
    :pagination-padding="5"
    :autoplay-timeout="4000"
  >
    <slide>
      <img src="@/assets/images/slide1.jpg" />
    </slide>
    <slide>
      <img src="@/assets/images/slide2.jpg" />
    </slide>
  </carousel>
</template>

<script>
import Carousel from 'vue-carousel/src/Carousel.vue'
import Slide from 'vue-carousel/src/Slide.vue'
export default {
  components: {
    Carousel,
    Slide
  }
}
</script>

<style>
.VueCarousel-slide {
  background: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  border-right: 1px solid #fff;
  box-sizing: border-box;
}
</style>

```
サービスマネジメント 応用情報技術者試験 対策日記@19

##ITIL(Information Technology Infrastructure Library)
ITサービスマネジメントのフレームワーク。**JIS Q 20000**で規格化されている。
サービス戦略、サービス設計、サービス移行、サービス運用、継続的サービス改善の5つからなるサービスライフサイクルからサービスマネジメントにアプローチしている。サービス設計のサービスレベル管理プロセスでは、サービスの内容と範囲、品質や達成できなかった場合のルールを含めた**SLA(Service Level Agreement)**を締結する。

##統合的制御プロセス
###構成管理
CMS（Configuration Management System）を用いて全ての構成品目を一元管理する。CMSに用いられるデータベースを**構成管理データベース**という。
###変更管理
**RFC(Request for Change)**を受け取って変更管理を行う。変更をアセスメントする**変更諮問委員会(CAB)**が開かれることがある。
###リソース・展開管理
変更した内容を本番環境に正しく反映すること。**DML(Definitive Media Library)**にまとめておく。

##サービスの運用
###障害時運用設計
ディザスタリカバリのために、RTO(Recovery Time Objective)とRPO(Recovery Point Objective)を決めておく。バックアップには3種類ある。フルバックアップは全てのデータをバックアップする。増分バックアップは前回の増分バックアップまたはフルバックアップからの差分、差分バックアップは前回のフルバックアップからの差分を取る。

##システム監査
- 基準に照らし合わせて監査する**保証型監査**と、問題点を指摘して改善提案を行う**助言型監査**がある。
- 監査対象と独立した人物が監査に当たらなければならない。
- 監査計画に基づき、予備調査、本調査及び評価・結論の手順で行う。
- 調査においては監査証拠を手に入れ、手続きの結果を監査調書としてまとめる。
- 監査について監査報告書を作成し、指摘事項と改善勧告を記載する。
- コンピュータを使用した監査技法を**CAAT**と呼び、テスト用の架空IDを設置することでシステムの動作を検証するITF法などがある。
- 監査証跡とは、監査対象システムの入力から出力を追跡する仕組みと記録のこと。

##内部統制
**COSOフレームワーク**が世界基準となっている。

------
[ホームへ](https://qiita.com/k-y/items/dc2c9a3a8425712253e8)
Angular 6で作ったアプリをHerokuにデプロイする

仕事でAngular 6(といってもionic)を書く案件があったため急遽ステージングのためにHerokuを使うことにした。
といっても今までNetlifyでSPAをデプロイしていてBASIC認証なんて必要なかったのでちょっと手間取ったのでメモ（この記事でBASIC認証については触れません）。
Herokuの登録、Heroku CLIの導入は済んでいて、Herokuの使い方をある程度知っていて、Angularをある程度触ったことがある人を読者としてターゲットにしています。

## Herokuアプリを作成する

これがなきゃ始まらないよね。

```bash
heroku new
```

## Expressをインストールする

Herokuにそのままプッシュしてもng serveで動かそうとしてくれるのですが、**Dynoがメモリ不足で落ちます。**
そのためExpressを噛ませてAngularアプリを動かします。

```bash
yarn add express
```

npm派の方ごめんなさい。

## package.jsonにEnginesを追加

バージョンは適宜変更してください。

```package.json
  "engines": {
    "node": "10.15.3",
    "npm": "6.9.0"
  }
```

## server.jsを作成

プロジェクト直下に。

```server.js
const express = require("express");
const app = express();
app.use(express.static(__dirname + "/www")); // PureなAngularな人はdistだと思う
app.listen(process.env.PORT || 8080);
const path = require("path");
app.get("/*", function(req, res) {
  res.sendFile(path.join(__dirname + "/www/index.html")); // ここもdistに書き換える
});
console.log("Server listening on port 8080");
```

## Procfileを作る

当然ながら直下に。標準だとstartスクリプトを実行してしまうためng serveになってしまう。

```Procfile
web: node server.js
```

## buildスクリプトを書き換える(Optional)

ステージング環境でもAoTかつプロダクションなビルドをしたいよって人は書き換えてください。このスクリプトが呼ばれるはずなので。
自分は必要ないと思ったので変えてません。

```package.json
"build": "ng build --aot --prod"
```

## デプロイ🚀(プッシュ)

```bash
git push heroku master
```

~~いかがでしたでしょうか~~

多分これでデプロイできるはずです。よいAngular生活を。


あとで多分CI設定の方も書きます。長くなったのでこれで。
BN-880 を設定する。

[ひとつ前の記事](https://qiita.com/jp_yen/items/4c72b8e97d8436d32d29) で Raspberry Pi に繋ぎ GPS から時刻を取得できるようになったと思ったら 1日経たずに情報が取れなくなってしまいました。どうなったのかよく分からないので Windows に繋いで u-center で設定してみる。

[u-center](https://www.u-blox.com/ja/product/u-center) を u-blox からダウンロードしインストール。
PC 側のシリアルポートは一緒に買った [5PCS USB to TTLデバッグシリアルポートケーブルRaspberry Pi 3B 2B / COMポート ](https://jp.banggood.com/5PCS-USB-To-TTL-Debug-Serial-Port-Cable-For-Raspberry-Pi-3B-2B-COM-Port-p-1213690.html) (5個で 989円) を使用。 Win機に挿してみると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306041/6040ce97-bc66-40a2-1957-36c50a01836c.png)
デバイスドライバがない。メーカーの[ドライバページ](http://www.prolific.com.tw/JP/ShowProduct.aspx?pcid=126&showlevel=0126-0126) から、バージョン 1.20.0 のドライバをダウンロード & インストール。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306041/2e2cf4f1-0667-11b2-5258-858baf2d0a86.png)
あ、マザーボードにシリアルポートのピンヘッダ出てたんだった。まぁ良いか。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306041/86b2c648-ad0d-405f-eeed-5fbbb63e76d5.png)
繋いでみたところどうも起動時のメッセージ (1行目だけ) が出続けているっぽい。短時間で再起動を繰り返してる？さては壊れましたね(^^)
起動時のメッセージは [Release Notes : GNSS Firmware 3.01 for u-blox 8/M8 Standard Precision Products (PDF)](https://www.u-blox.com/sites/default/files/GNSS-FW3.01_ReleaseNotes_%28UBX-16000319%29_Public.pdf) の `4.1Changes in boot screen and in UBX-MON-VER' あたり参照。

ちなみに、u-center の使い方は英語より日本語が良いので [u-center の日本語ユーザガイド](http://yokojun.net/gazo/u-User_Guide.pdf) を参照しました。が、殆ど何もしてないですが。そのほか u-center の説明
[u-centerGNSS evaluation software for WindowsUser Guide (英語)](https://www.u-blox.com/sites/default/files/u-center_UserGuide_%28UBX-13005250%29.pdf)
[u-center の設定](https://www.n-survey.com/gis/GNSS_Logger_Plugin/images/u-center.pdf)
[GPS/GNSS設定方法（u-blox編）](https://sites.google.com/a/agri-info-design.com/aid/agribus-navi/u-blox-gps-gnss-settings)

取りあえず購入した banggood に交換できるか？と上のスクリーンショットを添付して問い合わせ。そしたら動画も撮って寄越せと言われたので URL を送った。
https://youtu.be/HOWk_-61OJg
https://youtu.be/0CYToZ-mVto
さて、どう返事が来るのかな？
→ 1000円の返金でどう？と返事が。今の価格が 2031円+送料 616円なのにそれはダメでしょう。嫌だって返信しておいた。
→ 購入金額の 1,812円を返金しますと連絡がきた。交換してくれと連絡したんですが、代品はなしでした。まぁ、商品代金返してくれるなら仕方ないかな。送料...orz
やっぱこういうものは 1個ではなく複数個買うべきでしたね。


ちなみに USB-シリアルは [KKHMF USB to UART TTL RS232 PL2303HX ワイヤーアダプタ変換ケーブルRaspberry Pi Arduino用](https://amzn.to/2uS39rw) とか ￥182 & 配送料無料 で意味わかんないのとかもあります。
ケーブルいらねーよとかいう人には [KKHMF CH340モジュール STC マイクロ コントローラー ダウンロード USBターンTTLシリアル](https://amzn.to/2WVrOHA) ￥ 184 & 配送料無料 だと 3.3V (TTL), 5V (CMOS) 選択可能というものもあります。

GPSモジュールは 1PPS の出てる [1PPS UART TTL level GPS GLONASS Dual GNSS module GPS module with antenna FLASH BN-357](https://ja.aliexpress.com/item/1PPS-UART-TTL-level-GPS-GLONASS-Dual-GNSS-module-GPS-module-with-antenna-FLASH-BN-357/32956900981.html) US $6.65 とかの方が安かったんじゃないだろうか。と今更思うなど。
データベースを経由しない、一時的なパラメータの保存について

Railsにおいて、データを保存するにはデータベースが必要です。
ただし、既存のデータと照合するための一時的なデータであれば、データベースを経由する必要がありません。

#ログイン認証
既にusersテーブルが存在するとします。

```Ruby:schema.rb
create_table "users", force: :cascade do |t|
    t.string "name", null: false
    t.string "email", null: false
    t.string "password_digest", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```

イメージとしては、会員ごとにサービスを提供するサイトがあったとして、ユーザー新規登録をした後の状態ですね。

この後、ログイン画面からemailとpasswordを入力し、usersテーブルのデータと認証させます。

この時、ログイン画面で入力したデータを、また別のテーブルを作るのは非常に効率が悪いです。
しかも、この照合用のデータは一度認証すれば、もう必要がありません。

だとすれば、テーブルを作成せずに、一時的にデータを保存し、パラメータの受け渡しをした方が良いと思います。



#具体的なパラメータの保存方法

###①まず、以下のviewを作ります。

```Ruby:sessions/new.html.rb
<%= form_with scope: :session, local: true do |f| %>

ログイン画面の実装

<% end %>
```
form_withの後がmodelではなくscopeなのは、今回モデルを作成しないからです。
仮想のモデルを「session」とし、同時に属性へプレフィックスをつけています。
ただ、これがなぜ「sessions_controller.rb」のcreateアクションに飛ぶのかはまだ調べきれていません。
もしかすると、仮想のモデルがあるので、「model :session」のような感じになっているのかもしれませんね。

###②次に、コントローラを作成します。
 
```Ruby:sessions_controller.rb
def new
end

def create

ここで、まずログイン入力したメールアドレスとusersテーブルを照合（find_byメソッド、findだとnilを渡すとエラーが出ます）
　　　　　　　　　　　　　　　　　　　↓
そして、パスワードとの認証をする（gemのbcryptを利用しているなら、authenticateメソッドを利用する）

end
```

という流れでログインをするのですが、この流れにおいてsessionモデルやテーブルは作っていません。

ただ、createメソッドでパラメータを渡す必要がありますが、その場合は、

```Ruby:sessions_controller.rb

private

 def session_params
     params.require(:session).permit(:email, :password)
 end

```

上記のようにストロングパラメータを取得するのですが、まるでsessionモデルがあるかのような扱いですね。

ただ、こうすることで、createメソッドにおいて、sessions_params[:~]のパラメータとusersテーブルのデータを照合できるわけです。


Railsはとにかく想像力が重要だな、とつくづく思います。
direx-project + popwinで快適なディレクトリツリー環境を構築する

![Alt Text](https://live.staticflickr.com/7901/33686197028_bbd99854f5_b.jpg)

## Emacsでディレクトリツリーを使う意味
Vim使いのひとには、neotreeは親しみやすいと思うのですが、Emacsのdiredに慣れ親しんだ私には、次の作業のために不要になったtreeバファーをいちいち手動で閉じるというアクションは案外不便なのです。direxの場合は、diredのコンセプトを継承して作られているので、treeバファーから必要なファイルを選んで開くと自動的にtreeバッファーが隠れてくれてカレントバファーにファイルを展開してくれます。実際にEmacsで作業する手順を考えるとこの方が使いやすいと私は思うのです。

## Direx-projectを使う 
direxの作者は、popwinを開発された方でdirexは単独でも機能しますがpopwinと併用することでneotreeに勝るとも劣らない機能を提供してくれます。例によってパッチワークですが設定を公開します。特徴として以下の機能を持ちます。

  * フォルダー表示はビジュアルにしたいのでunicodeの絵文字を使う。
  * popwinを使うことで表示幅を自由に設定できる。<br>toggle機能はありませんが、q または C−g で隠れてくれるので使い勝手が良いです。
  * project内にいるなら、direx-projectを起動し、そうでなければ普通にdirexを起動する。<br>以下のTipsのパクリですが、これが気に入っています。
  * [https://blog.shibayu36.org/entry/2013/02/12/191459](https://blog.shibayu36.org/entry/2013/02/12/191459) 

## 設定 ##

``` emacs-lisp
;; direx
(use-package direx)
(setq direx:leaf-icon "  " direx:open-icon "📂" direx:closed-icon "📁")
(push '(direx:direx-mode :position left :width 35 :dedicated t)
      popwin:special-display-config)
;; use direx-project.el
;; https://blog.shibayu36.org/entry/2013/02/12/191459
(bind-key
 [f11]
 (defun direx:jump-to-project-directory ()
   "If in project, launch direx-project otherwise start direx."
  (interactive)
  (let ((result (ignore-errors
                  (direx-project:jump-to-project-root-other-window)
                  t)))
    (unless result
      (direx:jump-to-directory-other-window)))))
```
プログラミング学習記録51〜モチベーション少し回復〜

##今日やったこと
- Progate React1リセット復習

昨日と同じProgateのReact1をやりました。
昨日よりもイベントとstateの理解が深まりました。

ProgateのReactをさらっと2、３周した後Udemyの講座をやろうかなと思っていたのですが、ドットインストールにToDoアプリを作る講座があったのでそっちを先にやっていきたいと思います。

あとドットインストールにActive Recordの講座があることを今知りました。

Railsでアプリを作った時にActive Recordの関連付けの部分でだいぶ苦労したので、先にドットインストールの動画を見ておけばよかったかなと思いました。

Active Recordの関連付けを理解して、データの抽出と削除ができるようになるとユーザーの退会機能も簡単に実装できるようになります。

退会機能を実装したい方は事前に[「Active Record入門」](https://dotinstall.com/lessons/basic_activerecord_v2)を見ておくことをお勧めします。

明日はProgateのReact2をやると共に、大学の講義に取り組んでいこうと思います。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
Adsense導入を予定しているならSPAではなくSSRを検討したほうがいい

# 概要

Webサービスを展開するなら一度は検討したいAdsense。
少額ながらもすぐに収益がでるため、サービス拡大のお供にしてモチベーションを維持したいところ。
そんなみんな大好きAdsenseですが、実はSPAとは相性が悪いというお話:pensive:

# 読者対象

- 将来SPAなWebページにAdsenseを導入予定している方


# どうしてSPAではだめなのか？

Adsenseの広告には二種類あります。

- 自動広告
    - 広告の配置をすべてGoogleに委任する形態で、開発者はレイアウトに関して広告を一切気にしなくてよい。
- 広告ユニット
    - 自動広告の真逆のタイプの広告で、開発者がレイアウトを管理します。

後者の広告ユニットであれば、SPAでも問題ありません。
問題は前者の自動広告です。
自動広告にはHeaderにテンプレコードを追加するのですが、一度設定するとページ毎に一回しか設定できない旨のエラーになってしまいます。
SSRの場合、ページを読み込む度にクリアされるからOKですが、SPAでは設定済みの状態を持っているためNGということです。
そもそもAdsenseがブログやニュースサイトといったSSRベースをターゲットにしているため、AnalyticsのようにSPAに配慮したヘルプページすら存在しません。
SPAは仮想DOMで操作しますから、リアルDOMを後付けするAdsenseの自動広告とは仕組み的にも相性悪いのかもしれません。


# 素晴らしすぎる自動広告

自動広告の何がすごいのか？

- 自動広告はHeaderにテンプレコードを入れるだけで、Googleが最適と考えるところに広告が配置される（広告をアプリに組み込まなくていい）。
  つまり開発側は一切広告を気にしなくていい。
- 動的配置のため、どこに広告が出るかは表示してみてのお楽しみ。クリック率の向上が期待できる:smile:。
    例えばDrawerから画面遷移したときに全画面広告が表示など。

私は一回設定しただけで虜になりました:heart_eyes:
やり過ぎの時もありますが、Googleの判断で盛っているので私に一切責任なし:wink:
一回使ってしまうと、もう広告ユニットには戻れないなぁ・・・


# SPAでのAdsenseの選択肢

広告ごとにまとめると以下になります。

- 自動広告
    - SPAでは初期表示しか表示することができません。ページ遷移以降は広告なしになります。
- 広告ユニット
    - ページ毎に広告を配置することが可能。

SPAでの自動広告では収益が半減する可能性があるため、使用するなら広告ユニットと合わせて使うのがよいでしょう。


# まとめ

将来的にどうなるかわかりませんが、現状では自動広告＝SSRが前提となっています。
そのため、自動広告に重きを置くならSSRとなります。
一方、手動で広告を配置するのであれば、SPAでも問題ありません。
SPAでも自動広告を希望するなら、フィードバックから要望を出しておきましょう（私は要望済み）。
可能性は低いと思いますが、将来SPA向けページ更新時のAPIを追加してくれるかもしれません。
ABC - 094- A&B&C

#AtCoder ABC 094 A&B&C
[AtCoder - 094](https://atcoder.jp/contests/abc094)

#A問題

 - 猫がA
 - 猫＋犬がB
 - 猫がX匹いる条件は
    -  $A \leqq X$
    -  $X \leqq A+B$


```java
	private void solveA() {
		Scanner scanner = null;
		int numA = 0;
		int numB = 0;
		int numX = 0;

		try {
			scanner = new Scanner(System.in);
			numA = scanner.nextInt();
			numB = scanner.nextInt();
			numX = scanner.nextInt();

			if (numX - numA <= numB && numA <= numX) {
				System.out.println("YES");
			} else {
				System.out.println("NO");
			}

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 1. 料金所の箇所を記録する
 2. XからマスNまで移動した場合の金額を算出する
 3. Xからマス0まで移動した場合の金額を算出する
 4. [2]と[3] を比較する

```java
	private void solveB() {

		try (Scanner scanner = new Scanner(System.in)) {
			int numN = scanner.nextInt();
			int numM = scanner.nextInt();
			int numX = scanner.nextInt();

			Set<Integer> wk = new HashSet<Integer>();

			for (int i = 0; i < numM; i++) {
				wk.add(scanner.nextInt());
			}
			int res1 = 0;
			for (int i = numX; i <= numN; i++) {
				if (wk.contains(i)) {
					res1++;
				}

			}
			int res2 = 0;
			for (int i = 0; i <= numX; i++) {
				if (wk.contains(i)) {
					res2++;
				}

			}

			System.out.println(Math.min(res1, res2));

		}
	}
```

#C問題

 - 普通に全探索を行うとTLEなので計算量を削減

 - $l が奇数のとき，l個の数a_1,a_2,...,a_l$ の中央値は $(l+1)/2$ 番目に大きい値
 - 偶数の数列から'i番目'を抜くので、数列は奇数となり上記の公式に当てはまる
 - 問題は、　$i番目$を抜いたときに中央値はどのように変化するのか？
    - 偶数の時の中央値より大きければ、中央値の取得箇所が右
    - 偶数の時の中央値より小さければ、中央値の取得箇所が左
    - **ただ、偶数の時の中央値を取得すると小数点が発生するため、最初から両方の中央値を取得しておき、片方の数値で判定すると誤差が出ない**

||1|2|3|4|5|6|7|8|9|10||
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|中央値の位置|||||↑|↑|||||偶数なので5と6の平均|

||1|2|3|4|5|6|7|8|9|||
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|中央値の位置|||||↑||||||10の位置を抜いた|

|||2|3|4|5|6|7|8|9|10||
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|中央値の位置||||||↑|||||1の位置を抜いた|

```java
private void solveC() {

		try (Scanner scanner = new Scanner(System.in)) {
			int numN = scanner.nextInt();
			//入力値
			long[] wk = new long[numN];
			//中央値算出用の配列
			long[] wk2 = new long[numN];

			for (int i = 0; i < wk.length; i++) {
				wk[i] = scanner.nextInt();
				wk2[i] = wk[i];
			}

			//中央値の算出
			Arrays.sort(wk2);

			//中央値の準備（１：中央値より大きい位置が除外された時の中央値　２：中央値より小さい値が除外された時の中央値）
			long m1 = wk2[(numN / 2) - 1];
			long m2 = wk2[(numN / 2)];

			for (int i = 0; i < wk.length; i++) {
				if (wk[i] <= m1) {
					System.out.println(m2);
				} else {
					System.out.println(m1);
				}
			}
		}
	}
```
[mac] Homebrewを使ってPython3をインストールする


# やること

MacOSでHomebrewを使ってPython3をインストールします。
環境分離はvenvで行います。pyenvは使いません！

# 環境

```
$ python --version
Python 2.7.10
```

# 手順

- homebrewのアップデート

```
$ brew update
$ brew --version
Homebrew 2.1.0
Homebrew/homebrew-core (git revision 0d812d; last commit 2019-04-05)
```

- Python3インストール

```
$ brew install python3
```

ただこれだけの手順ですが、実行時にbrewがコケて死にました。
別の記事にまとめてあるので必要なら以下のURLから！

https://qiita.com/Knoth/items/bbb3d4e53993bd35881c
Android Studio日本語化

# 0.前提
Android Studioがインストールされいていること

# 1.プラグインをダウンロード
[プラグイン](http://mergedoc.osdn.jp/#pleiades.html#PLUGIN)をダウンロード
<img width="931" alt="1_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/393759/2990e494-faa3-08f6-7393-8017aad9d7e0.png">
※使用するOSに合わせて選択

# 2.プラグインのセットアップ
ダウンロードしたzipファイルを解凍

<img width="726" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/393759/6a7187b4-6943-52e7-a8f8-7f49fa271fb2.png">
setup.exeを実行

<img width="635" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/393759/7306941c-5a59-6c7f-27bd-f5eea80c7e1f.png">
「選択」を押下

<img width="554" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/393759/fe7dd86a-5828-fdcc-0932-b15e2f1b5388.png">
Android Studioのインストールロケーションを選択
※windowsデフォルトの場合、C:\Program Files\Android\Android Studio\bin\studio64.exe

<img width="635" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/393759/ed6c4f4b-a59d-dff2-66fc-67b07d3ead0b.png">
「日本語化する」を押下

<img width="418" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/393759/dd96f58f-a143-5a37-599c-5afb8d604710.png">
「OK」を押下

<img width="635" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/393759/1f8eee81-8d23-8852-bb7a-445977ed8b9a.png">
「終了」を押下

<img width="500" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/393759/3757b575-c674-4416-08e5-ead8bf8fb5bd.png">
Android Studioを起動すると日本語化されたことが確認できます。
RailsとSOLID原則について思いを馳せる-SRP

SOLIDの勉強がてら、RAILSでの使い方についてとりとめもなく考えてみる。

SOLIDそのものについては、[クリーンアーキテクチャ](https://www.amazon.co.jp/dp/4048930656/ref=cm_sw_r_tw_dp_U_x_8dWQCb4VQ86EK) の7-10章をそのままベースにしてるので、派閥争いで「SRP原則はこんなんじゃねぇよ！」とかが実はあるのかもしれないけど、その辺りは後回し。


# 単一責任の原則（SRP: Single Responsibility Principle）

SRPの良く聞く説明は、「モジュールを変更する理由は一つだけでああるべきである」とういうものだけど、クリーンアーキテクチャによると正確には**「モジュールはたったひとつのアクターに対して責務を負うべきである」**なのだという。
大雑把に例えると
**「同じシステムであっても、社長アクターが使用する機能は、一般社員アクターが使用する機能と、コードレベルで別れているべきである」**って感じだろうか。
こうしておけば、社長起因でコードが変更された場合に、社員が使用する機能が影響を受ける事は無い。

## Railsでどう考えるか
Railsでアクターというと、どの単位になるんだろう。
シンプルに考えると、一つの画面は同じ人物が使うのだから、`config/routes.rb`の`resources`で指定されたあるルートは、同じアクターによって使用されるとしても良いだろう。
つまり、ある`〇〇_controller.rb`は、同一アクターが使用するものだと考える。なので、Controllerまでは、割と勝手にSRPに沿って分かれていると言える。

問題になるのは例えば「社員一覧」の様な、社長でも一般社員でも使えるべきページについて考える時で、このページを社長と一般社員でわけるのは流石に無意味過ぎる。
ここは「アクターは概念なので、同じ主体が複数持つ事が出来る」と考えれば良いだろう。
「社員一覧」ページは社長でも社員でも見えるけど、その時のアクターは「全社員」という、別のアクターなのだ。
「全社員」は抽象で、「社長」や「一般社員」はその具象なので、別々のアクターとして扱える、という事かもしれない。

ここから、**「そのresourcesを利用するアクターは何者なのか、はっきり明記する」**は、やっておいても良いと言えるかもしれない。
コード分割云々以前の、そのシステムが誰に対するもので、どう使われるべきなのかを理解する手助けになりそう。
もっと前の、設計の時点でちゃんとアクターの洗い出ししておけっていう話かもしれないけど、そんなに綺麗に作られている事、あんまり無いだろうし、あとからでもやっておきたい。

Controllerのコード自体は、本来の`Skinny Controller`を目指していれば、そうそうおかしな事にはならないのでは。


Modelはどうだろう。
RailsのModelは、みんなが苦しんでる通りに、多くの責任を背負う場所になっているんだから、さぞかし分割し甲斐があるのでは？
とは思うものの、いわゆるファット・モデルの分割については、過去に喧々諤々の議論があり、まだベストプラクティスは出てない状態らしい。

（参考）
[俺が悪かった。素直に間違いを認めるから、もうサービスクラスとか作るのは止めてくれ](https://qiita.com/joker1007/items/25de535cd8bb2857a685)
[Ruby on Railsの正体と向き合い方 / What is Ruby on Rails and how to deal with it?](https://speakerdeck.com/yasaichi/what-is-ruby-on-rails-and-how-to-deal-with-it)

個人的には、大規模になる事が分かってるんだったら出来る限り早く分割したい。個人的な趣味嗜好の問題で、責任いっぱいのクラスを見てると苦しくなるし、個人的な能力の限界で、200行を超えるクラスは読めないからだ。

特に、ActiveRecordが根本に存在しているModelは、RDBのデータ構造と完全に結合していて、そのデータ構造で賄える範囲でしかシンプルなコードが書けないわけで、複数テーブルをまたいだコマンド系の処理は、そもそものrails wayの想定の範囲外。

一刻も早く分割しないと、後々の保守で地獄を見る羽目に陥るんじゃないかと思う。

分割した場合でも「ファット・モデルは目指すべきものである」というrails wayから外れる事になるけど、こういった「Modelに複数ユースケースが紛れ込んでる」ケース自体が、もっと根本から道を外れているわけだし、そういう場合の分割は許されるべきというか、積極的にやらないと、もう線路に戻れなくなるんじゃないだろうか。

そして、ユースケースが複数になるという事は、アクターが複数になっている事も多いだろう。
**SRPを考えても、やはり大規模になったモデルは分割（なり、対処）を考えた方が良い**と思う。
callbackもvalidationも分かれる事になるんで、物凄い茨の道なんだろうけど。

（参照）
[サービスクラスについては僕も悪かったと思っているけど、それでもCQSは実現したいんだ](https://qiita.com/a-suenami/items/8897e2e36fe2836c6949#_reference-d2805ad37e277e2fb69c)
[Railsプロジェクトにサービスクラスを導入して4ヶ月たったので振り返る](https://qiita.com/rin_mu/items/6e51f38cd1d7f85bb19c#_reference-3dc939532d8b98c4e15b)
[Railsのファットモデル問題に対処する前に読んでほしい記事](https://qiita.com/klriutsa/items/8d7381f437c225c64a5f#_reference-90030fe69e5227629228)


HelperやConcernは正直具体的にどう考えて良いのかわからない。
けど、アクターベースのSRPで考えると、明らかに火薬庫なので、取り扱い注意になるのは間違いない。
各自自助努力で、出来る限り凝集性を保って頑張るべき、というしかない気がする。

オープン・クローズド原則以降は、暇な時に次考えます。
Qiita文化が良く分からないんだけど、許可取らずに勝手に参考リンクとか貼って良かったものなんだろうか…
コマンドプロンプトでMySQLに接続できない時に見直すべきこと（超初心者向け）

###前提
超絶初心者の私が、超絶初心者のために書いたものですので、高度なことは一切書いてません。
ただのPCの管理者権限の話なので、つよいエンジニアの方は見る時間が無駄かと思います。。

環境：Windows10,XAMPP
社用PCで、XAMPPで既にMySQLインストール済み。
今までは他の社員さんが使っていた。
今回はPCのアカウントを新たに作成し、そのアカウントでログインしている状態。

###コマンドプロンプトでMySQLに接続できない
MySQLで新しくユーザーを作ろうと思い、rootアカウントでログインしようとした所エラーが出てログインできないことが判明。

```command
user-@DESKTOP-UKDRDQE c:\xampp
$ mysql -h localhost -u root
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: 指定されたモジュールが見つかりません。
```

###エラーの意味
直訳：*『認証プラグイン「 caching_sha2_password 」がロードされません』*

認証プラグインが何かの原因でうまくいってない、ということ。
この場合だと、パスワードが間違ってるとかではなさそう。
（というか間違っていたとしてもrootアカウントが使えないと何もできない）
よく分からないが、なんだかアカウント認証が怪しいのでは？（勘）
が、そもそもrootアカウントにログインできないのでパスワードの変更も、MySQLアンインストールもできない。

###結論
結局、**PC自体の管理者アカウントでコマンド打ったら解決**した。
（単純なオチでしたが、超初心者の方は私と同じようにハマるかも？と思ってこれを書きました。）

###試したこと
PCの管理者アカウントでXAMPPを起動。
MySQL停止させた状態で、パスワードなしで起動できるモードで起動。

```command
COMMON-ACCOUNT@DESKTOP-UKDRDQE c:\xampp
$ mysqld --skip-grant-tables &
18780 [Note] Using unique option prefix 'key_buffer' is error-prone and can break in the future. Please use the full name 'key_buffer_size' instead.
18780 [Note] mysqld (mysqld 10.1.33-MariaDB) starting as process 18776 ...
```
（参照： https://www.aiship.jp/knowhow/archives/28257 ）

MySQLが起動していることを確認し、これはこのまま放っておいて、
もう１つコマンドプロンプトを開いてrootアカウントにログイン。

```command
$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.33-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```
やっと入れた！
ということで、やはり管理者権限が原因だったようだ。

あとはrootアカウントのパスワードを新しく変更し、ユーザーもついでに作成。
これでログインできるようになったので、自分のアカウントでもできるかやってみる。
XAMPPから普通にMySQL起動→ `$ mysql -u root -p`
で、先程設定したパスワードでログインできた！

ということで、MySQLログインができない！とハマってしまっている方は一度PC自体の管理者アカウントで色々試してみてはいかがでしょうか。
きっと無いと思うけど、また同じようなことでハマらないよう自分の備忘録として＆超絶初心者さんの参考になればと思います。
はじめての自作キーボードMint60 QMK Firmware キーマップカスタマイズ

# はじめに
mint60をつくったので、キーマップをカスタマイズする。

<img width="487" alt="スクリーンショット_2019_03_19_18_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/105093/b21ad4ba-4316-88dd-b537-f1dc09039bb3.jpeg">

# QMK Firmwareをcloneする

```
$ git clone https://github.com/qmk/qmk_firmware
$ cd qmk_firmware
```

# QMK Firmwareのビルド環境を整える
ビルドに必要なものをインストールしてくれる。

```
$ ./util/qmk_install.sh
```

もしもうまく `avr-gcc` などがインストールされなければ、brewに問題があることがあるので、
以下コマンドでwarningを確認して、エラーをググって修正してください。

```
Error: No such keg: /usr/local/Cellar/avr-gcc
```

```
$ brew doctor
```

ちなみに私は、以下のようなwarningなどが少し出ていたので、whichコマンドなどで確認しながら、
インストールしなおしたり、シンボリックリンクを当て直したりしてました。


```
Ignoring bindex-0.5.0 because its extensions are not built.  Try: gem pristine bindex --version 0.5.0
```

# Mint60のデフォルトのキーマップを確認する

````
$ ls keyboards/mint60/keymaps
default eucalyn

# make <キーボード名>:<キーマップ名>
$ make mint60:default
```

# カスタムのキーマップを定義する
```
$ cd keyboards/mint60/keymaps

$ cp -r default custom
```

# キーマップを変更する
レイアウトは2つあり、1つ目を変えればOKです。2つ目はfnキーを押した時の処理です。
例えば、キャップスロック `KC_CAPS` をコントロールにしたいなら、 `KC_LCTL` に書き換えれば良いだけです。

```
$ cd custom/

$ vim keymap.c
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( \
    KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,    KC_BSPC,  \
    KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,      KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,  \
    KC_CAPS,     KC_A,    KC_S,    KC_D,    KC_F,    KC_G,      KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,        KC_ENT,   \
    KC_LSFT,       KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,      KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,   KC_UP,  MO(1),   \
    KC_ESC,    KC_LCTL,    KC_LGUI,    KC_LALT,    KC_SPC,        KC_BSPC, KC_ENT,  LALT(KC_GRV),               KC_LEFT,KC_DOWN,KC_RGHT \
  ),
  [1] = LAYOUT( \
    KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,     KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,    KC_DEL, \
    RGB_TOG,   RGBRST,  RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
    XXXXXXX,     RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,        XXXXXXX, \
    _______,       XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, KC_PGUP, _______, \
    XXXXXXX,   _______,    _______,    _______,    XXXXXXX,       XXXXXXX, XXXXXXX, XXXXXXX,                   KC_HOME, KC_PGDN, KC_END \
  )
};
```

# Firmwareをビルドする
```
$ cd ../../../../

$ make mint60:custom
```

# 左右のProMicroにFirmwareを焼く
途中でキーボードの裏側にあるリセットスイッチを押す。

```
$ make mint60:custom:avrdude
```

完成🎉🎉🎉
Python3: GitHub で GraphQL を使う

こちらのプログラムを python3 で書き換えました。
[Curl: GitHub で GraphQL を使う](https://qiita.com/ekzemplaro/items/35f37293cc49cdb09587)

curl から python3 への変換には次のサイトが役に立ちます。
[Convert curl syntax to Python, Node.js, R, PHP, Strest, Go, JSON, Rust](https://curl.trillworks.com/)

```py:get_data.py
#! /usr/bin/python
#
#	get_data.py
#
#					   Apr/15/2023
#
# ------------------------------------------------------------------
import  sys
import  requests
# ------------------------------------------------------------------
def file_to_str_proc(file_in):
	str_out = ""
	try:
		fp_in = open(file_in,encoding='utf-8')
		str_out = fp_in.read()
		fp_in.close()
	except Exception as ee:
		sys.stderr.write("*** error *** file_to_str_proc ***\n")
		sys.stderr.write(str (ee))
#
	return  str_out
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
access_token="*******your_access_token**********"
file_json = sys.argv[1]
#
json_str = file_to_str_proc(file_json)
#
url="https://api.github.com/graphql"
#
headers = {'Authorization': 'Bearer ' + access_token}
#
response = requests.post(url, headers=headers, data=json_str, timeout=(3.0,7.5))
#
print(response.text)
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

```json:query.json
{
 "query": "query { user(login: \"ekzemplaro\") { name }}"
}
```

実行結果

```text
$ ./get_data.py query.json
*** 開始 ***
{"data":{"user":{"name":"Uchida Masatomo"}}}
*** 終了 ***
```

## 確認したバージョン

```text
$ python --version
Python 3.10.10
```
Laravel tinker で Faker を試す方法

# tinkerとは

Laravel では `php artisan tinker` というコマンドを実行すると、
Laravel の機能を試せる REPL が起動します。
REPL (Read-Eval-Print Loop) は、入力・評価・出力のループのことです。
PHP や Laravelの機能を対話的に実行できる便利機能です。

# Fakerとは

Laravelに標準搭載されているダミーデータ生成ライブラリです。
メールアドレスや日付、電話番号などのダミーデータをお手軽に作れます。

# tinker で Faker を使用する

```shell-session
$ php artisan tinker
>>> $faker = app()->make(Faker\Generator::class)
=> Faker\Generator {#3319}

>>> $faker->safeEmail()
=> "kondo.yui@example.com"

>>> $faker->emoji()
=> "😔"

>>> $faker->imageUrl()
=> "https://via.placeholder.com/640x480.png/0066ee?text=aut"

>>> $faker->dateTimeBetween('-2weeks', '9 days')->format('Y-m-d H:i:s')
=> "2020-11-28 05:24:51"
```

## 参考

- https://github.com/fakerphp/faker
- ~~https://github.com/fzaninotto/Faker~~
  - アーカイブされました。

## 補足: fzaninotto/Fakerのアーカイブ

最近の話(2020年10月21日)ですが、 [fzaninotto/Faker](https://github.com/fzaninotto/Faker) の本家のリポジトリがアーカイブされています。
詳細については、下記のリンクをご参照ください。

- https://marmelab.com/blog/2020/10/21/sunsetting-faker.html
- https://twitter.com/taylorotwell/status/1321091021342650377

今後は[フォーク先のリポジトリ](https://github.com/fakerphp/faker)でメンテナンスが続けられるそうです。
また、こちらの[プルリクエスト](https://github.com/laravel/framework/pull/33388/files#diff-d2ab9925cad7eac58e0ff4cc0d251a937ecf49e4b6bf57f8b95aab76648a9d34R125) で既にライブラリの変更が行われてます。

- v8.12.0 (2020-10-29)
- v7.29.0 (2020-10-29)
- v6.20.0 (2020-10-28)

上記のバージョン以降のLaravelをご利用であればフォーク先のリポジトリが使用されます。
Window縮小時にDropdownの表示がずれる(bootstrap4)

## 画面が小さい状態でドロップダウンを表示するとメニューの位置がずれてしまう...

```
<div class="dropdown">
  <button class="dropdown-toggle" type="button" 
          data-reference="dropdown-toggle" data-toggle="dropdown" 
          aria-haspopup="true" aria-expanded="false">Submit
  </button>
  <div class="dropdown-menu dropdown-menu-right"></div>
</div>
```

### 解決

> Note when boundary is set to any value other than 'scrollParent', the style position: static is applied to the .dropdown container.
[Dropdowns Bootstrap](https://getbootstrap.com/docs/4.0/components/dropdowns/)

`data-display="static"`で動的な表示位置の変更を止める
メニューにmargin等を設定して位置を微修正👍

```
<div class="dropdown">
  <button class="dropdown-toggle" type="button" 
          data-reference="dropdown-toggle" data-toggle="dropdown" data-display="static" 
          aria-haspopup="true" aria-expanded="false">Submit
  </button>
  <div class="dropdown-menu dropdown-menu-right mt-3"></div>
</div>
```
JuliaのフルスタックMVCフレームワーク Genieの環境構築 最新版(2019/4月)

Keiです。最近は長らく愛用していたPythonを捨ててJuliaにゾッコンの自分ですが、大学院の研究でJuliaを使うだけではWebフレームワークまで触る機会がなくてなんだかもどかしいなーと感じていました。
そんな中最近やっと少し時間が取れたので早速JuliaのWebフレームワークの中で最も開発が盛んな**Genie**から触っていこうと思います。
<a href="http://genieframework.com/">**Genie公式**
<img src="https://camo.qiitausercontent.com/4ee2e92bed1b322ac15196cb83d8fdc39d986f4d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3236343331352f61346664633365622d383065392d303435642d353534642d3664306530626162383034322e706e67" width="600"></a>

相変わらず日本語の情報が少ない & 古くてほぼ当てにならなかったので潔くGenieの公式レポジトリの説明を読むことにしました。恐らく以下が最新のGenie環境構築手順になります。
実行環境はUbuntu 18.04 LTS, Julia v1.1です。Julia本体の環境構築自体は本記事では説明しませんが、Macであればbrew cask install juliaですんなり入りますし、ソースからビルドしても(時間はかかりますが)特にハマりどころもなくインストールできますので、[こちらの記事](https://qiita.com/phigasui/items/8af41d1bcbe7ef276cfe)など参考にJuliaを使えるようにしてから以下読み進めてください。

## 1. Julia REPL起動後プロジェクト用の仮想環境を作り、その環境内に入る

```shell
$ julia                                  # julia REPL起動
julia >                                  # ] を押してpkgモードに入る
(v 1.1) pkg > activate project_env_name  # project_env_name は各自適切な仮想環境の名前に置き換えてください
```
この時点ではまだ作成した仮想環境名を持つディレクトリは`ls`しても見えませんが、仮想環境内に入れている事はpkgモードの表示が

```shell
(v 1.1) pkg >
```
から

```shell
(project_env_name) pkg>
```
に変わっていることで確認できます。

## 2. この仮想環境内にGenieをインストール

```shell
(project_env_name) pkg > add https://github.com/essenciary/Genie.jl 
```
これが終わった時点で初めて仮想環境名を持つディレクトリが見えるようになります。
REPLで`;`を押してshellモードに入り`ls`すると`project_env_name`を持つディレクトリが出来ており、その中に
`Project.toml`と`Manifest.toml`ファイルが出来ていることが確認できます。

```shell
shell > ls
project_env_name

shell > tree project_env_name
project_env_name/
├── Manifest.toml
├── Project.toml
```

## 3. 仮想環境内に入り新規プロジェクト作成と同時にサーバー起動

```shell
shell > cd project_env_name
julia > using Genie
julia> Genie.REPL.newapp("project_name")   # 新規Genieプロジェクト作成 & サーバー起動
```
なおGenie.REPL.まで打ってタブ補間するとnewapp()の他にnew_app()という関数も出てきますがこれは恐らく古い方のコマンド?で、new_app()でプロジェクトを作成すると依存関係にあるパッケージの一部がインストールされず、再度サーバー起動しようとする時に自分の環境ではコケたので注意してください。

また参考にした記事ではこの後

```shell
julia> Genie.AppServer.startup() 
```
が必要と書いてありましたが最新のGenieでは不要で、新規プロジェクト作成と同時に`http://127.0.0.1:8000`でサーバーも起動するようになったようです。またここで起動したサーバーは**JuliaのREPL自体をexit()で抜けない限りずっと立ち上がったまま**なので、例えばログが出ている状態で`ctrl + c`とかしてもログが一時的に画面から消えるだけでサーバー自体は生きている点に注意。

以後別セッションでサーバーを再度起動したい時などは、上で作成したプロジェクト内(not仮想環境内)で再度pkgモードに入り、

```shell
pkg > activate .            # 仮想環境を有効化した後pkgモードを抜ける
julia > using Genie         # Genieの使用宣言
julia > Genie.loadapp()     # プロジェクトコードのロード & DevモードでGenie起動
julia > ProjectName.startup()   # サーバー起動
```
でOK。

参考URL:

- https://github.com/essenciary/Genie.jl
- https://www.mathwithjulia.com/entry/2019/02/12/044921
goenvを1.23系から2系にしたときにGOPATHでハマった話

## TL;DR;
- goenvは2.0系(とりあえずbeta6想定)からGOPATHを管理してくれるようになった
    - 基本的には、この動作は妥当なので、おとなしく従った方が良さそう
- この挙動は環境変数を `GOENV_DISABLE_GOPATH=1` と設定することで抑止できる
- 2.0系はbeta版なので(2019/4/8現在)betaが付いてない最新版1.23.3を使った方がいいかもしれない

注意: Go Modulesの話は書きません

## 問題の発覚
- goenvは[公式の説明](https://github.com/syndbg/goenv/blob/master/INSTALL.md)の通り`git clone https://github.com/syndbg/goenv.git ~/.goenv` で導入
- 元々、 `GOPATH=~/go` を前提に諸々の組んでいた
- PATHも `~/go/bin` に通していた(.bash_profile等で設定)
- goenvでgoをインストール
    - `goenv install 1.11.0`
    - `goenv global 1.11.0`
- パッケージ管理のdepも `go get -u github.com/golang/dep/cmd/dep` でインストール
- プロジェクトのディレクトリで `dep ensure` すると
    - `-bash: dep: command not found`
- ん？インストール先を見てみる

```sh
> ls ~/go/
1.11.0
> ls ~/go/1.11.0 
bin src
```

- 確かこうだったような…

```sh
> ls ~/go/
bin src
```

## goenvの仕様変更
何でだろうと思い、[変更履歴](https://github.com/syndbg/goenv/blob/master/CHANGELOG.md)を見てます。
すると[2.0.0beta6](https://github.com/syndbg/goenv/blob/master/CHANGELOG.md#200beta6)にこんな記述があります。

> Changed goenv's bootstrap (eval $(goenv init -)) now to call goenv-sh-rehash --only-manage-paths. This means that it'll export and manage GOROOT and GOPATH env vars

つまり、goenvが使ってるバージョンごとにGOROOTとGOPATHを管理・変更してくれる、と。
例えば1.11.0を使っている場合はこうなります。

```sh
> echo $GOPATH
/home/ユーザ名/go/1.11.0
```

ふむふむ、分かるよ。
バージョンごとに置くべきだよね。
自分のソースも `/home/ユーザ名/go/1.11.0/src` 配下に置けばいいんだよね。
妥当だ。

ただ、`~/go/src`配下にあることを前提としたアレコレがあったり、とりあえず今はこちらの指定したGOPATHに従ってほしい……。

※補足: Go Modulesの話が出ると話が違ってくるので、参考サイトだけ貼ってお茶を濁しておきます。

- [Go Modulesの概要とGo1.12に含まれるModulesに関する変更](https://budougumi0617.github.io/2019/02/15/go-modules-on-go112/)
- [Go Modules(Qiita)](https://qiita.com/propella/items/e49bccc88f3cc2407745)


## 回避方法
### 古いgoenvを使う
[公式](https://github.com/syndbg/goenv/blob/master/INSTALL.md)では`git clone https://github.com/syndbg/goenv.git ~/.goenv` とmasterを取得する方法が紹介されていますが、バージョンを指定してインストールすることもできます。
(そもそも、2019/4/8現在、masterにあるのは2.0.0のβ版なので、これ使うのが妥当かどうかは微妙な気もします)

ということで、`git clone https://github.com/syndbg/goenv.git -b 1.23.3 ~/.goenv`と2系になる前の最新をタグで指定してインストールすれば、従来通りです。

### GOENV_DISABLE_GOPATHでGOPATHの管理を拒否する
README等の資料には記述がありませんが、[変更履歴#2.0.0beta6](https://github.com/syndbg/goenv/blob/master/CHANGELOG.md#200beta6)を見るとこんな記述があります。

> Add management of env variable GOPATH that can be disabled with env var GOENV_DISABLE_GOPATH=1, when calling goenv-sh-rehash (goenv rehash when eval $(goenv init -) was previously executed).

つまり、`GOENV_DISABLE_GOPATH=1`を設定しておけば、GOPATHを管理する機能を無効化できるわけですね。

```sh
# ~/.bash_profile
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
export GOENV_DISABLE_GOPATH=1
eval "$(goenv init -)"
export PATH="$GOROOT/bin:$PATH"
export GOPATH="~/go"
export PATH="$GOPATH/bin:$PATH"
```

この状態で例えばこの辺をインストールしてやれば、従来通り、`~/go`(正確には自前で設定したGOPATH)直下にインストールできます。

```sh
> go get -u github.com/golang/dep/cmd/dep
> ls ~/go
bin src
> ls ~/go/bin
dep
```

### 謝辞
諸々助言をくれたKurosawaさん、momoさん、ありがとうございました。
PureScriptプロジェクトをバンドルしてブラウザで表示するメモ

## 手順メモ

タイトルがカタカナばっかりで嫌です。

ほぼ自分用の雑メモです。詳しいことは書いてません。でも超簡単です。

本記事では、yarnがグローバルインストールされていることを前提とします。

以下のコマンドを使います。

```bash
$ mkdir purs-js-test
$ cd purs-js-test
$ yarn init -y
$ yarn add -D purescript spago parcel-bundler
$ yarn run spago init
$ yarn run spago install
```

必須ではありませんが、PureScriptファイルで補完を使いたい場合は以下を実行すると良いです。一度ビルドした後から補完が有効になります。

```bash:※補完が必要な場合のみ
$ yarn add -D bower
$ yarn run bower init
$ yarn run bower install -D purescript-effect purescript-console purescript-prelude
```

次に、以下の2ファイルを用意します。

```html:src/index.html
<html>
   <body>
      <script src="./index.js"></script>
   </body>
</html>
```

```js:src/index.js
require("../output/Main").main();
```

```haskell:src/Main.purs
module Main where

import Prelude
import Effect (Effect)
import Effect.Console (log)

main :: Effect Unit
main = do
  log "Hello world!"
```

以下のコマンドを使います。

```bash
$ yarn run spago build
$ yarn run parcel src/index.html -p 12345
```

ブラウザで以下のURLにアクセスします。

http://localhost:12345

F12を押して、コンソールに「Hello world!」と表示されていれば成功です。


## 依存パッケージのインストール方法

プロジェクトを配布するときには以下のファイル・ディレクトリを含めます。

- ``package.json``
- ``packages.dhall``
- ``spago.dhall``
- ``yarn.lock``
- ``src/``
- ``test/``

GitHubリポジトリなどのクローンで配布された側は、以下のコマンドを使うだけで依存パッケージをインストールできます。

```bash
$ yarn install
$ yarn run spago install
```

あとは前節に書いたビルド手順に従います。
#perl で標準入力でテキストを受け取り指定の文字数で切り取るコマンド例 (正規表現利用)

細かい部分は考慮していないお手軽な奴

```perl
$ echo "123456789" | perl -pe 's/^(.{3}).+/\1/g'
123
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1116








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rails version update 覚書

覚書

## Rails update

Gemfileで今回updateしたいrailsのversionに変更する

```
-gem 'rails', '5.~.~'
+gem 'rails', '5.~.~'                                                                                                                                    
```

- bundle updateする
`bundle update --conservative rails`

`--conservative`を使うことで共有の依存関係を更新しないで`bundle update`が行える
https://bundler.io/v1.15/man/bundle-update.1.html#OPTIONS

実行すると以下のエラーが出る

```
Bundler could not find compatible versions for gem "actionview":
  In snapshot (Gemfile.lock):
    actionview (= 5.~.~)

  In Gemfile:
    rspec-rails was resolved to ~.~.~, which depends on
      actionpack (>= ~.~) was resolved to 5.~.~, which depends on
        actionview (= 5.~.~)

    rails .........................

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
```

ビビらずに`In snapshot (Gemfile.lock)`の中身だけを見ていけばいい

次に打つコマンドは
`bundle update --conservative rails actionview`
というように落ちるたびに追加していけば良い

最終的には
`bundle update --conservative rails actionview activesupport railties actionpack activemodel activerecord`
こういうコマンドになるのですが、依存するgemがありすぎて実行できなかったので、まず最初にrails以外のgemを最新にしとく必要がありますね…

次回に続く！
[alexa day 2019 参加レポート]Backlog for Amazon Alexa enhance を 全部見せます

# 概要

登壇者: 伊東 知治さん
スライド: https://speakerdeck.com/haruharuharuby/backlog-for-amazon-alexa-enhance
ターゲット: Alexa Skill の開発の経験があるかた、もしくは、興味のあるかた

プロジェクト管理ツール Backlog とリンクすることのできる Alexa Skill version 2のエンハンスの中身全部見せます。
全ての機能をどのようにエンハンスしていったか。会話設計から各APIの実装、テストまで全部見せます。

引用: https://alexaday2019.aajug.jp/session/168/

# 導入
- Backlog for Amazon Alexaというスキルがあり、今回v2の開発において...な話
    - 進捗の確認とかできる
    - https://backlog.com/ja/blog/jbug-backlog-for-amazon-alexa/
- v1の設計は主に以下から構成していた
    - communicationレイヤー
        - ユーザーとの会話を豊かにするレイヤー
    - workflowレイヤー
        - 発話内容から意図を汲み取り、処理するレイヤー
    - repositoryレイヤー
        - backlogAPI叩いたりしてデータを扱うレイヤー

# Be a adviser

- ボイスアシスタントは機能ではなくノウハウを実装すべき（アドバイザーであるべき） 
- プロジェクトマネジメントにおけるボイスアシスタントの役割はなにか考える
    - プロジェクトマネージャーは普段どうしてるのか考えてみる
    - インプット -> 分析/判断 -> 決定 じゃね？
    - つまり、アシスタントからは意思決定のための情報が欲しい
    - backlogの全機能をalexaから使える事ではない
- backlogとユーザーをつなぐ部分にボイスアシスタントが一手間加える感じ


# それを踏まえて新しい設計/実装

- v1の設計をベースに、以下を追加
    - analyticsレイヤー
        - backlogから取得したデータを分析するレイヤー
- aws codeStarおすすめ
- codeStarは裏でcloudformationのデプロイが走る
    - ASK-CLIより遅い
    - エディタがcloud9はちょいネック
- プロジェクト作成後、即デプロイすること
    - パイプラインを確立させておく
    - その後変更を加えていくのが安パイ
- interactionModelを作ってあとからcodeStar経由でのデプロイは不可能
    - 注意書きにもそうあるっぽい
- スライドではi18n/localizationなことにも触れてるので、多言語対応するなら参考になる
- communicationレイヤーでは `Talkクラス` を作って、会話を構成してる
- workflowレイヤーはハンドリングするだけなのでとてもシンプルに



# 感想

設計論的な話がメインで、アプリケーション設計とか勉強している身としてはとても面白かった。
- 関心事はなにか
- ボイスアシスタントはなにをすればいいのか
- オブジェクト指向
- DRY
などなどを考えた結果、こんな感じになったのかーととても心打たれた。

あと、codeStarおすすめは繰り返しおっしゃっていたので使ってみたい。
IBMiのIDE(ILEditor)の文字化け対応してみた

# ILEditorとは？
IBMi専用の無料で使用できる開発環境(IDE)です。
IBMiのソースをPCにダウンロードして編集したりコンパイルが出来きたりするのですが、
残念ながら日本語のソースは文字化けして正しく動きません。
日本語のソースを文字化けしないように改修したので記事にしました。

# インストール方法
1. [本家のサイト](https://worksofbarry.com/ileditor/)からダウンロードしてインストールして下さい。
2. [ここ](https://github.com/ymurata1967/ILEditor/releases/tag/1.6.8.0Jp)からexeファイルをダウンロードし、インストールされた同じフォルダに置いて下さい。<br>
オリジナルを消したくない場合はILEditorJp.exe等適当に名前を変更して同フォルダに置いて下さい。

# 文字化け対応方法
以前に[IBMiCmdをShiftJis対応してみた](https://qiita.com/yamurata/items/7313094a0080f4f74283)という記事で、notepad++のpluginを文字化け対応したのですが、同じ方法では駄目でした。
notepad++の時はftpのダウンロードやアップロード時に日本語が通るようにしていたのですが、ILEditorではFluentFTPというC#ネイティブのFTPクライアントライブラリが使用されています。

当初はFluentFTP側で対処出来ないかテストしていたのですがどうも上手く動かず、
仕方なくIBMi側でコード変換してからバイナリモードでダウンロード、アップロードするようにしました。

基本的には、
1. 対象のソースをCPYコマンドでIFSにコピー
2. コピーされたソースをCPYコマンドでコード変換（CCSID=943）
3. バイナリモードでダウンロード
という方法で実現しています。

アップロードはこの逆を行います。

# ワークフォルダ
上記の実装にしたため、IFS上にコード変換用のワークフォルダ／ファイルを作成します。
/tmpフォルダ配下に
/ILEDITOR/ユーザー名/
フォルダを作成し、その配下にワークファイルを作成します。

※ILEDITORを使用しなくなった際は手動で削除して下さい。

# エディタ部の文字コード
Shift-Jisにしています。
なお、日本語フォントを追加しました。（ＭＳ ゴシック、ＭＳ 明朝）
Connetion SettingsのEditorタブで指定出来ます。

# IFSにあるファイルの表示／保存
ILEditorではIFSにあるテキストファイルが表示できますが、エディタ部はShift-Jis固定なので
IFS上にあるファイルもいったんCCSID=943に変換してからダウンロードします。

SAVEするとIFSに反映されますがこの時はUTF-8で保存する仕様としました。
本来はダウンロードする際に元の文字コードを保持し、そのままアップロードするべきですが、
そこまで気力が無く・・・。

という事で、IFSを保存（アップロード）する際は気を付けてください。

# 日本語化できなかった部分
1. 新しいソースメンバーを作る事が出来ますが、その際に入力するテキストに日本語を入れると化けます。
2. コンパイルエラーの時にジョブログを表示する「show job log on compile」というオプションがあるのですが、チェックを入れると動きがおかしくなるようで、日本語はしませんでした。

# ソースを表示する際にエラーが出る場合
文字コード変換はIBMiで行いますがコード変換に失敗するとソース表示時にエラーが発生します。
![ileditor01.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/e152d581-3b65-12cc-634e-8ad5fd04e1cf.png)
（例えば、シフトアウト有り／シフトイン無しのソースだと変換エラーになります。）
Help→Session FTP Logでログが表示されるので、エラーが発生したコマンドを5250から実行してみる、WRKACTJOBのJOBLOGからエラーのコマンドを特定する、等でエラーの原因を特定して下さい。

# ログインするユーザーのCCSID
5026でも5035でも問題無いかと思いますが、ソースのCCSIDとログインユーザーのCCSIDは合わせてください。
また65535は一部機能でエラーが発生しますので注意して下さい。
（SQLのREPLACE関数を使用していますが65535だと実行できないようです。）

# 応用編（バージョン管理）
ダウンロードに使用されているフォルダをバージョン管理対象にすれば可能かと思われます。

ILEditorは
C:\Users\ユーザー名\AppData\Roaming\ILEditorData\source\システム名\ライブラリ名\ソースファイル名\メンバー名
という階層でデータを保持します。

以下はSVNで変更差分を取ってみた例です。
![ileditor02.PNG](https://qiita-image-store.s3.amazonaws.com/0/146069/0581da14-0277-c39a-54f0-2898601dfa31.png)

なお、このツールを使用する事により障害等が発生しても一切の責任を負いません。
自己責任でお願い致します。
海外は良いツールが沢山ありますねぇ。
Ganache-cliで eth_getTransactionReceipt と eth_getBlockByNumber が繰り返す

# 原因
**何らかの** ライブラリのバージョンがずれている(古い、もしくは新しい)

# 対策
ライブラリのバージョン確認。
lockファイルがある場合はそれに忠実に従う。フロントエンドののりでざっくりやっていると結構動かない。

# 出力

```bash
eth_sendTransaction

  Transaction: 0xf4df959902808c087ed66f512b95e5cbdcb1f5a1469b41d907e7a986c418fd16
  Contract created: 0x8ea8a4517f6772b9bc656ca14e54630f667ca40c
  Gas usage: 405335
  Block Number: 1
  Block Time: Mon Apr 08 2019 17:57:35 GMT+0900 (Japan Standard Time)

eth_getTransactionReceipt
eth_getBlockByNumber
eth_getTransactionReceipt
eth_getBlockByNumber
eth_getTransactionReceipt
eth_getBlockByNumber
eth_getTransactionReceipt
eth_getBlockByNumber
eth_getTransactionReceipt
eth_getBlockByNumber
eth_getTransactionReceipt
eth_getBlockByNumber
...
```
VSCode で UML とか扱いたい人の話

# VSCode で UML とか扱いたい人の話

## 背景
VS Code でUML作ってね☆彡
って言われた人のために手順やサンプルなど

## 環境
- Java 実行環境
インストールして、環境変数にパスを’通すなどしておいてね

## 手順
- VS Code 　⇒　Ctrl + Shit + x （拡張機能を開く）
- "PlantUML" で検索してインストール
- 拡張子 ".pu" でファイルを作って
- PlantUMLの記法に合わせてファイルを作って
- Alt + D でプレビューできる

## 構成
- [PlantUML を便利に使うための3つの Tips - Qiita](https://qiita.com/harunapple/items/775bf0649a6a726f7a7a)
こちらを参考に（パクらせて）頂いています


```
C:.
│  README.md
│
├─out
└─src
    │  sample.pu
    │
    ├─assets
    └─inc
            sd_layout.pu
            sd_settings.pu
```

## Sapmle Code など
sample.pu

```
@startuml sample.png
!include src/inc/sd_settings.pu
!define _TITLE_ Sample
!define _LAST_MODIFIED_ 2019-04-08
!define _VERSION_ 0.0.1
!include src/inc/sd_layout.pu

participant 顧客 #99CCFF
/'participant 予備 #FFCC66'/

顧客-> メーカー: オーダー
note over 顧客,メーカー
    - 商品ID
end note
loop 1, 購入個数
    顧客 -> メーカー : 型番
    end
note over 顧客
end note
note over メーカー
	- 「商品ID」に対応した納品元を検索
end note
メーカー -> 納品元: 該当納品元オーダーを送る
note right 
   よろしく
   おねがい
   します
end note
納品元 ->メーカー: 完了
メーカー ->顧客: 完了

@enduml
```

sd_settings.pu

```
/' 定数 '/
!define _PROJECT_CODE_ Sample_Project

/' スキン設定 '/
skinparam sequenceActorBorderColor #666666
skinparam sequenceActorBackgroundColor #ffe4e1
skinparam sequenceParticipantBorderColor #999999
skinparam sequenceParticipantBackgroundColor 	#FFFFCC
skinparam sequenceArrowColor #666666
skinparam sequenceLifeLineBorderColor #999999
skinparam sequenceBoxBorderColor #666666
skinparam noteBackgroundColor #ffffcc
skinparam noteBorderColor #999999

/' 共通設定 '/
hide footbox
/'autonumber'/
```

sd_layout.pu

```
/'right header LastModified: <b>_LAST_MODIFIED_</b>　Version: <b>_VERSION_</b>　'/
title <size:20> _TITLE_ \n<img:http://placehold.it/640x1/ffffff/ffffff&text=+>

right footer

　
endfooter
```