OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのprint文をいろいろ調べました

大したことしていないので、ブランクが空くのはしょうがない:sob:。
# 電卓叩いていた計算をプログラム化
ふと思い立つところがあって、今まで電卓叩いていた計算をPythonでプログラムにしてみました。言ってみれば草の根RPAですよ（別に偉そうにいうほどのものでもない）。

やりたいことは以下の通り。

- 計算式はほぼ一定
- 変数は4つで、ただの掛け算
    - 値段
    - 掛け率
    - 数量
    - 消費税率
- 計算結果は支払先にメールでお知らせ
    - 数値をはめ込んだ計算式、計算結果、その他の情報と一緒に、送る文面も生成したい
- 数値は3桁ずつ区切りたい

変数にした諸情報をコードの中に書き込むのか、<code>input</code>で入力するのかは、どっちがいいのか思案中。計算に使う数値はインプットして、文字の入力はコードの中に書くようにしています。

遠い将来は入力値をDBに追加したり、そのDBから引っ張って変数に代入したりしたいですが、今はあまり考えますまい。

で、ひと通り作って、自分の仕事にも使えそうだというところまで確認。

そこで、今回の「身に付いたこと」です。主にprint文で文字や数値を表示するときの取り扱いに関して。
## &#9312;空き行はprint()で
確認かたがたコードに書き込んだ情報をまず表示するようにしました。計算結果を含むお知らせ文章との間を空けるのに<code>print()</code>を使いました。やっぱり最初はそういうことにも悩むよね。

なお、3行空けたかったので、ついでにfor文もおさらいすることにして、<pre># 空き行挿入
for i in range(2):
    print()
</pre>と書きました。<code>range()</code>の書き方も<code>print()</code>の書き方もいちいちググらないと正しく書けません(>_<)。
## &#9313;数値を3桁で区切ってprint
print文の中で10万円単位の金額を取り扱います。7桁になることは滅多にありませんが、通常6桁にはなる。やはり3桁で区切りを入れたいところです。

調べたところ、<code>print('{:,}'.format(onedan))</code>で3桁区切りになるらしいとのことでした。実際にはonedanのところは計算結果を小数点以下なしで表示するためにint文で整数に直しています。ここも少々はまりポイント（後述）。

で、<code>print('お値段は……', '{:,}'.format(onedan), '円です♪')</code>とやったところエラーになったので、パラメータの先頭に入れたら解決しました。ところがこれだと
> お値段は……
> 999,999 円です♪

となってしまったので、この2行をつなげなければなりません。
## &#9314;複数のprint文を改行なしでつなげる<code>end</code>
それにはprint文を複数並べても、行を変えずに表示する必要があります。調べたらやはりありました。print文の引数の最後に<code>, end = 'ほにゃらほにゃら'</code>と付けると、ほにゃらほにゃらの後ろに次のprint文が続くそうです。

自分のコードでいうと、<pre>print('お値段は……', end = '')
print('{:,}'.format(onedan), '円です♪')</pre>で、
> お値段は…… 999,999 円です♪

と返って来ます。でも、今それを確認しようと<pre>print('お値段は……', '{:,}'.format(onedan), '円です♪')</pre>とやってみたら、ちゃんと表示されました。最初にエラーが出たときは、きっと何かをやらかしていたのに違いない。でも、今となってはそれが何だったのか…。とんだ遠回りになってしまいましたが、<code>end</code>を覚えたのでヨシとします:sob:。
## &#9315;数値型はそろえないと計算できない？
調べてませんが、エラーが出たので覚えたこと。ほとんどの計算は値が整数なので、変数の数値型には気を配らずにプログラムを作っていたのですが、テスト中に掛け率が小数になるケースもあることを思い出しました。で、3.5とか入れるとエラーになります。

すると、3.5を格納する変数をfloatで代入するだけじゃだめなんですね。これを使う計算式で取り扱う変数全部をfloatにしとかないといけないんですね←確かめてないけど、そうなったからそうなんだと理解。

ん？ とよくコードを見直してみたら、必ずしもそろってない…。ありゃあ、またエラーの原因を早合点したかなあ…。数値の型については宿題にしておきます。

＃調べてる時間がなくなってしまった…

相変わらず入門レベルですが、何か勉強したらまたまとめます。
XMLファイルをPandas.DataFrameで扱いたい

# XMLファイルをPandas.DataFrameで扱いたい
pandasはcsvやjsonを扱う時は便利ですが、xmlは対応してくれていないのか、良い方法が思いつきませんでした。
xmlをdictやjsonに変えたりすることも考えたんですが、ネストされたxmlを扱うと途端に敷居が高まります。
これは変換する時に文字列にされてしまうために、シングルクォーテーションをダブルクォーテーションに置き換えたり、意味のあるオブジェクトであることを維持し続けなければならない等の制約があるため、だと理解しました。
→【要出典】

# 結論
[やりたいことは全部ここにあった](https://gist.github.com/mattmc3/712f280ec81044ec7bd12a6dda560787)んですが、ここの通りxmlをアレコレやって直接dataframeに置き換えるのが一番いいのかなぁ、と思ってます。
私が活用した時のコードは以下のとおりです。
執筆時点の最新版と同じものです。

``` xml2df.py
import xml.etree.ElementTree as ET
import pandas as pd

def xml2df(xml_data):
    root = ET.XML(xml_data) # element tree
    all_records = []
    for i, child in enumerate(root):
        record = {}
        for subchild in child:
            record[subchild.tag] = subchild.text
        all_records.append(record)
    df = pd.DataFrame(all_records)
    return df

# load XML to dataframe (gotta be small)
xml_data = open('sample.xml').read()
df = xml2df(xml_data)
print(df)
```

色々なところで扱ってるサンプルコード程度なら意図した結果が得られると思います。

# 参考
私が使ったxmlと結果も載せておきます。
テストケースとしては優秀ではないですが、やりたいことは実現できました。

``` sample.xml
<?xml version="1.0" encoding="UTF-8" ?>
<sports>
  <sport>
    <name>サッカー</name>
    <orgin>イングランド</orgin>
  </sport>
  <sport>
    <name>野球</name>
    <orgin>アメリカ</orgin>
  </sport>
</sports>
```

``` 
# result
   name   orgin
0  サッカー  イングランド
1    野球    アメリカ
```

# 注意・懸念
root(sports)や親情報(sport)がなくなっているので、親ノードが複数存在する場合は予期せぬ結果になる可能性があります。
親情報も保持したい場合はdataframeではなくpanelで持つか、df_dictなどで持つ方が良いと思います。

が、どちらにしても親情報が破棄されてしまっているため、このコードはそのまま使えない気がします。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
次世代の画像フォーマット

### 更新（2021/08/07）

SafariがWebPに対応したので、これからはWebP一択ですね！やったね！！

（更新箇所終了）

題名の通り次世代の画像フォーマットについての記事です。
次世代の画像フォーマットは具体的に**WebP**と**JPEG 2000**と**JPEG XR**があります。
余談ですが自分は対応は見送ります。やってみたら大して軽量化にならないことがわかったので...

###そもそもWebPとJPEG 2000とJPEG XRって何者？

####WebP
WebPとはGoogleが開発した静止画フォーマットです。
対応ブラウザはIEとSafariを除くほとんどのブラウザです。
対応状況は世界で約78.83%、日本で44.3%です。
![6735A517-1D99-4ABD-B113-592C27AC13D9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321589/9c42607b-d61d-155d-7ac1-93ce16591331.jpeg)
日本はAppleユーザーが多いため世界より対応状況が低い結果になったのだと思われます。

####JPEG 2000
JPEG 2000はJoint Photographic Experts Groupが開発した静止画フォーマットです。
対応ブラウザはSafariです。
対応状況は世界で約13.65%、日本で44.49%です。
<img width="904" alt="16731FCC-E6EF-42B7-B0A4-09BA61FB7514.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321589/d486b5d9-ea74-21e2-e333-17af7048b8b6.jpeg">
やはり日本のAppleユーザーは多いですね。私もですけど。

####JPEG XR
iPhone XRじゃないですよ。
開発元はさっきと同じJoint Photographic Experts Groupです。
対応ブラウザはIEとEdgeです。
対応状況は世界で4.87%、日本で8.56%です。
<img width="910" alt="E44D514E-0C95-4829-802B-73F2F49CA6FB.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321589/7b022824-90ce-73eb-46f3-2769061d8d0c.jpeg">

####まとめ
これだけ見ると全部実装して分岐して処理すればいいジャーンって思いますよね？でもそれはよろしくないです。実はSafariが対応しているJPEG 2000に大きな問題があります。この子は困ったことに変換すると既存のファイルよりも容量が大きくなってしまいます。また、JPEG XRについてもIEからEdgeに変わりつつあるのでわざわざ実装する必要性はないと思います。Appleさんが負けを認めてWebPに対応するまでは様子を見たほうがいいかもしれません。

### じゃあどうする？

WebPとJPEGだけで実装する方法です。
source要素というのがHTML5で実装されました。それを使います。

```HTML
<picture>
   <source type="image/webp" srcset="hoge.webp">
   <img src="hoge.jpg" alt="ホゲホゲ">
</picture>
```

Appleさん意地にならないでよ〜
【機械学習】決定木モデルの違いをまとめてみた

# 1.はじめに

以前の投稿で、機械学習について２つの記事を書きました。
全体像([機械学習初学者の私に告ぐ「4つの忠告」](https://qiita.com/takuya_tsurumi/items/38f2858221599d5f93bd)の2-2)と
前処理([機械学習のデータ前処理備忘録](https://qiita.com/takuya_tsurumi/items/53b9e3f7427b631b17cf))についてです。
他の箇所についてもまとめていきます。


# 2.機械学習の全体像振り返り

以前の記事でも紹介した機械学習の全体像を以下に示します。
今回は赤枠で囲った手法選択についてです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/3959eff8-584f-9b3f-06e3-bc27a26cb8dc.png)


図.2-1 機械学習の全体像

この手法選択の中でも最近私がよく使用している決定木モデルについてまとめます。
決定木モデルは、回帰モデルと分類モデルとどちらもライブラリとして用意されていますが、
今回は分類モデルについてです。


# 3.決定木モデルとは

そもそも決定木モデルとは何なのでしょう。
決定木モデルは不純度を表す、ジニ係数(もしくはエントロピー)を使用して、
分類していくモデルです。
分類していく様子を可視化できるところにも強みがあります。

ここでジニ係数の数式的な説明は省きますが、
感覚的に掴んでいただくために、以下のことを想像してみてください。

あるところにブラックチョコレート、ミルクチョコレート、ストロベリーチョコレートの
3種類のチョコレートが50個ずつあります。
この複数個のチョコレートを種類ごとに3つのグループに分類するとします。

このチョコレートのとある特徴量に閾値を持たせ、その閾値によって分けていき、
3種類が全て分かれている状態を目指していきます。


例えばカカオの量が50%以上かどうかなどで分類をします。
この時ブラックチョコレート、ミルクチョコレート、ストロベリーチョコレートが
それぞれ30個ずつ混ざって1つのグループ状態になっている場合、ジニ係数は高く、

ブラックチョコレート、ミルクチョコレート、ストロベリーチョコレートが
それぞれ綺麗に3種類に分け切れている状態だとジニ係数は0になります。

以下実際にIrisのデータセットで決定木モデルを使用し、可視化した例を貼ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/730bd067-3083-80ef-70d7-6e1ebc3c6385.png)


図3-1.Iris データセットを用いたDecisionTreeClassifierを可視化

以上がシンプルな決定木モデルです。
この決定木モデルを応用させたモデルがいくつかありますので、その違いについて次章に書きます。


# 4.各モデルの違いについて
## 4-1.決定木モデルの種類
　
まず、決定木モデルを応用したモデルとして、以下のようなものがあります。
・XGBoost
・LightGBM
・RandomForest

大きく分けると XGBoost と LightGBM はブースティングという手法を用いており、
RandomForest はバギングという手法を用いています。

このブースティングとバギングの二つを説明するためには、
バイアスとバリアンスという言葉を理解する必要があるので、
まずこの二つの違いについて説明します。

## 4-2.バイアスとバリアンス

#### ■バイアス
バイアスとは、「偏り」という意味を持った言葉であり、
機械学習の分野では、「実際値と予測値との誤差の平均」を表します。
わかりやすい例でいうと、以下の式のbの部分です。

$$y=ax+b$$

#### ■バリアンス
バリアンスとは、「分散」という意味を持った言葉であり、
機械学習の分野では、「予測値の散らばり度合い」を表します。

以下の図は、バイアスとバリアンスを説明する際によく使われる、
バイアスとバリアンスの高低差を図にしたものです。
赤丸が真の値、青い点は予想値になります。

こちらを見ていただくと視覚的にイメージできると思います。
右上が「高バイアス」の状態、左下が「高バリアンス」の状態です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/aef4b646-9f02-a23b-9830-28c938c5995c.png)

図.4-2-1.バイアスとバリアンス


## 4-3.ブースティングとバギング

■ブースティング
ブースティングとは、『予測モデルの間違った予測に焦点を当て、
「重み」を加味し次のモデルを改善する』手法です。

先ほどのバイアスとバリアンスという言葉を用いると、
バイアスを減らす(未学習を減らす)動きをします。

■バギング
バギングとは、『Bootstrap Aggregating(ブートストラップ法)の略であり、
学習データを復元抽出でランダムに抽出し、学習する』手法です。

先ほどのバイアスとバリアンスという言葉を用いると、
バリアンスを減らす(過学習を減らす)動きをします。

## 4-4.XGBoost とLightGBMの違い

XGBoost と LightGBM はどちらもブースティングであると書きました。
この二つの差は決定木の『階層』に着目しているか、『葉』に着目しているかの違いです。

詳細については[こちら](https://www.codexa.net/lightgbm-beginner/)がわかりやすかったのでご参照ください。



# 5.まとめ
決定木モデルとは何かという話から、
決定木モデルを応用させたモデルの違いについてまとめました。

一度理解してから感覚的に決定木モデルを使用していましたが、
実際に説明しようとすると難しいものだと痛感しています。
ただ理解できれば可視化もしやすく、とても優秀な手法なのでガンガン使ってみてください。

何か間違い等あればご指摘いただければ幸いです。
社内システムを作り直した時のアーキテクチャ

# 社内システムを作り直した時のアーキテクチャ
先日レガシーシステムを載せ替えた時のアーキテクチャ選定の振り返り

## 要件・前提
* 利用者は数名規模の社内システム
* 顧客情報を扱うので、権限管理が求められる(レガシーシステムにはない)
* できれば社外からも扱えるセキュリティ水準
* 機能不足が目立ってきているので色々と機能追加をしたい
* レガシーシステムはWordPressのプラグインとして作成されているが、仕様書はなくソースは本番環境にしかない
* レガシーシステムはEC2上に構築されており、DBはAuroraを使っている
* 関連するシステムを全て載せ替える余裕はないのでDBは既存のものを流用(カラム・テーブル追加だけで頑張る)
* 使える戦力は自分を含めて二人

## 実際に選定した技術等

### Cognito
個人情報を扱うシステムで、かつ社外からもアクセス出来た方がいいとなると、最低でも2段階認証は必要になるが、
2段階認証を含めた認証システムを自前で構築するのはコストが大きいし、メリットもないので素直に既存のmbaasに投げるべきと考えた。
既存がAWSベースで作られていたので、とりあえずAWSの提供しているCognitoに。

#### 反省
mbaasに投げたこと自体は間違っていなかったが、既存がAWSベースだということで思考停止せずにFirebaseAuthを使ったほうが良かったかも知れない。
(Cognitoに関する資料が乏しく、公式ドキュメントも不親切だったので大分苦労した)
認可側についてもCognitoにおけるベストプラクティスがよく分からず自前実装してしまったので、その辺りも反省。

### SPA構成
フロントエンドとサーバーサイドをRESTAPIでつなぐSPA構成を採用。
戦力が二人だったので、Conflictを防ぎつつ分業するにはフロントエンド・サーバーサイドと分業するのが適切と判断したため。
お互いの作業の依存性を軽減するために、つなぐAPIの部分は初めに全てOpenAPIに沿って定義し、GitLabのIssueと紐づけを行った上で作業を開始した。

#### 反省
ここに関しては手前味噌ながら目論見通り成功した。
完全に別々にモックを使いながら開発するのは初めての経験だったので、
いざ接続してみるとつながらず修正が必要になることを覚悟していたが、
実際は一部の仕様の読み違いなどを除き問題なく接続に成功した。
当然、片方の作業が先に終わり合流するまではConflictも全く発生しなかった。
APIの仕様も当初の想定でほぼ変わらなかったので、手戻りもほぼなかった。

### React + S3静的Webページ
フロントエンドはReactで構築した。(react-create-appを利用)
VirtualDOM系のフレームワークでは最近はVueの方が勢いがあるのは分かっていたものの、
近々ReactNativeを利用してアプリを構築する計画も立てていたので、そこに向けた練習も兼ねて。
そこまで複雑な状態管理は必要なかったのでreduxは入れず。
最終的にS3上に静的Webページとして配置

#### 反省
概ね問題なかったものの、react-routerは入れておいた方が良かった。
戻るボタンに対応できていないのは想像以上にUXに影響を及ぼした。

### SpringBoot(java)

静的型付けで手軽に作れるものという条件で選定。
Go系のフレームワークを使うか、あるいはKotlinを使うかも考えたが、
チームメンバーの学習コストを考えて一旦SpringBoot + javaで。

DBがAuroraで業務システムにつきトランザクション管理もあるのでサーバーレス構成は避けた。

#### 反省
技術的な面白さに書けるところ以外は特に問題のない選択だったかと思う。

### nginx
Reactで作成した静的WebページとSpringBootのつなぎはnginxをリバースプロキシとして利用することにより実現。
ここに関しては今更Apacheを使う理由もないので。

### docker/docker-compose
SpringBootとnginxはEC2上でdockerコンテナを起動してその上で動かす形で。
実際の起動はdocker-composeでまとめて。

#### 反省点
正直二つだけな上、スケールアウトが必要になる可能性も低いので
個別に起動しても良かったが、なんやかんやdocker-composeでまとめられることで大分制御は楽になった。
ただ、自分で環境を建てるのではなくElasticBeanstalkを利用したほうがより手軽だった可能性はある。
WPでMinimableテーマでLP作ったメモ

以下、MinimableをWPに反映する方法

Minimableテーマを公式サイト（http://minimable.fedeweb.net/）からDL

テーマzipをWPにアップロード

Minimableはプラグイン　Contact From 7　が必須プラグインのため、DL

WPを乗っけてるサーバーへ行ってdemo-content.xmlをDL
うちはエックスサーバーなのでサーバーパネルへ行った
（場所：wp-content/themes/minimable/demo-content.xml）

DLが終わったらWPにに戻ってツール-インポート-WP-なんか有効に向かって進む
（プラグイン一覧にWordPress インポートツールを入れたい）

ファイルをアップロードしろって出るのでサーバーからDLしてきた
demo-content.xmlをアップロード


アップロード後、設定-表示設定から、
ホームページの表示
固定ページにチェック
ホームページ:main page
投稿ぺージ:ご自由に

これでTOPがデモページになっている
ここをいじってLPにする　

終

参考　https://blog.saboh.net/minimable/
【Houdiniメモ】Pyro FXのDry Iceに関するメモ

## はじめに
HoudiniのPyro FXのDry Iceを触ってみました。
備忘録もかねてパラメータ等に関するメモを記事として残したいと思います。

## 環境
Houdini Apprentice 17.0
Windows 10

## Dry Iceの作成手順
1. NetworkビューでSphereを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/0135001e-40d4-f144-413d-41363cf6c4a9.png)

2. PyroFXシェルフのDry Iceをクリックし、Sphereをクリック選択してEnter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/f2540479-7edc-d463-f7c2-36f00a7f2d8f.png)


上記の手順を行うと以下のようなドライアイスっぽい煙が出来上がります。
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/e55c561f-095c-f55b-03f7-3493b2e2a039.gif)

### ３つのノード
Networkビューのobj直下を見ると、sphere1, pyro_sim, pyro_importの3つのノードができています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/bb233a6d-f2d9-6573-8b2c-998252f8eb14.png)

煙のシミュレーションはpyro_simの中で行っています。

## シミュレーション領域サイズを変更する
pyroノードのPropertiesタブからシミュレーション領域のサイズを変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/5e68dce2-3f5c-12a6-e2c1-75536697f58f.png)


### pyroノードの場所
pyroノードは**obj/pyro_sim/pyro**にいます。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/0911f390-3930-20b3-4efd-bbd80e0d6ba5.png" height = 200>

## 煙が溜まるようにする
pyroノードの`Closed Boundaries`のチェックを入れると煙が溜まるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/4a74c55a-7c61-583d-87e4-34c1a0d75eb9.png)

![closed_boundaries.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/100bb630-59e4-de05-0591-00361bcb925b.gif)

## 煙が消える速さを変更する
**pyrosolver1**ノードのShapeタブの中にある`Dissipation`の数値を増やすと煙が速く消えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/2bd5d903-c431-de53-1cdc-9184324ac8fe.png)

例えば、`Dissipation`を0.4に設定すると、以下のようになります。(`Dissipation`のデフォルト値は0.06)
![dissipation_0.4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/56910283-4710-66d0-cdc2-db1ac812bb70.gif)

### pyrosolver1の場所
pyrosolver1ノードは**obj/pyro_sim/pyrosolver1**にいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/538abbc1-595e-8f3d-c23f-b8fb8895e893.png)


## 参考URL
DisturbunceやTurbulenceの違いについての解説動画
https://vimeo.com/61705851
https://vimeo.com/62704012
SCシートベルトロック光ファイバーコネクタ

複数の人や部署がアクセス可能な大容量、高密度の相互接続領域では、光ファイバ相互接続の安定性とセキュリティを確保する方法は特に重要です。機密データや情報を含む機密アプリケーションでは特にそうです。 ネットワークの中断や接続エラーを回避するには、不正な変更や不用意な変更を防止するために、ファイバコネクタの誤接続やプラグの抜き差しや操作をしないようにする必要があります。

HYCの新しい自社開発のSCシートベルトロックコネクタは、不正アクセスや改ざんを防止するように設計されています。 これらのSCシートベルトコネクタは、軍事、政府、金融、病院など、複数のユーザーグループレベルで存在する可能性がある、さまざまな機密性の高いアプリケーションで使用できます。 誰かが物理的なセキュリティシステムを迂回してデータセンターや物理的なインフラストラクチャにアクセスする場合、ロック可能なファイバーコネクタソリューションは、ファイバー接続の切り替えや変更ができないようにするのに役立ちます。

![700_400_16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/4d5a4239-c3d1-5567-7307-85f8f316e0a2.jpeg)

ロックコネクタには、それがアダプタに挿入されるとすぐにロックされる本体デザインに組み込まれた独自のキーイングディテールがあります。 コネクタがロックされると、一致するカラーキーのみを使用してコネクタを開くことができます。 ネットワークを柔軟に設計して適用するために、HYC は5色のロックコネクタとそれに対応する同じ色のキーを設計しました。 各カラーコネクタは、識別と管理を容易にするためのオープンキーに対応しています。 ロックコネクタを使用するソリューションは、破壊行為を防止するだけでなく、許可されていないまたは偶発的な切断や相互接続を防止してネットワークの管理を支援します。

![700_400_17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463940/50f8fb58-d7ee-2bb8-0140-ddf89b132e04.jpeg)

これらのSC安全ロックコネクタは、業界標準のSCアダプタと完全な互換性があります。 ダストキャップには、未使用のポートへのアクセスを防ぐためのロック機能もあります。 ポート保護プラグは、不正アクセスや改ざんを防ぐためにポートをロックするために使用されます。 空のポートや割り当てられていないポートへのアクセスを防ぐために、ロック付きのダストキャップを使用してください。

今日のサービスプロバイダーやネットワーク管理者が直面している最大の課題の1つは、データセンター全体でネットワークセキュリティを維持することです。 ネットワークセキュリティの最優先事項は、ネットワークとそのコンポーネントを不正アクセスと不正使用から保護することです。 ロックコネクタの使用は、ネットワークセキュリティのリスクを効果的に減らすための理想的で理想的なソリューションです。 SCシートベルトコネクタを使用すると、連携して動作するネットワーク内の特定のグループまたはアクセスレベルに効果的に制限できます。
windowss10で復元したら36時間もかかった件



#windowsの仕様
エディション：Windows10 Professional
バージョン：windows update 1903
インストール日：2019/7/10

#端末情報
ASUS 
プロセッサ：intel i5
メモリ：8GB
システム：64ビット
ディスク：SSD

windows10 の大型アップデート1903をやっと適用したので、新しく追加された以下機能を試そうとしたところ、とんだドツボにハマってしまった！！

##▼有効化した機能
Windows サンドボックス
Windows Subsystem for Linux
Windows ハイパーバイザー　プラットフォーム

機能追加後、再起動してさっそくサンドボックスを立ち上げる。
・・・エラーが出て立ち上がらない。
vmplayerが立ち上がるか試してみる。
・・・立ち上がらなくなった。
まだ試すのが早かったと断念。

とりあえず、vmplayerが立ち上がらなくなるのは、仕事に影響が出てしまうため、
有効化した機能を全て無効化し、再起動。


vmplayerを立ち上げて見たところ、立ち上がらない。
記事を読み漁り、試そうと思ったが、これ以上おかしな状況になるのが嫌だったため、
復元ポイントに戻ることに。


#復元開始
バージョンアップ後の状態に戻れると表示されたので復元スタート。
※復元開始：2019/7/11 11：00頃
※復元ポイント：2019/7/10 20：00頃

待てど暮らせど「レジストリを復元しています」画面から動かない。
次の日出社したら、完了しているのを願い、帰宅。

次の日(12日)ドキドキしながら端末を見てみると、まだ復元作業中。
記事を読み漁り、「23時間までは触らないほうがいい、復元できた」という
記事を発見し、待つことに。
>参照サイト：Windows10復元は、23時間待つまで何もしてはいけない実践記
>>https://www.panpanpapa.com/entry/2018/12/30/182424

しかし、23時間以上経っても画面は変わらず、終わる様子がない。
端末が動いている音はするし、画面もクルクル動いているから
止まってはいなさそう。

結局業務時間内には復元完了できず。
次の日から3連休ということもあり、そのままそっとしておくことに。
次、出社した時にまだ復元していたら、何らかのアクションを起こそうと決めて、帰宅。

#復元完了
3連休明けに出社(16日)し、ドキドキしながら端末を見てみたらなんと！！
復元完了してた！！

システムログで確認してみたら、12日の22時頃に完了した模様。

#約36時間かかったが、復元完了できた!!
windows10の復元には、とてつもなく長い時間がかかることを身にしみて実感。
もしも復元しないと行けない状況になったら、時間に余裕がある時に
実行することをおすすめします。

念のため、データは退避した上で作業したほうが良いです。
損害保険システムを担当することになったらまず知っておきたいこと


#最初に（投稿の背景）
クライアントが損害保険会社になった！
バックグラウンドなにもない！
となったときに、まず知っておきたい基礎の基礎をまとめました。
（少しQiitaの意向からはズレるかもしれませんが、よろしくお願いします。）

#損害保険システムの概要
##そもそも保険とは
火災・死亡・病気等の偶然の事故による損害を補償するため、多数者が一定の資金（＝保険料）を出し合い、実際に事故があった時その者に一定金額（＝保険金）を与える制度。

ズバリ、小さな負担で大きな安心を得る、助け合いの制度。

##保険の種類
- 生命保険
- 損害保険
- 傷害・医療・がん保険

##損害保険の分類(=種目)
基本的には以下の通りシステム区分されている。
大まかにマリンかノンマリンで分けられ、マリンは契約管理システムの対象外のケースが多い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324184/eb6d8604-6289-4ba1-1bfc-076225e99275.png)


##その他基礎知識
- 保険種目と保険種類
  - 保険種目：人の生死以外のリスクを対象とする損害保険を、自動車保険・火災保険・傷害保険・賠償責任保険、、、と区分した項目。
  - 保険種類：上記保険種目を更に細分化した項目。

- 保険約款、契約規定集と算法書
  - 保険約款：
保険商品がどのようなリスクを対象とし、どんな事故が発生した場合に
保険金を支払うかを示した書類。
  - 契約規定集：
具体的な保険料の算出方法や金額算定の根拠となるタリフを示す書類。
  - 算法書：
契約規定集だけでは不十分な場合に参照。

- 保険金額と保険料
  - 保険金額：契約時に規定する、保険金の上限金額。（予想される被害金額の上限）
  - 保険金：事故発生時に保険会社が契約者に支払う補償金
  - 保険料：契約者が加入した保険商品の対価として損害保険会社に支払う料金
- 販売チャネル
  - 代理店
  - 保険仲立人
  - 直扱い（通信販売含む）

#損害保険システムの構成
- 契約関連システム
  - 契約管理システム：契約申込書・移動承認請求書・更改申込書といった契約に関わるデータを入力して、契約DBに登録するシステム。超重要。
  - 満期管理システム：契約DBから満期を迎える契約データを抽出し、満期関係書類を作成する。
  - 共同保険システム：ほかの損害保険会社と共保ボルドロ（明細）をやり取りするシステム。
  - 再保険システム：ほかの損害保険会社と再保険ボルドロ（明細）をやり取りするシステム。
  - 自動計上システム：契約DBより、形状データ・ファイルを自動生成し、代勘精算システムへ受け渡しするシステム。
  
- 保険料関連システム
  - 保険料請求システム：入金DB/契約DBから保険料請求データ（金融機関ごとに作成される、口座振替の引き落としデータ）を生成するシステム。
  - 保険料入金システム：金融機関に請求した保険料のうち、入金されたデータを精算データとして代勘精算システムに受け渡し、入金されなかったデータを未収管理システムに受け渡しするシステム。
  - 代勘精算システム：計上データ、精算データ、入金データを照合し、精算に誤りがないか確認するシステム。
  - 未収管理システム：保険料が入金されなかった契約を管理するシステム。

- 事故関連システム
  - 事故処理システム：事故の発生を登録、事故処理の進捗管理するシステム。
 
- その他システム
  - 成績挙績システム：保険料（＝売上）を集計するシステム。
  - 情報交換システム：業界内部で契約データを集積するためのシステム。

#終わりに
以下参照の文献が大変参考になりました。
読んでいただくとよりシステムの中身のイメージつくかと！

#参照
https://www.fina-sol.com/handbook/nonlife-insurance

https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3-%E6%90%8D%E5%AE%B3%E4%BF%9D%E9%99%BA%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E8%8F%8A%E5%9C%B0-%E6%B5%A9%E4%B9%8B/dp/4892930849
小学生でもOK？Raspberry piでScratchにチャレンジしてみた　その２。（サーボモータ）

前回の記事：
　https://qiita.com/uribo_2019/items/fca369067b514177ff6b
GPIO操作しLチカまでできました。

今回はサーボモータを動かしてみます。

# GPIO端子操作 – サーボモーター
## サーボモーター接続
SG92Rというモーターで試してみます。5v, Ground、GPIO端子の3本を接続します。

<img width="200" alt="wire_1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/d2cda16a-8cea-0504-bc93-b7ac3337af94.jpeg">


まず、接続先のGPIO端子を決めます。
GPIO端子ピン配置は、以下WEBサイトに記載されています。
https://www.raspberrypi.org/documentation/usage/gpio/

このサイトから画像を引用させて頂きます。
<img width="370" alt="pinout.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/4675b900-45f8-1b9a-80f3-256a0452760b.jpeg">
 
今回はGPIO端子の14番を使う事にします。
Groundと5v端子は、それぞれRaspberry piのそれぞれの端子に接続します。
今回サーボモータ一つなので別電源にするまでもなく、VCCはRaspberry piの5Vに直接接続します。

Raspberry piとサーボモータとを接続する前に、Raspberry piをシャットダウンし、電源を切ってください。

実際に接続してみました。

<img width="250" alt="wire_2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/934a51f2-09dc-b07e-516a-3285e4feee2b.jpeg">

## スクリプト作成
サーボモータが接続できれば、Raspberry piの電源を入れ、Scratchを起動してください。
<img width="300" alt="scratch13_1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/2e37f863-4586-2a8b-5143-6eb7a71c2b50.jpeg">

まず、GPIO端子の操作が有効になっているかどうか確認してください。
“へんしゅう”メニューから、“GPIOサーバをていし”が見えると、有効になっています。
<img width="200" alt="sc_1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/173edcb7-eb60-2222-9d35-8f117da77728.jpeg">

ここから、GPIO端子14を操作するブロックをつなげていきます。
“せいぎょ”カテゴリーから、“「」をおくる”を３つ選択し、メッセージとしてそれぞれ“config14out“, “servo14%75“, “servo14%-75“と記入してください。
<img width="200" alt="sc_2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/a70ac5cb-d7a8-9d38-5d9f-68e3fb2fb37b.jpeg">

“servo14%75“メッセージは、サーボモータを75%回します。
“servo14%-75“メッセージは、サーボモータを逆方向に75%回します。

それでは、これらの制御ブロックをつなげてみます。
前回記事で作成した、LEDを一秒間隔で点灯・消灯するスクリプトの間に、サーボモーターを制御するブロックをいれてみましょう。

<img width="300" alt="sc_3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/c4b54df4-f9bf-f1f5-a738-c7582baf62ba.jpeg">

## GPIOサーバの自動起動
GPIOサーバをスクリプト内で起動するようにします。
<img width="200" alt="IMG_2918.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459844/3b79ac5b-e058-ac18-d983-40a6c35d3c39.jpeg">

“gpioserveronをおくる”を追加すればOKです。

このスクリプトを実行すると、LEDが点滅を繰り返し、同時にサーボモータが回ります。
C++ Builder 10.2 Tokyo > Color > TColorBox > 非選択にする > clNoneにする (NoneColorColorを設定しておく)

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

TComboBoxの場合、ItemIndexを-1とすると「非選択」にできる。

それに対応することをTColorBox でどうするか。

TColorBox->SelectedをclNoneにする。
~~clNoneにした時に色はNoneColorColorプロパティで指定しておく、のようだ。~~
(追記: 2019-07-18 NoneColorColorをClGreenにしても、SelectedをclNoneにした時はColorの色になるようだ。)

[StackOverflowにて質問](https://stackoverflow.com/questions/57085593/tcolorbox-nonecolorcolor-not-used)していると、「下記の記載を見ていますか?」と言われた。下記の状況にすると、確かにclNoneの色がNoneColorColor設定になった。
> This property only affects the color box if the Style property includes cbSystemColors and cbIncludeNone. 


### 関連

RadStudio 2007のバージョンではあるが
http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/delphivclwin32/!!MEMBERTYPE_Properties_ExtCtrls_TColorBox.html

> NoneColorColor: clNone のカラーボックスに表示される色を指定します。 

訳がおかしい。

「clNone選択時にカラーボックスに表示される色を指定します。」あたりが妥当。


### 関連 10.2 Tokyo

http://docwiki.embarcadero.com/Libraries/Tokyo/ja/Vcl.ExtCtrls.TColorBox_Properties

NoneColorColorの説明は表にはない（リンク先にはあるが）。
ベータ版が公開されたGuildHubを使って仮説キャンバスを作ってみる

# GuildHubとは
先日ベータ版が公開されたGuildHub。
書籍 [正しいものを正しくつくる][2] でも紹介されていた「仮説キャンバス」を作成することができるツールだ。
> 「GuildHub」（ギルドハブ）は、プロダクトの仮説、プロダクトバックログを見える化し、プロダクトの仮説検証からアジャイル開発を支援するオンラインツールです。

[guildhubのランディングページ][1]より

# 仮説キャンバスとは
プロダクトの仮説を整理するためのキャンバス。
GuildHub上ではモデルとしてSlackの仮説キャンバスが提供されている。
![2019-07-12_09h45_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/2d227474-a59e-42bc-3026-982717358a46.png)

# GuildHubを使う
## アカウントの登録
![2019-07-12_09h36_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/5e5c51a9-ba4e-5567-0750-2f36d367f7bf.png)

メールアドレスと名前、パスワードを入力して登録すると、入力したメールアドレスあてに本人確認が届く。
本人確認が終了すればそこから利用開始だ。
![2019-07-17_11h50_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/00483054-c9fe-33af-40af-b1706cf4d24f.png)


## キャンバスの作成
![2019-07-12_09h45_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/82adc55c-4adc-f6c8-555a-56a37d390c8d.png)
登録するとまずこの画面が出てくる。「参考にしたいビジネスモデルを～」を選択するとSlackの仮説キャンバスを見ることができる。(※本稿執筆時点では、提供されているビジネスモデルはSlackのみ)

名前を入れて新規作成。
![2019-07-12_11h16_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/b13592f7-c541-7098-071d-e374b5d40fe1.png)

すると、このようなまっさらな状態のキャンバスが作成される。
![2019-07-12_11h17_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/b8ae077d-6502-0ae1-5a52-c6e4dbb1516c.png)

なお、左上のタブを押すと縦型の短冊表示に切り替えることもできる。
![2019-07-12_11h17_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/d0dd75c8-a000-36d3-b67c-3a1fff73f114.png)

## 要素の追加
一番基本的な操作である要素の追加を行う。
![2019-07-12_11h39_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/144c941c-386b-db83-bd40-e147ab003876.png)

追加したい内容を記載してエンター。
![2019-07-17_11h54_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/13fe9e81-486f-196b-be96-d34575d13c85.png)

さらに追加する。
![2019-07-17_11h55_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/9fd6e27a-e365-9e87-d943-be61e14693b1.png)

順序を入れ替えたい場合はドラッグアンドドロップで簡単に行うことができる。
![2019-07-17_11h56_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/ef42cd85-8d13-0ba5-03c6-0a3959f092bf.png)

他の領域へのドロップはできないので注意。

また、要素をクリックすると色の変更や説明の追加、削除を行うことができる。削除はできれば選択->deleteくらいでできるようになってほしい。アップデートに期待。
![2019-07-17_11h56_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/e73fc992-0a6d-e1e6-f5b8-58d7a7cbcf53.png)


なお、右上に

- ToDo
- コメント
- メモ

がある。
![2019-07-12_11h45_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/c5a039ed-3b4a-48c7-6887-884e0308da62.png)

# おわりに
このような感じで、GUIベースで簡単に仮説キャンバスを作成することができる。
業務での利用はもちろんだが、書籍や勉強会などで仮説キャンバスに触れて「とりあえず作ってみたい」という方にもとっつきやすいツールだ。


[1]:https://lp.guildhub.jp/
[2]:https://beyondagile.info/
SSH接続先のサーバにコマンドを実行させてみたメモ

#はじめに
複数のサーバに対してシェルスクリプトで処理を命令したいことがありました。
今回はその方法を少し勉強したのでメモしたいと思います。

環境は以下の通りです
*OS：win10 64bit, CentOS7*
*Tool：VirtualBox, PuTTY, GitBash*

#やったことの流れ
公開鍵認証方式でローカルサーバにSSH接続をして、サーバに命令が書かれたシェルスクリプトを転送・実行しました。
今回は接続元を**Windows10(GitBash)**、接続先を**CentOS7(VirtualBox)**を使いました。

#SSH接続
```Linux:
ssh (-p ポート番号) user名@ipアドレス
```
とくに特別なことをしなければ、これだけでokです。括弧の部分は必要なら書きます。
接続先のUserにログインパスワードが設定されているなら、コマンドを実行するとそのパスワードを尋ねられます。
デフォルトだとパスワード認証方式になるはずです。
公開鍵を使えば次回からパスワードなしで接続することができるようになります。

##公開鍵暗号方式
以下は公開鍵で接続をおこなう手順です。

```Linux:
# 鍵を作成する
ssh-keygen -t rsa

# 接続先に公開鍵を設置
scp ./.ssh/id_rsa.pub root@192.168.X.X:/root/.ssh

# ディレクトリの権限をユーザーのみrwxに制限
$ chmod 700 ~/.ssh

# authorized_keyに流し込み
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

# authorized_key権限書き換え
sudo chmod 600 /user名/.ssh/authorized_keys

# ユーザーディレクトリのコピーした秘密鍵を削除する
$ rm ~/.ssh/id_rsa.pub
```
RSA暗号方式で鍵を生成すると、./.sshに秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が生成されます。
authorized_keyは公開鍵を保存しておく場所で、SSHログインされるとサーバはここの鍵を見にいきます。

#シェル作成
```Linux:command.sh
#!/bin/sh
#ここに実行したいコマンドを書く
```
```Linux:send_command.sh
#!/bin/sh
FILE="command.sh"
scp ${FILE} root@192.168.X.X:/root
ssh root@192.168.X.X "
    sh ${FILE};
    #他にコマンドを書きたい場合は「;」でつなぐ
"
```
この方法の他に、実行環境にexpectコマンドが入っていればもっと書けます。
また、expectならパスワード入力などの対話もスクリプト化できるため、公開鍵方式を使わずに自動化が可能です。
例外処理が無いのでちょっと雑ですが、下のようなスクリプトで同じ処理が作れます。

```Linux:
#!/bin/sh
FILE="command.sh"
expect -c "
    set timeout 10
    spawn ssh root@192.168.X.X
    send \"PASSWORD\n\"
    spawn ./${FILE}
    interact
"
```

#参考にしたサイト
- [ssh公開鍵認証設定まとめ](https://qiita.com/ir-yk/items/af8550fea92b5c5f7fca)
- [sshの鍵認証でパスワード無しでログインする・ssh-copy-id](https://qiita.com/sakanashi/items/542ae428d9de9c7c59dc)
- [expectでssh自動ログイン](https://www.mazn.net/blog/2019/05/22/1766.html)
- [CentOS7でユーザーを作成しSSH接続を行う](https://qiita.com/kkenya/items/bfdce8801614f895e123)
nginx のaccess-control-allow-origin-response-headerは　3種類のうちいずれかを単一で指定する必要がある

3種類を併用する事は出来ず、3種類のうちいずれかを単一で指定する必要があるみたいです。
ここに書いてました。
https://www.w3.org/TR/cors/#access-control-allow-origin-response-header

```
The Access-Control-Allow-Origin header indicates whether a resource can be shared based by 
returning the value of the Origin request header, "*", or "null" in the response. ABNF:

Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" origin-list-or-null | "*"
In practice the origin-list-or-null production is more constrained. 
Rather than allowing a space-separated list 
of origins, it is either a single origin or the string "null".
```



特定のOriginから

```
add_header Access-Control-Allow-Origin "http://hogehoge.jp"
```
全て許可

```
add_header Access-Control-Allow-Origin "*"
```
ローカルからのリクエスト

```
add_header Access-Control-Allow-Origin "null"
```

そりゃ、そうですよね。。。
ちなみに、アプリケーションから渡された、Access-Control-Allow-Originを適用させたい場合は
add_header　自体を指定しないが正解でした。てっきりnullを指定するものとばかり。
Macintosh(macOS 10.x)で3.5inchi FDを読む

#機材
##Macintosh
macOS 10.12.6
Mac mini Late 2014
3GHz Intel Core i7
16GB 1600MHz DDR3
Intel Iris 1536MB

## FDD
Logitec LFD-31US


##作業
FDを入れると、１０秒くらい回って、知らん顔。

Mac, pc-9801で使っていたはずのFDを順に。

##読めていないFD
４枚目でようやく認識。
~~何が違うかは調査。~~
Macintosh用FD（古いOSX以前のもの）が読めてない。

###copy時に読めなかったファイル

####pdf
pdfファイルでコピーできなかったファイルがある。
Acrobat Reader DC 2019で直接FDからファイルを読んだら読めた。
HDDに保存した。

理由などは不明。

#### zip

![zip-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/a69799f6-11b1-8d3d-b8e3-990cfc69cc54.png)

```shell-session:macOS
$ cp kumikomi4.zip /Users/administrator/
cp: kumikomi4.zip: Input/output error
$ unzip kumikomi4.zip
Archive:  kumikomi4.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
note:  kumikomi4.zip may be a plain executable, not an archive
unzip:  cannot find zipfile directory in one of kumikomi4.zip or
        kumikomi4.zip.zip, and cannot find kumikomi4.zip.ZIP, period.
```

###開かないファイル

.ppt 1995がMacOS power point　15．29　で開かない。

![ppt-error1995.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/19e6c18b-3563-301d-afcc-f8f451230fed.png)




##2HD



![FD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/75dc1b5a-6e1f-f7b9-8b80-7ed25417703b.png)

##2DD
なんとか読めた。
![FD2DD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/9516b58a-d6c7-459e-92e3-c9e4e5c87146.png)



##取り出し

FDをゴミ箱に入れると電源が切れるだけでFDはでてこない。
手動でFDを出す。

#作業記録

##1日目

読んだFD：１０枚
　うちファイル１つ破損
　うちファイル１つコピーできずアプリで読み出し書き込み成功

読めなかったFD；１０枚：ラベルから判断すると古いマックのものらしい。


#参考資料

Universal Serial Bus Interface External Floppy Disk Drive Unit　USB FDDユーザーズマニュアル
http://buffalo.jp/download/driver/hd/pdf/35011007-2.pdf

p.6
>Mac OS X 10.2 以降
USB ケーブルを接続すると自動認識されます。
1) USB FDD は、Mac OS に組み込まれている標準ド
ライバーで動作します。

p.7
>注意:MS-DOS フォーマットされたフロッピーディスクをマウントするのに、Mac OS X 10.2 の場合は、60 秒ほど掛かり、Mac OS X 10.1 の場合は、30 秒ほど掛かってアイ コンが表示されます。

<a href="https://b.hatena.ne.jp/entry/s/qiita.com/kaizen_nagoya/items/4be57d5df8e809e77004?fbclid=IwAR3ZzQF15luVZL5qEbm78_M2P7FzcC67OiPVW--_YzWOuwRZlWbQNKOC69I" class="hatena-bookmark-button" data-hatena-bookmark-layout="basic-label-counter" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
https://b.hatena.ne.jp/guide/bbutton
C++ Builder 10.2 Tokyo > Color > RGB()マクロとStrToInt64()の関係

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

StrToInt64()の値をTColorとして使えるそうなのが分かった。問題は引数として渡す文字列の順番。

```cpp
TColor acol1 = RGB(240, 0, 0);
TColor acol2 = StrToInt64("$0000F0");
```

上記だと両方とも240となる。
Endianの反転とも違う?

String文字列からStrToInt64()を使う時は、SubString()により読取り順番を変更することになりそう。

```cpp
// astrの例: F00000 (R:240, G:0, B:0)
String wrk = astr.SubString(5, 2) + astr.SubString(3, 2) + astr.SubString(1, 2);  // StrToInt64()用にRGB反転
wrk = L"$" + wrk;
TColor acol2 = StrToInt64(wrk);
```
Laravel5.5のcomposer installができない(できた)

#  RuntimeExceptionってなんやねん
VagrantとVirtualBoxでLaravel5.5の仮想環境を構築していたところ、以下のようにエラーが出て先へ進めなくなりました。

```
[RuntimeException]                                                                                 
  Could not delete /home/vagrant/code/sampleapp/vendor/kylekatarnls/
update-helper/src/UpdateHelper:  
```

どうやらvendorディレクトリ内の
vendor/kylekatarnls/
update-helper/src/UpdateHelper
が悪さをしているようです。多分composerの実行権限とかそこらへんが原因だと思いますが、うまく解消できませんでした。

# 解決法
Laravelプロジェクトの該当ディレクトリ内で、以下のコマンドを用いて、composerでインストールを行うときに余計なスクリプトを実行しないようにして再インストールしたところ、無事にインストールを行うことができました！

```terminal
$ cd sampleapp
$ composer install --no-plugins
```

# まとめ
このオプションをつけたことによる副作用は未調査なので、後々また検証した結果載せたいと思います。
このエラーで２時間ほど溶かして死ぬかと思いました。
Reactにおける「副作用」とは？

## 背景
ReactやReduxの記事やドキュメントを呼んでいると、度々「副作用」という単語を目にします。医薬品における副作用しか連想できなかったので、ちゃんと調べてみました。

## プログラミングにおける副作用とは
副作用は「プログラミング」という大きな枠で用いる単語であり、ここでは触れませんが、主に[関数型プログラミング](https://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E)や[並行処理](http://e-words.jp/w/%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86.html)の議論で活躍する概念です。

何がプログラミングにおける副作用なのか、明確な定義はありません（言語ごとの定義はあるのかもしれませんが）。しかし、以下２つの関数による処理のことを「副作用」と呼ぶことが多いです。。
**1. 引数以外の要因で結果が変わってしまう関数** 
**2. 関数の外に影響を与えてしまう関数**

「引数以外の要因で結果が変わってしまう関数」についてですが、例えば、関数f(1)と関数f(2)のように引数が違う場合に別の結果が返ってくるのは全く問題ありません。しかし、グローバル変数などで関数f(x)の結果が変わってしまうと、再利用性がなくなったり、テストができなくなったりといった問題が発生してしまいます。

「関数の外に影響を与えてしまう関数」についてですが、グローバル変数を変更したり、与えられた配列に要素を加えてしまったりといった処理が関数の中にあれば、関数の外に影響を与えてしまっていることになります。これも「引数以外の要因で結果が変わってしまう関数」と同じ問題が発生することになります。

ここまでで、プログラミングにおける「副作用」とは、医薬品における「副作用」と同じようなニュアンスで使われていることがわかりました。また、上記に挙げたような問題を避けるため、一般的に「副作用」は、プログラミングにおいてもネガティブな用語であると言えます。

## Reactにおける副作用
Reactにおいては「副作用＝書くべきではない」ではなく、「副作用＝適切な場所に配置するべき」という扱いです。ネガティブワードとして扱っていないのが混乱する原因だと思います。

Reactにおいて具体的にはどのような処理が副作用であるかというと

 - **DOMの変更**
 - **APIとの通信**
 - **console.log**
 - **ファイルへの書き込み**
 - **state/propsの変更**
 - **オブジェクトまたはその内部のプロパティへの代入**
 - **配列のpush()**
 
などです。これらは全て、上述の「関数の外に影響を与えてしまう関数」に当てはまります。
「ネガティブな部分はさておき、副作用は便利だから使います。でも配置に注意してください」という感じです。

## まとめ

 - プログラミングにおける副作用は医薬品における副作用と同じニュアンスで解釈できる
 - Reactにおける副作用は、便利なので適切に扱いましょう
Vueのtemplateでpugを利用する

Vueのtemplateでpugを利用しようとした時少し苦戦したのでめも。


pug-loaderを使用し

```vue
<template lang='pug'>
</template>
```

このように書くと

```
Component template requires a root element, rather than just text.
```

というエラーが出てすすめたなかった。

## loaderを変更
Vue loaderのMigrating from v14に以下の記述が
https://vue-loader.vuejs.org/migrating.html#importing-sfcs-from-dependencies

> Note that some template loaders such as pug-loader exports a compiled templating function instead of plain HTML. In order to pass the correct content to Vue's template compiler, you must use a loader that outputs plain HTML instead. For example, to support <template lang="pug">, you can use pug-plain-loader:


という訳でloaderを```pug-plain-loader```に変更。

```console
$yarn remove pug-loader
$yarn add pug-plain-loader
```

```js
{
  test: /\.pug$/,
  use: ['pug-plain-loader']
},
```

これでコンパイルが成功した。
[nuxt.js その６] middlewareによるナビゲーションガードの実装

# middlewareとは
[[公式] middlewareの説明](https://ja.nuxtjs.org/guide/routing/#%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2)
[[公式] middlewareプロパティについて](https://ja.nuxtjs.org/api/pages-middleware/#middleware-%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3)

ページがレンダリングされる前に実行してくれるもののようです。今回はこれを使ってナビゲーションガードを設定します。具体的に、特定のページにミドルウェアを設定する場合は以下のように書きます。

```vuejs:~/page/secret.vue
<template>
  <h1>シークレットページ</h1>
</template>

<script>
export default {
  middleware: 'authenticated'
}
</script>
```

ミドルウェア本体は~/middlewareの下に置きます。

```javascript:~/middleware/authenticated.js
export default function ({ store, redirect }) {
  // ユーザーが認証されていないときはログインページに飛ばす
  if (!store.getters['auth/email']) {
    return redirect('/user/login')
  }
}
```

これにより、secret.vueがレンダリングされる前にstoreに格納してある認証情報をチェックしてくれて、認証されていなければログインページにリダイレクトしてくれます。

簡単！
[nuxt.js その５] storeの実装

# nuxtでstoreを実装
[[公式] ストアについて](https://ja.nuxtjs.org/guide/vuex-store/)
>・storeディレクトリにファイルがある場合は自動でVuexを使用する準備をしてくれるよ！
・ストアには２つのモードが存在するよ！
・クラシックは廃止予定だからモジュールモードを使うほうがいいよ！
・stateの値はfunction形式で定義してあげないと、異なるユーザ間で予期せぬ情報共有が起きることがあるよ！

とのことです。

公式ページを見て気になったのはgettersとactionsが定義されておらず、以下のような構成となっていたことでした。
![alt](https://vuex.vuejs.org/flow.png)

前実装したときは以下の構成でした。
![alt](https://nuxt-api-state.lec.cafe/images/3/vuex.png)

モジュールモードになって簡素化されたのか？　とも考えましたが、どうもシンプルなら上の構成でもいいけど複雑化してくると困ることがでてくるから下の構成のほうがいいよ　ということのようです。[Vuexのページ](https://vuex.vuejs.org/ja/)



今回はfirebaseで取得したユーザ情報を保持しておきたいので以下のように作成しました。

```javascript:~/store/auth.js
// stateはfunction形式で記述しないと複数人で同じ値になってしまう場合がある
export const state = () => ({
  email: {},
  fireid: {}
})

export const getters = {
  email: state => {
    return state.email
  },
  fireid: state => {
    return state.fireid
  }
}

export const mutations = {
  setEmail (state, value) {
    state.email = value
  },
  setLogOut (state) {
    state.email = ''
  },
  setFireID (state, value) {
    state.fireid = value
  }
}

export const actions = {
  setEmail ({commit}, value) {
    commit('setEmail', value)
  },
  setLogOut ({commit}) {
    commit('setLogOut')
  },
  setFireID ({commit}, value) {
    commit('setFireID', value)
  }
}
```
ストアのゲッタを呼ぶ場合は以下

```javascript
<router-link to="/user/login" v-if="this.$store.getters['auth/email'] == ''" class="toolbar-font">ログイン</router-link>
```

ストアの値を書き換える場合は以下
（ログインに成功してstateの値をaction経由で更新）

```vuejs:pages/login.vue
<template>
  <login-form v-on:LoginFormEvent="LoginEvent"></login-form>
</template>
<script>
import LoginForm from '../../components/LoginForm.vue'
export default {
  components: {
    LoginForm
  },
  methods: {
    LoginEvent (resultCode, data) {
      if (resultCode < 0) {
        console.log("ログインに失敗しました")
        this.$router.push({path: '/user/login'})
      }
      // storeにログイン情報をセット
      console.log(resultCode, data)
      this.$store.dispatch('auth/setEmail', data.user.email)
      this.$store.dispatch('auth/setFireID', data.user.uid)
      
      // rootページに遷移 
      this.$router.push({path: '/'})
    }
  }
}
</script>
```

基本はこんなとこかな
jqueryで表示非表示を切り替える小技

自分用にメモ

まずSCSSを設定

```scss
.target-area {
  display: none;
  &.open {
    display: block;
  }
}
```

jquery でonclick時などに以下を走らせれば表示非表示が簡単に切り替わる

```javascript
$('.target-area').toggleClass("open")
```
cloud9でpython3を使うための下準備

# きっかけ
意外と適当にやってもうまくいってたので気にしなかったけど
デバグモードだとプライベートモジュールをインポートに失敗するなどして
いよいよ無理がたたってきたのでメモ残す。

# １．pythonと実行したらpython3.6を実行できるようにする
今まで

```
$ python hogehoge.py
```
と実行すると、python2.7で実行してしまう状況だったので

```
$ python3 hogehoge.py
```
としてきたが、これが不便なので改める。

## やり方
①.bashrcを起動する

```
$ vi ~/.bashrc 
```
②aliasをpython3に修正して保存

```:.bashrc(before)
# User specific aliases and functions
alias python=python27
```

```:.bashrc(after)
# User specific aliases and functions
alias python=python36
```
③.bashrcを即時反映させる

```
source ~/.bashrc
```

④pythonのバージョンを確認する

```
python -V
Python 3.6.8
```

これでOK。

# ２．PYTHONPATHを追加する
プライベートモジュールをinportしてデバグをするにはPYTHONPATHを通しておく必要あるそうだ。
　参考：https://teratail.com/questions/190555

ポイントは、ワークスペースのところまでPATHを通す必要があるということ。
ちょっとわかりにくいので実例で行くと。。。

「deep-learning-from-scratch」プロジェクトにある、
dataset > mnist.pyの関数load_mnist()をimportしたい場合。

ソースコード上は↓↓のような書き方になるとする。

```:3.6.2.neuralnet_mnist.py
from dataset.mnist import load_mnist
```
実際の位置関係は、キャプチャ画面で表すとこんな感じの状況。
![コメント 2019-07-17 152140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/ebdd2c91-c783-b4fb-1e1f-1d65ba5e6431.png)

特に策もなく、デバッグモードで実行しようとしても
↓↓みたいな感じでModuleNotFoundErrorエラーという形で悲しい扱いを受ける。。。
![コメント 2019-07-17 152606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/918ddf0f-caeb-b70d-fbae-71cc93f42927.png)

そこでPYTHONPATHを設定してやって、プライベートモジュールの場所を
指示してやればよい、という話。

## やり方
①前準備（現在のPYTHONPATHの状況を確認）
軽く↓↓のようなコード作って実行してやると現在の状況を出力してくれる

```:check_pythonPath.py
import sys
import pprint

pprint.pprint(sys.path)
```

```:実行結果
$ python check_pythonPath.py
['/home/ec2-user/environment/deep-learning-from-scratch/ch01',　← check_pythonPath.pyを実行したディレクトリ位置
 '/usr/lib64/python3.6',
 '/usr/lib64/python3.6/lib-dynload',
 '/home/ec2-user/.local/lib/python3.6/site-packages',
 '/usr/local/lib64/python3.6/site-packages',
 '/usr/local/lib/python3.6/site-packages',
 '/usr/lib64/python3.6/dist-packages',
 '/usr/lib/python3.6/dist-packages']
```
②.bashrcにPYTHONPATHの設定を追加、即時反映
どこでもいいと思うけど、個人的な趣味でPATHの近くに追記することにした
　※コマンドは前述のため割愛

```
export PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PYTHONPATH=/home/ec2-user/environment/deep-learning-from-scratch/ ←PATHの下に追記した
```

③PYTHONPATHの反映状況を確認

```:実行結果
$ python check_pythonPath.py
['/home/ec2-user/environment/deep-learning-from-scratch/ch01',
 '/home/ec2-user/environment/deep-learning-from-scratch',　　　　←増えた！
 '/usr/lib64/python3.6',
 '/usr/lib64/python3.6/lib-dynload',
 '/home/ec2-user/.local/lib/python3.6/site-packages',
 '/usr/local/lib64/python3.6/site-packages',
 '/usr/local/lib/python3.6/site-packages',
 '/usr/lib64/python3.6/dist-packages',
 '/usr/lib/python3.6/dist-packages']
```
# おわりに
またなんか必要な準備がでてきたらここに追記していこうかなと。

～つづく～
QNAPでGrowiを構築

# QNAPでGrowiを構築

研究室で情報共有ツールが欲しいなと思って探してみたら，Growiというものが良さげだったので研究室にあるQNAPのNASにインストールしてみました．
予想外にハマったので備忘録．

## ContainerStation
GrowiはDocker形式でも提供されているので，QNAPでDockerを扱うために，ContainerStationというアプリをインストール．
ContainerStationとかの使い方とかは，[ここらへん](https://www.moyashi-koubou.com/blog/nas_docker/)を参考に．

＃＃ MongoDBとGrowiのインストール
ContainerStationをインストールしたらもう簡単に構築できる！と思った．．．
ここの構築も[このページ](https://picman.dev/blog/2019/05/09/qnap-nas%e3%81%a7growi%e6%a7%8b%e7%af%89/)を参考に進めていった．

**ここからハマった！**
Growiの環境変数設定でMongoDBのIPアドレスやポートを設定するのだが，上記のページのとおりに進めても出来なかったので，試行錯誤してみた．
QNAPは仮想スイッチ上でContainerStationを構築しているので，指定するIPアドレスはホストのIPアドレスではない．
仮想スイッチのIPアドレスをしてする必要がある．ポートはMongoDBを作成したときのポートで良い．

これでやっと構築完了．

# 参考
今回の記事で以下のサイトを参考にいたしました．
 - [QNAP NASでGrowi構築](https://picman.dev/blog/2019/05/09/qnap-nas%e3%81%a7growi%e6%a7%8b%e7%af%89/)
 - [ツイートを長期間収集する実験(インフラ準備編(2))](https://qiita.com/yuhkan/items/3001b0bb0bf05dfa053d)
 - [NAS×Dockerでお手軽にLinux環境を作った話](https://www.moyashi-koubou.com/blog/nas_docker/)
可変長引数テンプレートで同じ型のみを受け取る手段

#可変長引数テンプレートとは
c++で使えるテンプレートの一つで、

```c++:
template<typename... Args>
void func(Args... arg);
```
みたいなやつ。
この**Args**と**arg**はパラメータパックとよばれ、特定の場所で展開できる。(c++17からは畳み込み式によってほぼどこでも展開できる)

基本としてはタプルで展開する。

```c++
std::tuple<Args...> argument = {arg...};
```

#やりたかったこと
記事のタイトル通り、可変長引数テンプレートで特定の型のみを受け取りたかった。
調べてみたところ**initializer_list**使う方法があった。(http://secret-garden.hatenablog.com/entry/2016/06/10/230548)

```c++
//intのみで受け取る関数
template<typename... Args>
auto func(Args... arg) -> decltype(std::initializer_list<int>{arg...}, std::declval<void>());
```

まぁ、なんとか解決した...

しかし何か腑に落ちない。
これでコンパイルエラーを出すと [<font color="Red">一致するオーバーロードされた関数が見つかりませんでした。</font>]と言われる。
まあ目的の引数と違うのだから当然だ。
しかしできれば目的の引数が何なのかエラー文で教えて欲しい。
「じゃあ引数を**initializer_list**にして明示的にすればいいのでは？」と思うかもしれないが、私は引数に**{}**をどうしてもつけたくなかった。(我儘)

とりあえず**static_assert**でいい感じにコンパイルから弾こうと思ったが目的のメタ関数が見つからなかった。

#結果
なんか気持ち悪いのができた。

```c++
#include <type_traits>
#include <tuple>
#include <utility>

template<size_t Index, typename... Args>
class checkSameType {
public:
	static constexpr bool check(){
		if (!std::is_same<decltype(std::get<Index>((std::declval<std::tuple<Args...>>()))), decltype(std::get<Index - 1>((std::declval<std::tuple<Args...>>())))>::value)
			return false;
		return checkSameType<Index - 1, Args...>::check();
	}
};

template<typename... Args>
class checkSameType <0, Args...> {
public:
	static constexpr bool check() {
		return true;
	}
};


template<typename... Args>
constexpr bool check_same_type() {
	return checkSameType<(sizeof...(Args)) - 1, Args...>::check();
}
```

内容としては**is_same**でパラメータパックの引数の型をかたっぱしから再帰によって比較して、違うのが混じっていたら**false**を返す定数式になっている。

これで目的の**static_assert**でコンパイルエラーが出せる！

```c++
static_assert(check_same_type<int&&, Args...>(), "Argument must be 'int'.");
```
タプルのせいで右辺値参照と比較しないといけないのが難点。

というかもっと頭のいい方法ないですかね？

#2019/07/18追記
コメントで教えた貰ったサイトにもっと簡潔な記述法がありました。

```c++
static_assert(std::conjunction<std::is_same<int, Args>...>::value, "Argument must be 'int'.");
```

**is_same < int, Args >...**でパラメータパックの展開ができるとは目から鱗でした。
ベクタ形式とラスタ形式の比較とベクタ画像のAndroid Studioでの使用方法

# はじめに
こんにちは、、ハイノです。

今回は表題の通りベクタ形式とラスタ形式について、
またベクター画像のAndroid Studioでの使用方法について備忘録を兼ねて記載します。

# ベクタ形式とは
複数の点（アンカー）の位置とそれを繋いだ線、色、カーブなどを数値データとして
記憶し再現する形式。
簡単にいうと、いくつか基準となる点を用意してその点を結ぶ線を計算によって算出して
図や画像を作りますという形式です。
画像の拡張子として「SVG」があります。
ちなみにSVGは「Scalable Vector Graphics」の略です。

### メリット
- データサイズが小さい
- 拡大縮小をしてもジャギーが発生しない

### デメリット
- 数値で画像を記憶しているため複雑や細かい描写を表現することが難しい


# ラスタ形式とは
1pixelの点が縦横と格子状に並び構成されたデータの画像形式。
ビットマップ画像(Bitmap graphics)とも呼ばれています。

### メリット
- 濃度が違う点や様々な色の点を並べることで複雑な画像を表現することができる

### デメリット
- 複雑な画像が表現できる反面、点が増えることによりデータサイズが大きくなる
- 拡大・縮小に適していない
    - サイズ変更すると点の配置にずれやゆがみが生じてジャギー(エッジに現れるギザギザ)が発生し画像の品質が落ちる

ラスタ形式の画像には、「GIF」「JPG」「PNG」などがあります。
私たちが普段使用しているスマホやデジカメの画像の形式もこのラスタ形式です。

# Android Studioでのベクタ形式画像の使用法
まず、Android Studioを立ち上げてプロジェクトを作成し、プロジェクトを構成するファイルのresで右クリックし new > Vector Assetとたどっていくと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/8a1f1fc5-8ea7-73cd-29b1-774dd084ab33.png)

下記の画面が立ち上がってきます。そこですでにAndroid Studioに用意されている画像を使用する場合は、
赤枠部をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/4a623a1f-d9c4-d3d9-cfc1-9cdf0e719866.png)
すると、画像一覧が表示されますのでそこから必要な画像を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/17529785-90a2-f418-7e06-375b7c48684b.png)
ローカルに保存されている画像を使用する場合は下記画像のようにローカルファイルから
使用する画像を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/f57ed186-7974-aa3e-3ccc-6a619c0f354e.png)
画像を選択し、Nextボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/ee626f0a-d56c-97f8-723f-be65be24139e.png)
最後に、Finishボタンを押下します。
下記画像、選択した画像がどこに保存されるかを示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/09246922-7e4b-79e3-5491-7cd8f04f1726.png)
今回選択した画像は下記画像の赤枠部にアイコンのあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/9fb4aae0-030d-83be-cb3f-4ca3b6cd65a8.png)

#### ベクタ形式画像の使い方
イメージビューをxmlに用意し、使用する画像を選択する画面へ移行します。
そこで、さきほど用意したベクタ画像を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/d7557dbd-4010-7a33-cdbd-cc07857b4098.png)

実行すると、以下のように表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/6636a3f5-5a0f-7220-4617-74446bddec7f.png)

上記のように大きさの縮尺の違う同じ画像でもはっきりと表示できるのがベクタ画像の利点です。



# Android Studioの環境
Android Studio 3.4.1
探索アルゴリズムのライブラリ「simpleai」を試す

## 「simpleai」とは
お手軽に探索アルゴリズムを実装可能なPythonのパッケージです。
https://pypi.org/project/simpleai/

下記によりインストールが可能です。

```{python3}
!pip install simpleai
```

## 探索アルゴリズムの実装イメージ
解きたい問題を定義し、使用したい探索アルゴリズムで解きます。
参考：https://simpleai.readthedocs.io/en/latest/search_problems.html

### 探索問題の定義
「simpleai.search.SearchProblem」というクラスを継承し、いくつかのメソッドをオーバーライドします。

#### SearchProblemクラスのオーバーライド
##### actions(cur_state)
「現在の状態」を受け取り、ゴールに向けた「アクション」をlist型で返す。最終状態または、これ以上進めない状態になった場合は空リストを返すのが通例。

##### result(cur_state, action)
「現在の状態」および「アクション」を受け取り、新しい状態を作りだして返します。

##### is_goal(cur_state)
ゴールに到達したかどうかを返します（True/False）。

##### cost(cur_state, action, next_state) ※任意
「現在の状態」と「アクション」および「次の状態（候補）」を受け取り、「現在の状態」から「次の状態」へ移る際のコストを返します。

##### heuristic(cur_state) ※任意
「現在の状態」を受け取り、ゴールまでの距離（残コスト）を返します。

### アルゴリズムの実行
SearchProblemクラスをオーバーライドして問題を定義したクラスを、使用したい探索アルゴリズム用メソッドへ引き渡し呼び出します。

使用できる探索用アルゴリズムは下記の通りです。
いずれも「simpleai.search.traditional」というパッケージからimportします。

* astar
* breadth_first
* depth_first
* greedy
* iterative_limited_depth_first
* limited_depth_first

### ざっくりとした処理の流れ
1. actions()が呼び出され、次のアクション用リストを取得します。
1. 次のアクション用リストからアクションを1つずつ取り出し、リスト長の回数だけresult()が呼び出されます。
1. 各result()の結果に対しheuristic()やcost()、およびis_goal()を呼び出して、ゴールまでのコストを推定しながら次の状態が決定します。
1. 手順の先頭に戻り、処理が繰り返されます。

## 「simple」による貪欲法のサンプルプログラム
### 貪欲法とは
局所最適選択する探索手法です。局所的に次のステップしか考慮せず、全体最適な最終解を考慮しません。つまり、ステップの都度、利益を最大化する選択を取り込んでいき解を得ます。そのため、多くの問題で全体最適な解にはたどり着けないですが、短時間でそれなりに全体最適解の近似解を得られることが期待されます。

### お題
ここではよくある例として、金額（円）が与えられたときに、支払いに必要な効果の最小枚数を求める問題を解いてみます。
例えば、目標が「687円」として与えられたら、解として「500円×1枚、100円×1枚、50円×1枚、10円×3枚、5円×1枚、1円×2枚」が求まるような問題です。

### 探索問題定義クラスの実装
```{python3}
import simpleai.search as ss

class CoinsProblem(ss.SearchProblem): 
    def set_target(self, target_yen): 
        self.target_yen = target_yen 

    def actions(self, cur_state):
        if cur_state < self.target_yen:
            return [1, 5, 10, 50, 100, 500]
        else:
            # 目標金額を現在の金額が通りこしてしまったら次のアクションは空とする
            return []

    def result(self, cur_state, action): 
        # 現在の金額とアクション（選択されている硬貨）を合算して返す
        return cur_state + action 

    def is_goal(self, cur_state): 
        return cur_state == self.target_yen 

    def heuristic(self, cur_state):
        # 目標金額と現在の金額との差異（距離）を返す
        return self.target_yen - cur_state
```

#### ソルバーを実行する
出力結果（list）の各要素のタプル[0]が、ステップ毎に選択された硬貨を示しています。
「500円×1枚、100円×1枚、50円×1枚、10円×3枚、5円×1枚、1円×2枚」を選択していることが分かります。

```{python3}
TARGET_YEN = 687

problem = CoinsProblem(initial_state=0)
problem.set_target(TARGET_YEN)

result = ss.greedy(problem)
print(result.path())

# 出力結果
[(None, 0), (500, 500), (100, 600), (50, 650), (10, 660), (10, 670), (10, 680), (5, 685), (1, 686), (1, 687)]
```

以上です。
Safariにのみ適用させるCSSハック

感謝🙏

```scss
_::-webkit-full-page-media, _:future, :root .css_selector {
    background-color: red;
}
```
「.css_selector」を適用させたいCSSセレクタに変えるだけ。
（.css_selecor, #css_selectorだけでなく、body とかの指定も可能）
  
https://sublimelife.hatenablog.com/entry/2017/02/06/102109
link_to をクリック不可にするz-indexについて

### 初投稿です！！

現在自分はruby言語について学習しており、ポートフォリオ作成の道中で
link_to がクリックできない事態に遭遇したので、
今後の自分用にメモとして記録しておきます。

自分は
CSSプロパティにて
z-index(選択した要素を最前面や再背面に設定するもの）に
ー（マイナス）記号を用いていつも設定していたのですが
それだとlink_toで設定したリンクをクリックすることができなくなってしまいます。

### ＜例＞

```erb:home.html.erb
     <div class="hoge-index-items">
        <%= link_to("詳細", "/posts/#{post.id}") %>
      </div>

```

```css:home.scss
     .hoge-index-items{
        z-index： -100;
       ~~０未満の値だと反応しない~~
      }
```
↓実行結果
<img width="265" alt="スクリーンショット 2019-07-17 14.41.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396985/d6a66695-9fbd-d9f3-1b20-c851c22c8fb4.png">

z-index内の数字を正の数に変更すると、

```css:home.scss
     .hoge-index-items{
        z-index： ２;
       ~~０以上の値だと反応するようになる~~
      }
```

↓実行結果
<img width="195" alt="スクリーンショット 2019-07-17 14.45.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396985/9445081b-8b39-1e16-f560-1ba1f7e77a35.png">


##まとめ
このことに気付くまでに丸二日ほど掛かってしまいました（笑）
自分の検索能力の無さを痛感しました。

上記のことは同様に HTML 内での aタグ を含んだ設定をする際にも起こるようです。
（参考より）
###参考
[aタグのリンクが反応しない](https://sites.google.com/site/designlabot/html/atagunorinkuga-fan-yingshinai)