OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby初歩】sliceメソッドの使い方

sliceメソッドは、「文字列を切り出す」ことができるメソッド。

例えば、_slice(0,5)_とすると、文字列の0番目（※）から5番目の手前（つまり4番目）までを切り出す。
（※）配列同様、1番目から始まるのではなく0番目スタートである点に注意。

```rb
def slice_1st(lyrics)
  lyrics.slice(0,5) #与えられた文字列の0番目から、5番目の手前（つまり4番目）までを切り出す。
end
p slice_1st("おもちゃのチャチャチャ")*2 #*2で２回分出力。
#=>"おもちゃのおもちゃの"
```

_slice(0..5)_と記述した場合は、文字列の0番目から5番目までを切り出す。

```rb

def slice_2nd(lyrics)
  lyrics.slice(0..5) #与えられた文字列の0番目から、5番目までを切り出す。
end
p slice_2nd("チャチャチャおもちゃの")
#=>"チャチャチャ"
p slice_2nd("チャチャチャ")
#=>"チャチャチャ"
```
もちろん、文字列の途中を切り出すことも可能。

```rb

def slice_3rd(lyrics)
  lyrics.slice(6..12) #与えられた文字列の6番目から、12番目までを切り出す。
end
p slice_3rd("Don't Stop Me Now")
#=>"Stop Me"
```
for文を使わずに、numpy の割り算でやってみよう

# ある軸で正規化したいとき

軸毎にスケールが違って、まとめて比較するとつぶれてしまう場合に、軸毎に最大値や合計値で割って正規化して比較したい。
for文でもできるけど、**keepdims=True** 使うと簡単にできる。
`sum`した後わざわざ軸追加したけど、**keepdims**で同じことができるとは。このためにあるぐらいって気がする。


```python
AAA  = np.arange(24).reshape((2,3,4)) 
print("AAA.shape=", AAA.shape)
print("AAA=", AAA)

sAAA = AAA.sum(-1, keepdims=True)
# sAAA = AAA.sum(-1)[..., np.newaxis] と同じ. 
nAAA = AAA / sAAA
print("\nsAAA.shape=", sAAA.shape)
print("\nnAAA=", nAAA)

mAAA = AAA.max(1, keepdims=True)
# mAAA = AAA.max(1)[:, np.newaxis] と同じ
nAAA = AAA / mAAA
print("\nmAAA.shape=", mAAA.shape)
print("\nnAAA=", nAAA)

mAAA = AAA.max((0,2), keepdims=True)
nAAA = AAA / mAAA
print("\nsAAA.shape=", sAAA.shape)
print("\nnAAA=", nAAA)
```

```
AAA.shape= (2, 3, 4)
AAA= [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

sAAA.shape= (2, 3, 1)

nAAA= [[[0.         0.16666667 0.33333333 0.5       ]
  [0.18181818 0.22727273 0.27272727 0.31818182]
  [0.21052632 0.23684211 0.26315789 0.28947368]]

 [[0.22222222 0.24074074 0.25925926 0.27777778]
  [0.22857143 0.24285714 0.25714286 0.27142857]
  [0.23255814 0.24418605 0.25581395 0.26744186]]]

mAAA.shape= (2, 1, 4)

nAAA= [[[0.         0.11111111 0.2        0.27272727]
  [0.5        0.55555556 0.6        0.63636364]
  [1.         1.         1.         1.        ]]

 [[0.6        0.61904762 0.63636364 0.65217391]
  [0.8        0.80952381 0.81818182 0.82608696]
  [1.         1.         1.         1.        ]]]

sAAA.shape= (2, 3, 1)

nAAA= [[[0.         0.06666667 0.13333333 0.2       ]
  [0.21052632 0.26315789 0.31578947 0.36842105]
  [0.34782609 0.39130435 0.43478261 0.47826087]]

 [[0.8        0.86666667 0.93333333 1.        ]
  [0.84210526 0.89473684 0.94736842 1.        ]
  [0.86956522 0.91304348 0.95652174 1.        ]]]
```
VSCode & Azure でLIFF　スターターアプリを始める

#はじめに
個人的に最近気になっていた LIFF を始めるために LIFF v2 starter app を試してみました。
本投稿ではいつも使い慣れているVSCodeとAzureで環境を構築していきます。

https://github.com/line/line-liff-v2-starter/blob/master/README.md

の「Deploy the app using any other server platform」セクションを参考にしたいと思います。

前提条件としては

- LINEのアカウントを持っている
- VSCodeとGitが使える
- AzureでAppServiceを作成できる
- PCのOSはなんでもOK

です。

早速ドキュメントにしたがってやっていきます。

#VSCodeでの準備
##リポジトリをクローンする
VSCodeのターミナルでクローンしたいディレクトリに移動して

```
git clone https://github.com/line/line-liff-v2-starter.git
```
##VSCodeの拡張機能 Azure Tools をインストールする
VSCodeの拡張機能検索で``Azure Tools``を検索してインストールします。

#Azureの準備
AppServiceを準備します。
ランタイムスタックは Node10 LTSを選択します。
AppServiceプランはフリー(無料)でOKです。

また、ここで作成したAppSerivceのURLをコピーします。
後にチャネルを追加する際に利用します。

#LINEアカウントの準備
##プロバイダーを作成する
https://developers.line.biz/console/

にLINEのアカウントでログインします。
初回ログイン時は開発者情報の入力画面が表示されます。開発者名とメールアドレスを入力して、LINE Developersコンソールの開発者アカウントを作成します。

ログインをしたら適当なプロバイダーを作成してください。
プロバイダーってなんぞ？等の疑問は[公式サイト](https://developers.line.biz/ja/docs/liff/getting-started/#%E3%83%95%E3%82%9A%E3%83%AD%E3%83%8F%E3%82%99%E3%82%A4%E3%82%BF%E3%82%99%E3%83%BC%E3%81%A8%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)で確認出来ます。

![スクリーンショット 2020-09-20 8.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489752/2bbca9b4-aed0-0526-3b51-866301fd36b2.png)

##プロバイダーにチャネルを追加する
作成したプロバイダーに LINEログイン のチャネルを追加します。

![スクリーンショット 2020-09-20 8.21.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489752/4cbee078-8356-9481-bb0d-6fd3c89c4f93.png)

##チャネルにLIFFアプリを追加する
作成したチャネルに LIFFアプリを追加します。
LIFFアプリを追加する際はLIFFアプリをデプロイするサーバのエンドポイントを入力する必要があるので上記でコピーしたAppSerivceのURLを入力します。
![スクリーンショット 2020-09-20 20.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489752/3a8965e6-e84d-548d-7337-18bc2c29e590.png)

LIFFアプリを追加すると下記のようにLIFFIDとLIFFURLがわかるのでこの二つをコピーします。
![スクリーンショット 2020-09-20 20.11.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489752/3adf4205-44c9-b1b2-c8bd-89da5c990c55.png)




#アプリとサーバの準備
##デプロイの準備
公式ドキュメントではHeroku以外にデプロイする時は``app.json ``,``index.js``,``package.json``,``Procfile``ファイルを削除することになっていますが、今回Azure AppServiceもNodeのランタイムを使うので``public/liff-starter.js``を下記の通りに変更します。

```javascript:public/liff-starter.js

    const useNodeJS = false;
    const defaultLiffId = "{上記で取得したLIFFID}";
```

##Azure AppServiceへのデプロイ
VSCodeでAzureの拡張機能を開きます。(確かどこかのタイミングでAzureへのログイン情報の入力を求められるので入力します。)すると下記のように自分が管理しているAzureのサブスクリプションとそのなかで作成されたAppSerivceの一覧が出てきます。

![スクリーンショット 2020-09-20 10.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489752/46312b6f-3487-5619-5d2f-fc576691cbb2.png)

上記で新しく作ったAppサービスで右クリックし``Deploy To WebApp `` → ``line-liff-v2-starterフォルダ``を選択してデプロイします。

#LIFFアプリを確認する
上記で取得したLIURLをLINEのアプリや一般的なブラウザでアクセスすると簡易的な動作を確認できます。
また、[こちら](https://github.com/line/line-liff-v2-starter/blob/master/README.md#app-features)からそれぞれの動作の違いを確認できます。

#さいごに
取り急ぎ今回はLIFF v2 starter appの環境構築までとします。
今後は具体的な使い方や技術的な詳しい部分を探っていければと思います。
tweepyを使用して、特定地域の特定文言ツイート件数を調査する

【要件】
twitter.apiを用いて
特定の文言(涼しい)が含まれる直近100件のツイートを抽出した後
ツイート元ユーザのプロフィールに記載された所在地に
"東京"が何件含まれているかをアウトプットしてくれるプログラムをつくる
（今日はとても涼しかったので作成してみました）


【暫定的に作成したプログラム(locationの検索が可能かどうかテスト)】

```python:get_timeline_specificword.py
import tweepy
import csv


# APIの秘密鍵
consumer_key = 'XXXX' # コンシューマーキー
consumer_secret = 'XXXX' # コンシューマーシークレット
access_token = 'XXXX' # アクセストークン
access_token_secret = 'XXXX' # アクセストークンシークレット


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

for tweet in tweepy.Cursor(api.search,q='涼しい').items(100):
    print(tweet.user.location)
    LOCATE = tweet.user.location
    print('東京' in LOCATE)
```




```sub:【実行結果】
東京都八丈島
Traceback (most recent call last):
  File "get_timeline_specificword.py", line 20, in <module>
    print('東京' in LOCATE)
TypeError: argument of type 'NoneType' is not iterable
```

【原因】
変数LOCATEの型がNonetypeとなっていた(;^_^A
【修正】
inで使える型にする為、str(LOCATE)として修正。




```sub:【修正後実行結果(抜粋)】
False
横浜在住
False
日本 東京 Tokyo
True
```

一応解決したようだ('ω')ノ
ツールとしてはまだまだ改良の余地がありそうですね。
Unityのプロジェクトを開こうとすると、「Failed to load window layout」と表示されてプロジェクトが開けない時の対処法（ Unity, Mac）

#はじめに
あるとき、Unityのプロジェクトを開こうとすると、以下の画像のように「Failed to load window layout」と表示されてプロジェクトが開けなくなりました。
![スクリーンショット 2020-09-19 23.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324523/c0feb57b-560d-44d0-c094-a590595dc1a8.png)
この時、
「Revert Factory Setting」
「Quit」
「Load Default Layout」
のどのボタンをクリックしても解決しません。
どうやら、開こうとしているプロジェクトのウィンドウの現在のレイアウト設定のデータが壊れているようでした。レイアウトの設定は下の画像のように、Window>Layoutsで設定するやつです。

![スクリーンショット 2020-09-20 19.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324523/7699d624-f881-aa0f-022e-18ceebd4ecdc.png)



#試した環境
Unity 2020.1.4
Unity 2020.1.6
OS:macOS Mojave

#試した対処
以下の方法を試しても変化はありませんでした

+ プロジェクトを新規作成する
+ UnityHubと、インストールされている全てのバージョンのUnityをアンインストールする
+ OSを再起動する

#解決方法(Windowsの場合)
Widdowsの場合は、[こちらの動画](https://www.youtube.com/watch?v=bUscnPvXsew)がわかりやすいです。
要は、デフォルトのレイアウトの設定ファイル`Default.wlt`を探して、そのテキストデータをコピーし、現在のレイアウトの設定ファイル`プロジェクト名/Library/CurrentLayout-default.dwlt`のテキストデータを、コピーしたやつで上書きすればいいわけです。

#解決方法(macの場合)
https://www.youtube.com/watch?v=bUscnPvXsew
http://nakamura001.hatenablog.com/entry/20120504/1336137776
を参考にして以下の方法を試したら、ちゃんとプロジェクトを開けました。
Windowsの場合とやり方は一緒です。しかし、macの場合は`Default.wlt`ファイルがどこにあるのかわからないと思うので（僕がそうでした）、その場合は以下の手順を試してください。

1.Finderを開き、「Shift+Command+G」の３つのキーを同時押しする。


2.すると、以下のような画像が表示されるので、
```~/Library/Preferences/Unity/Editor/Layouts/```
上記のパスを入力する。
![スクリーンショット 2020-09-20 19.38.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324523/afb1fe8e-3c6c-9797-d01e-62418a3fbbe4.png)


3.移動をクリックすると、
![スクリーンショット 2020-09-20 20.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324523/18f1636f-aae5-24ea-9935-606b4bb745c5.png)
`Editor-5.x/Layouts/default`
の中に`Default.wlt`ファイルがあります。


4.`Default.wlt`ファイルをテキストエディタで開いて(開くと下の画像のようなテキストが出てくる)、そのテキストを全てコピーする。
![スクリーンショット 2020-09-20 20.23.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324523/3cba157e-5469-577b-b8ed-bf4c643568a5.png)


5.開きたいプロジェクトの`CurrentLayout-default.dwlt`を探して、それをテキストエディタで開いて、さっきコピーしたやつで上書きして保存する。

`CurrentLayout-default.dwlt`ファイルの場所は、

`UnityProjects/プロジェクト名/Library/CurrentLayout-default.dwlt`

にあるはずです。

6.これでプロジェクトを開けるようになるはずです。

#参考にした記事、動画
https://qiita.com/KazuyaSeto/items/2a97ae452214af50108d
https://www.youtube.com/watch?v=bUscnPvXsew
http://nakamura001.hatenablog.com/entry/20120504/1336137776
UIAlertViewのようにいつでもどこでも必ず表示されるアラートを実現

# 問題点

今更ながらUIAlertViewがdeprecatedになった警告に対応しました。

```
'UIAlertView' is deprecated: first deprecated in iOS 9.0 - UIAlertView is deprecated.
```

という警告ですね。

どう変えればいいかはググればいっぱい[出てくる](https://www.google.com/search?q=%27UIAlertView%27+is+deprecated%3A+first+deprecated+in+iOS+9.0+-+UIAlertView+is+deprecated.&rlz=1C5CHFA_enJP720JP720&oq=%27UIAlertView%27+is+deprecated%3A+first+deprecated+in+iOS+9.0+-+UIAlertView+is+deprecated.&aqs=chrome..69i57j69i59.157j0j7&sourceid=chrome&ie=UTF-8)ので割愛しますが、問題点は・・・

* 表示対象のUIViewControllerが必要。
* 二つのUIViewControllerを一つのUIViewController常に`presentViewController`できない。

という問題です。

例えば、どこかのUIViewController内で表示してるのであれば、

```objective_c
    UIAlertController *alert = [UIAlertController alertControllerWithTitle: title
                                        message: message
                                 preferredStyle: UIAlertControllerStyleAlert];
    
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK"
                             style: UIAlertActionStyleDefault
                           handler: handler];
    [alert addAction: ok];
    [self presentViewController:alert animated:YES completion:nil];
```

といった感じで表示できますが、昔のUIAlertViewはどこからでも表示できたので、例えばModelの中などでも使用されてたり、UIViewControllerが取得できないdelegateの中で使用されてたりして困りました。

そこでAPPからrootControllerを取得してそこに表示すればええやん！ってことでやってみました。

```objective_c
UIViewController *rootController = [[[[UIApplication sharedApplication]delegate] window] rootViewController];
[rootController presentViewController:alert animated:YES completion:nil];
```

こういう感じですね。これで表示はされるのですが、同じくUIPopoverControllerも同じ`presentViewController:alert`を使って表示される仕組みに変わっていて、それが`rootController`に表示された状態同じようにアラートを出そうとすると

```
Warning: Attempt to present <UIAlertController ....> ... which is already presenting
```

のような警告がでて無視されちゃうんですね。Modelの中で色々使いまわされてるので、どんなシチュエーションでも必ず表示されるアラートが欲しい！というわけで色々試した結果いけそうなのができたので共有します。


# 解決策

```objective_c
    UIAlertController *alert = [UIAlertController alertControllerWithTitle: title
                                        message: message
                                 preferredStyle: UIAlertControllerStyleAlert];
    
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK"
                             style: UIAlertActionStyleDefault
                           handler: nil];
    [alert addAction: ok];

    UIViewController *rootController = [[[[UIApplication sharedApplication]delegate] window] rootViewController];
    if(rootController.presentedViewController != nil){
        [rootController.presentedViewController presentViewController:alert animated:YES completion:nil];
    } else {
        [rootController presentViewController:alert animated:YES completion:nil];
    }
```

まあ、単純な話ですが、既にpresentedViewControllerがあったらそこに表示、なければrootに表示するだけです。

みんな大好き[StackOverFlow](https://stackoverflow.com/a/61404888/2003391)で見つけました。サイトはSwiftのコードですね。
WEBサービス開発のためのHTTPとGETとPOST

#HTTPとは
WebサーバとWebクライアント(Webブラウザ等)の間でデータの送受信を行うために用いられるプロトコル

#Webサービス
Webクライアント(Webブラウザ等)がサーバーに要求メッセージ(HTTPリクエスト)を送信し、
サーバーは応答メッセージ(HTTPレスポンス)を返します。
このメッセージのことをHTTPメッセージと言います。
そして、をサーバーに送信する際に、HTTPメソッドを指定します。

#HTTPリクエストメッセージ
下記の３つから成り立っています。

- リクエストライン
- リクエストヘッダ
- リクエストボディ

因みに、リクエストヘッダとリクエストボディの間には空白行が入ります。

##リクエストライン
下記の３つから成り立っています。

- HTTPメソッド
- リクエスト対象のURL
- HTTPのバージョン

##HTTPメソッド
HTTPメソッドは複数あり、目的に応じて使い分けます

- GET
- HEAD
- POST
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH

WEBサービスを開発する際には、GETメソッドとPOSTメソッド違いを理解しておくと良いと思います。
APIを利用するWEBサービスの開発の場合は、「DELETE」や「PUT]なども理解しておくと良いと思います。

###GETメソッド
- サーバーからの単純なデータの取得や検索結果の取得の際に使用します。
- URLの後ろにパラメーターを指定することによりデータの送信が可能です。
- パラメータは簡単に参照可能なため、パスワード等の機密性の高いデータは設定しない。
- 送信できるデータ量に上限があるので注意が必要です。
- テキストデータの送信が可能です。

####GETメソッドでのデータ送信イメージ
パラメータは「?」の後ろに、name=値として追加します。
複数個追加する場合は、name=値&name=値として追加します。

```
#パラメータが１つ
https://qiita.com/search?q=http
#パラメータが複数
https://example.com/search?q=aaa&ie=UTF-8
```

###POSTメソッド
- サーバーで何らかの処理をして、データの登録や更新する際に使用します。
- リクエストボディにデータを設定し、サーバーに送信可能です。
- GETと比べて大量のデータを送信可能です。
- テキストとバイナリのどちらのデータも送信が可能です。
【Ruby初歩】splitメソッドとto_sメソッド

splitメソッドは「文字列を１つずつ区切り、配列にする」メソッド。

```rb
def split_1st(string) #string（文字列）を引数として期待するメソッド
  string.split("") #to_sメソッドがない点に注意。
end
p split_1st("12345")
#=> ["1","2","3","4","5"]
p split_1st("Thank You")
#=> ["T","h","a","n","k"," ","Y","o","u"]
```
"Thank You"のようにスペース含んだ場合は、スペースも文字列の１つとしてみなされ出力される。

引数として与えられるのが文字列ではなく、数値の場合はどうすればよいか？
下記のように、to_sメソッドを加えれば、数値も同様に区切って配列にすることができる。

```rb

def split_2nd(integer) #integer（整数）を引数として期待するメソッド
  integer.to_s.split("") #to_sメソッドで数値を文字列に変換し、splitメソッドで文字列を１つずつ区切る。
end
p split_2nd(12345)
#=> ["1","2","3","4","5"]
p split_2nd("12345") #元から文字列のこの呼び出しも有効に出力される。
#=> ["1","2","3","4","5"]
```
格安サーバprimergy tx1310 m3をGPUマシン用にカスタマイズしてみた。

  
## 環境

### 格安サーバー購入
端末：富士通 primergy tx1310 m3 4gb ディスクレスモデル
CPU:インテル® Celeron® プロセッサー G3930 （2.90 GHz）
メモリー:4GB
金額：17800円

### カスタマイズ
メモリー：amazonでW4U2400CM-4Gメモリ8GB(4GB×2)を5030円で購入。
CPU: Intel(R) Core(TM) i5-7500 CPU @ 3.40GHzをヤフオクでにて9000円で落札。
GPU: Palit GeForce® GTX 1050 Ti StormXをヤフオクでにて15000円で落札。
金額：29030円

### カスタマイズ後スペック
OS:Ubuntu 18.04.3 LTS
メモリー：12GB
CPU: Intel(R) Core(TM) i5-7500 CPU @ 3.40GHz
GPU: Palit GeForce® GTX 1050 Ti StormXz
総額：46830円
Gitのmasterブランチ意外、全てのブランチを一括削除する

タイトルの通りに、`master` ブランチ意外全て削除するのは以下のコマンドです。
`'master'`の代わりに他のブランチ名を変えることもできます。


```:ターミナル
git branch | grep -v 'master' | xargs git branch -D
```

長くて覚えづらいので、aliasを作成しました。

```bash:~/.zshrc
alias gbr="git branch | grep -v 'master' | xargs git branch -D"
```
Chromiumブラウザ(Brave)の位置情報のズレを正す

## Chroniumの現在地が全然違う場所を示す
MacOSのMojave/Catalinaで発生するっぽく、結構探してなんとか解決したのですが他にも困っている人がいそうなので投稿。

ChromeやFirefoxなど他のブラウザでは正しい位置情報が表示されるのだがなぜかBraveでのみ位置がズレていた。Cookieを消去してもシークレットモードでもダメなのでBrave側のバグかと思い調べたところ、[BraveのGithubにIssueが立てられていた。](https://github.com/brave/brave-browser/issues/10724)
読み進めると[Chronuimのバグだった。](https://bugs.chromium.org/p/chromium/issues/detail?id=1051591)

## 解決策
1. "chrome://flags#enable-core-location-implementation" から*Core Location Implementation*をdefault -> enableに変更
2. ブラウザを再起動
3. Macの環境設定 -> セキュリティとプライバシー -> 位置情報サービス -> 問題のブラウザを許可

で治った。わいわい
[備忘録]VBSでファイルを増殖＆置換

・VBSでファイルを増やす
Option Explicit

Dim fso ' FileSystemObject
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

Dim targetFile, afterFile
Dim beforeFolder, afterFolder  
Dim beforePath, afterPathB, afterPathA
Dim startNum, endNum
Dim replaceTarget
Dim i, nowNum , objFile, fileContents, cncFlg

'入力
'targetFile = inputbox("コピー対象")
'beforeFolder = inputbox("コピー対象のパス(末尾に\をつける)")
'startNum = inputbox("開始")
'endNum = inputbox("終了")

targetFile = "" 'コピー対象
beforeFolder = "" 'コピー元フォルダ
afterFolder = "" 'コピー先フォルダ
startNum = "1"
endNum = "70"

cncflg = msgbox ("以下の内容で処理を開始。" & vbCr & _ 
                "コピー対象 : " & targetFile & vbCr & _ 
                "コピー元フォルダ : " & beforeFolder & vbCr & _ 
                "コピー先フォルダ : " & afterFolder & vbCr & _ 
                "開始番号 : " & startNum & vbCr & _ 
                "終了番号 : " & endNum & vbCr, 1)

if cncFlg = vbCancel then
    msgbox "処理を中断"
    Wscript.quit
end if



'置換対象文字列
replaceTarget = "" '置換対象

'コピー元パス
beforePath = beforeFolder & targetFile

'ファイル名変更前パス
afterPathB = afterFolder & targetFile 

 '増殖処理beforePath
for i = startNum to endNum
    
    '①afterフォルダに対象をコピー
    fso.CopyFile beforePath, afterFolder
    
    '②一桁の場合、二桁にする
    if i <= 9 then
        nowNum = "0" & cstr(i)
    else 
        nowNum = cstr(i)
    end if
    
    '③中身置換
    'ファイルの中身読み込み
    set objFile = fso.OpenTextFile(afterPathB)
    fileContents = objFile.ReadAll
    objFile.Close
    
    '対象を置換した文字列の作成
    fileContents = replace(fileContents, replaceTarget, nowNum)
    
    '置換後中身を書き込み
    set objFile = fso.createtextfile(afterPathB)
    objFile.writeline(fileContents) 
    objFile.Close

    
    '③ファイル名置換
    '置換後ファイル名
    afterFile = replace(targetFile, replaceTarget, nowNum)
    '置換後パス
    afterPathA = afterFolder & afterFile
    
    'リネーム
    fso.moveFile afterPathB, afterPathA
    
next

msgbox "処理終了"

'オブジェクト開放
Set fso = Nothing
fileContents = ""
Dynamic Routing(動的ルーティング)について

#プログラミング勉強日記
2020年9月20日
RailsでWebアプリを作った時に、なんとなく理解していたがちゃんと理解するためにまとめる。

#Routing(ルーティング)とは

>ルーティングとは、ネットワーク上でデータを送信・転送する際に、宛先アドレスの情報を元に最適な転送経路を割り出すこと。特に、インターネットなどのIPネットワークにおいて、パケットの転送先を決定すること。

　ネットワークの通信は宅配と似ていて、ルータと呼ばれるネットワーク機器が宛先IPアドレスを見て、宛先に近いルータへとデータを転送する。そして宛先に近いルータから宛先IPアドレスが設定されているコンピュータへとデータを送る仕組みになっている。このときに、どこのルータに送るのが目的地までが最適経路なのかを判断する仕組みのことをルーティングという。

　通信相手までの経路を判断する仕組み(ルーティング)のデータの表をルーティングテーブルという。ルーティングは、あらかじめルーティングテーブルに経路情報が書き込まれていて、ルーティングテーブルを参照することでデータが目的地に到達するための経路を判断する仕組みである。
　ルーティングには動的ルーティングと静的ルーティングの2通りの方法がある。

#Dynamic Routing(動的ルーティング)とは

>ダイナミックルーティングとは、ルータなどが経路情報を互いに交換しあい、自動的に生成・更新し続ける経路表（ルーティングテーブル）に基づいて経路選択を行なうこと。

　簡単にまとめると、動的ルーティングは機器同士で情報を交換して経路情報を自動的に作成する。ルーターに設定するのは、ルーティングテーブルではなく、ルーティングプロトコルになる。動的ルーティングを用いた場合は、新しいネットワークが追加されても自動的にルーティングテーブルが変更されるメリットがある。ただ、経路制御表を常に監視するために各ネットワーク間にはある程度エラーが起こることがある。
　
　逆に自動更新ではなく人間が手動で更新するのが静的ルーティングである。

#参考文献
[ルーティング (routing)](https://wa3.i-3-i.info/word1498.html)
[ルーティングテーブル (routing table)](https://wa3.i-3-i.info/word12224.html)
[ルーティング  【 routing 】  経路選択 / 経路制御](http://e-words.jp/w/%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0.html)
[ルーティングとは](https://medium-company.com/%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/)
[動的ルーティング (dynamic routing)](https://wa3.i-3-i.info/word18048.html)
[ダイナミックルーティング  【 dynamic routing 】  動的ルーティング / 動的経路制御](http://e-words.jp/w/%E3%83%80%E3%82%A4%E3%83%8A%E3%83%9F%E3%83%83%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0.html)
[静的ルーティングと動的ルーティング](http://www.mm-labo.com/computer/tcpip/routing/staticroutinganddynamicrouting.html)
【Kotlin】自分用メモ①

# 【Kotlin】自分用です、最近見ていいなと思った書き方
* nullチェックとnullだった時の処理の書き方

``` kotlin
var hoge: String? = null

// 適当な文字列が返りそうな処理
hoge = getTitle()

hoge?.let {
　　// null出ない時の処理
   println(hoge)
} ?: run {
   // nullの時の処理
　 println("null")
}
```

* 配列の初期化
  * やってること: 配列の中身を全て２倍した配列を返す

``` Kotlin
(0..10).map{ it * 2 }
```

* codeWarsとかの問題でよく使われる`sumBy`


``` Kotlin
val iterable = listOf(1, 2, 3)

println(iterable.sumBy { it * 10 }) 
// 結果は、60が返る
```

* 文字列の繰り返し `repeat`

``` Kotlin
var hoge = "hoge"

var hoge3 = hoge.repeat(3)
println(hoge3) => "hogehogehoge"
```
WPF の OverridesDefaultStyle プロパティの内容

# はじめに

WPF の FrameworkElement.OverridesDefaultStyle プロパティの内容が、MSDNの説明を読んでもよく分からなかったので、それを調べた時のメモです。

[FrameworkElement.OverridesDefaultStyle プロパティ - MSDN](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.frameworkelement.overridesdefaultstyle?view=netcore-3.1)

# 解説

以下の Stack Overflow のページに書いてありました。

[OverridesDefaultStyle in WPF - Stack Overflow](https://stackoverflow.com/questions/1497176/overridesdefaultstyle-in-wpf)

上記によると、コントロールのデフォルトスタイルを無視するために使用するとのことです。
デフォルトでは、コントロールをUIに配置すると、そのコントロール内で設定していない全てのプロパティの値がデフォルトスタイルから取得されます。
OverridesDefaultStyleをtrueに設定することで、デフォルトのスタイルから値を取得されないようにする用途のようです。

日本語記事だと、現在(2020年)ではAzureの記事で有名な「しばやん雑記」の人が、2008年に以下の投稿をしていました。

>Template を指定していないのに OverridesDefaultStyle = True にすると何も表示されなくなるので注意

[WPF メモ (27) - しばやん雑記](https://blog.shibayan.jp/entry/20080825/1219662886)
Apexクラスのベストプラクティス

# Apexクラス
- IDのハードコーディングはどんなクラスでも容認できない
- 空のcatchブロックを書かないこと
- プロダクションコードでsystem.debugのコードを削除しないこと
- 明確な共有ルールの強制実行しないユースケースがない限り、with sharing句ですべてのクラスを宣言する
- FORループ内にSOQLクエリまたはDMLステートメントがないこと（それらを実行する他のメソッドの呼び出しを含む）
- データを適切に抽出する（特に大量データの場合）
- 汎用機能をUtilに保存する
- ガバナ制限を超えないようにするため、ApexのLimitsメソッドの使用
- クラスの主要機能ではない補助メソッドなどを追加する場合はHelperクラスを使用する
<br>
<br>
- 全てのhelperクラスとメソッドはBulkifyする
- エラーを監視して対処する場合は、未処理エラーはエラーログオブジェクトにレコードを記録する
- WSDLから作成されたWebサービスクラスは、WSDLを生成したシステム名で始まりWebServiceで終わる名前をつける。また、WSDLがスキーマも定義している場合、それらのクラスの名前はSchemaで終る
- WebサービスおよびFutureメソッドでは、ビジネスロジックを明示的に書かない
- Webサービスは常に成功または失敗の通知を返す必要があるため、無効にすることはできず、強力なエラー処理が必要
- エラーなどのメッセージは、アプリで共通のカスタムラベルに定数で定義する
- Selectした全内容をfor文でチェックする場合は、ヒープサイズ制限を回避するため、極力SOQL forループを使用する
セル生産方式

応用情報技術者平成29年春期 午前70

セル生産方式の特徴はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0a628b37-1582-5253-da50-9600030c4b05.png)



１、セル生産方式は、
製造業における生産方式の一種で、1人若しくは少数の作業者チームで製品の組み立て工程を完成（または検査）まで行うものです。作業者の周囲に機械、組付工具及び部品が配置され、その中を多能工が歩き回って作業をします。ライン生産方式などの従来の生産方式と比較して、作業者一人が受け持つ範囲が広く多品種を生産するときフレキシブルな切り替え可能なのが特徴です。

作業台が「コ」の字型に囲む様子を細胞に見立てて「セル生産方式」と呼ばれています。「一人屋台方式」と呼ばれることもあります。

２、
・作業指示と現場管理を見えるようにするために，かんばんを使用する。
⇒かんばん方式の説明です。

・生産ライン上の作業場所を通過するに従い製品の加工が進む。
⇒ライン生産方式の説明です。

・必要とする部品，仕様，数量が後工程から前工程へと順次伝わる。
⇒後工程引き取り方式の説明です。



参照：
https://www.ap-siken.com/kakomon/29_haru/q70.html
WordPressでSSOを実現するプラグインまとめ

# Gianism

多数のSNSに対応したプラグインです．設定用UIも日本語に対応していてわかりやすいです．

[Gianism – WordPress プラグイン | WordPress.org 日本語](https://ja.wordpress.org/plugins/gianism/)

## 対応サービス

- Facebook
- Twitter
- Instagram
- LINE
- Google

## スクリーンショット

以下はLINEによるログインを設定した場合のスクリーンショットです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/4a89896c-fb85-dd9a-c2e8-bc2b1066529d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/2a5beb2d-3cb9-5008-4837-d61cf0e41a3b.png)

# Google Apps Login

Googleアカウントのみに対応しています．シンプルな設定UIがわかりやすいです．

[Google Apps Login – WordPress plugin | WordPress.org](https://wordpress.org/plugins/google-apps-login/)

## 対応サービス

- Gooogle

## スクリーンショット

以下はGoogleによるログインを設定した場合のスクリーンショットです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/bd4278b3-abae-39c7-2b70-4289be713bcf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/d081338c-4982-0076-7f5a-029855b1a41f.png)

以下は設定画面のUIです．ログインボタンのデザインを選ぶほか単純な設定が無料版では出来ます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/43cdfecd-9ebd-34ea-8532-6a4cd30adb31.png)
value.hasOwnProperty('tag') エラーが発生する

# 目的
- 原因の特定に時間がかかったためシェアする
- このエラーメッセージで検索しても日本語では情報が出なかったため、今後同じ問題が発生した人の調査に役立てたい

# 事象
- エラーメッセージは以下

```
console.error: There was a problem sending log messages to your development environment Error: value.hasOwnProperty is not a function. (In 'value.hasOwnProperty('tag')','value.hasOwnProperty' is udefined)
```

# 環境
- react-native
- expo 3.21.13

# 原因と対処
- この問題は、Expoの内部のバグ
- `console.log()` の引数内にjsonを直接入れた時に発生する場合がある
- なので、サーバリクエストなどの結果をconsole.logに出そうとした時にエラーが発生する
- 例えば、以下の時に発生した

```
//ReactNativeの画面で入力した結果をstateに入れている。
// それをUploadを行う非同期処理メソッドに直接入れている
uploadTokoAsync(state)


// 投稿を実施する
uploadTokoAsync =  (state) => {

// 入ってきた引数の中身をログにだす　→　ここでエラーが発生する
console.log(state)

//以下はstateの中身ををアップロードする処理

}
```

- チケット6496上の議論での対処としては、出したい値を以下のようにJSON.stringfyで展開してタグ付けして解決をしているらしい

```
console.log('Test', JSON.stringify(state));
```

> https://github.com/expo/expo/issues/6496
python3の入門 #2 型と変数について学ぶ

どうも、beatbox4108と申します。
今回は、高度な計算について学ぶ...予定でしたが、説明の必要がある、pythonの__型__と、__変数__について学びたいと思います。
__注意:今回から、インタラクティブシェルの使用回数が急激に増えます。使い方を確認してください。__
#対象としている人
プログラミング初心者で、pythonを学ぼうとしている方
教育現場で、pythonを使いたいが、説明方法がわからない教員の方
#前提
python3がpcにインストールされている。
開発環境の使い方がわかる。
前回までの演習を理解している。
#型について学ぶ
##まずざっくりと
pythonで言う__型__は、データの種類を表すものです。
基本となるものは、次のものです。

|型の名前|型の種類|型の使用例|
|:-:|:-:|:-:|
|int|整数値を扱います。|```4108```|
|float|小数値を扱います。|```41.08```|
|str|文字列を扱います。|```"beatbox4108"```|
|bool|ブールを扱います。|```True```|

boolなんていう変な型がありますが、後ほど詳しく説明します。
##int型、float型って何なんだ!
上の表で見たように数値を扱います。
int型を、強制的にfloat型にするには、```float()```関数を使います。
float型を、強制的にint型にするには、```int()```関数を使います。

例:

```python3
>>> int(41.08)
41
>>> float(4108)
4108.0
```

##str型は、何だ!
上の表で見たように、文字列(文字の並び)を扱います。
int型などといった、多くの型は、```str()```関数を使い、str型に変換できます。

str型には、多くの、_メソッド_があります。
###ちょっと待て、メソッドとはなんぞや!
メソッドとは、型に関する操作をまとめた関数__もどき__です。(違ってたらすみません。)
メソッドは、データのあとに```.```(ピリオド)をつけて、関数のように呼び出します。
こんな感じ:

```python3
>>> "beatbox4108".replace("4108","8192")
"beatbox8192"
```

str型のよく使うメソッドを表にまとめておきます。詳しくは調べてみてください。

| メソッド名 | 説明 | 使用法 |戻り値|
|:-:|:-:|:-:|:-:|
| replace | 文字を置き換えます | ```.replace(置き換え前の文字列,置き換え後の文字列)``` |置き換え後の文字列(str型)|
| split | 文字列を、特定の文字で分割します | ```.split(区切る文字)``` |分割後のリスト(list型)|
| upper | アルファベットを全て大文字にします | ```.upper()``` |変更後の文字列(str型)|
| lower | アルファベットを全て小文字にします | ```.lower()``` |変更後の文字列(str型)|

戻り値とは、関数を使用したときに、帰ってくるデータのことです。
`split`メソッドの戻り値は、list型と、わからないでしょうが、次回以降説明します。
##bool型なんて、さっぱりわからん!
bool型は、上の表で見たように...って説明できん!!
気を取り直してbool型は、__```True```と```False```で表される__、特殊な型です。
TrueとFalseには、次のような意味があります。

| True | False |
|:-:|:-:|
| 正 | 偽 |
__「全くわからん」__って声が聞こえそうですが、条件式を勉強する際に説明します。
ちなみに、TrueとFalseは、notで、反転できます。

```python3
>>> not True
False
```
#変数について学ぶ
##まずざっくりと
pythonで言う、__変数__は、簡単に言うと値に名前(名札)をつけるようなことです。
変数は、`変数名=値`の形式で作成・変更できます。
変数を読み出すときは、変数名を値の代わりに入力すれば、読み出せます。
>数学大好き君:
>>なんで`x=1`と書いたのに、
>>`x=2`と入力すると、`x`が2になるんだよ!ちぇっ

例:

```python3
>>>hello="こんにちは"
>>>print(hello)
こんにちは
```
##変数を使うときのテクニック
次のように書くと、四則計算の省略ができます。
省略前:

```python3
x=10
x=x+3
x=x-3
x=x*3
x=x/3
print(x)
```
省略後:

```python3
x=10
x+=3
x-=3
x*=3
x/=3
print(x)
```
#今回のまとめ
pythonで言う__型__は、データの種類を表すもの。
pythonで言う、__変数__は、簡単に言うとデータをいれる箱のようなもの。
変数は、`変数名=値`の形式で作成・変更できる。
変数を読み出すときは、変数名を値の代わりに入力すれば、読み出せる。

今回の演習はここまでです。次回も楽しみにしてください。
[目次へ移動](https://qiita.com/beatbox4108/items/d2de1fb16e0f2b5edb18 "mokuji")
プロキシが必要な社内環境にSentry Onpremiseを入れる


外部接続が禁止されてる状態でのSentry onpremiseのインストール手順です。

### プロキシを設定してSentry onpremiseのコードを取得します
```
$ export http_proxy=proxy.example.com:8080
$ export https_proxy=proxy.example.com:8081
$ git clone https://github.com/getsentry/onpremise.git
$ cd onpremise/
```

### とりあえずインストールをお試し、通信失敗
```
$ ./install.sh
Checking minimum requirements...
中略
W: Failed to fetch http://deb.debian.org/debian/dists/stretch/InRelease  Could not connect to deb.debian.org:80 (151.101.230.133). - connect (111: Connection refused)
```

### cron/Dockerfileでもproxyを使うように修正します
```
$ sed -i '3iENV http_proxy="http://proxy.example.com:8080"' cron/Dockerfile
$ ./install.sh
中略
You're all done! Run the following command to get Sentry running:
 docker-compose up -d
```

### /etc/hostsの編集権限がない場合、内部urlをlocalhostに修正しておきます。
```
$ vi sentry/config.yml
system.internal-url-prefix: 'http://web:9000'
→system.internal-url-prefix: 'http://localhost:9000'
```

### 立ち上げます
```
$ docker-compose up -d
Starting sentry_onpremise_memcached_1            ... done
以下略
```

### proxyを外して接続確認します
```
$ unset http_proxy
$ unset https_proxy
$ wget http://localhost:9000
--2020-09-16 20:37:49--  http://localhost:9000/
中略
Saving to: ‘index.html’
 
100%[====================================================================================>] 9,692       --.-K/s   in 0s     
 
2020-09-16 20:37:51 (285 MB/s) - ‘index.html’ saved [9692/9692]
```

おつかれさまでした。
python3の入門 目次

pythonの入門のページをまとめていきます。
入門は、前から順にやることを勧めます。

#第I部
[#1 基本的知識を学ぶ](https://qiita.com/beatbox4108/items/165afa8017c51a9737d1 "#1")
[#2 型と変数について学ぶ](https://qiita.com/beatbox4108/items/04c75463a5e2a1f354c8 "#2")
[#3 __import文__を使って、高度な計算をやってみる](https://qiita.com/beatbox4108/items/28247f014eed062d058e "#3")
SimpleInjectorで不要なインスタンス生成を抑止する

.NETにはSimpleInjectorという非常に軽量でよくできたDIコンテナがあります。

私はこれを多用しているのですが、その際にインスタンスを1度生成したつもりが複数生成される事象に、悩まされることがありました。システムで一つしか生成しないインスタンスで、そのインスタンス生成時にやや重たい処理をしたかったのですが、実際には2回実行されていました。

SimpleInjectorは次のように利用します。

```csharp
var container = new Container();
container.Register<Foo>();
container.Register<Bar>();
container.Verify();

var foo = container.GetInstance<Foo>();
```

SimpleInjectorでは依存性を登録した後、Verifyで登録が不足しているオブジェクトがないかベリファイすることができますが、実はこの時内部でインスタンスが生成されているために、前述のようなインスタンスの複数生成が行われます。

ではVerifyを外せばいいかというと、つぎの二つの問題があります。

1. 開発時はVerifyしておかないと、不具合の発見が遅れる
2. Verifyを明示的に呼ばなくても、GetInstanceした際に、Verifyしていなければ自動的に実行される

そのため、つぎのように実装するとよいのではないかと思います。

```csharp
            var container = new Container();
            container.Register<Foo>();
            container.Register<Bar>();
#if DEBUG
            container.Verify();
#else
            container.Options.EnableAutoVerification = false;
#endif

            var foo = container.GetInstance<Foo>();
```

Debug実行時は明示的にVerifyを呼び出し、そうではない場合は、AutoVerificationを明示的にOFFにします。

これでReleaseビルドされたモジュールでは不要なインスタンス生成が避けられるはずです。

なおコメントでいただきましたが、登録するインスタンスをSingletonとして登録できる場合は、そちらでも回避は可能だと思います。どちらが向いているか、ケースによって検討してみてください。
ActiveDecoratorの役割　Helperとの使い分け


# はじめに
Viewの共通化やロジックを切るときに、いつもHelperを使っていたのですが、Decoratorのことをよくわかっておらず、どちらもviewでのメソッドを作成できるものとしての認識しかなかったので、Decoratorの役割について調べてみました。

# DecoratorとHelperについて

どちらもViewにロジックを書かないようにして、Viewの肥大化を防ぐ役割を持っています。

Viewで必要になるロジックをHelperで定義するのは、よく使われますが、helperばかり使っていると、どんどん肥大化していってしまいます。

他にも、helperのデメリットとして

- Viewでグローバルに有効になってしまうので、名前が被ってしまう可能性があり、バグの原因になってしまう
- モデルの情報を引数として渡した場合、名前が冗長になってしまう

等あげられます。

#####これらの解決策として、ActiveDecoratorが用いられます。

Helperはmodelに依存しないのですが、ActiveDecoratorではmodelに依存したロジックを書くことが可能です。

これの何がいいかというと、modelにアクセスする際に変数を介する必要がない、
引数を渡す必要がないことがメリットです。

また、viewと対応するmodelごとにdecoratorファイルを作成することが可能です。

# 例
Helperの場合

```ruby
def user_name(model)
 model.first_name + model.last_name
end
```
Decoratorの場合

```ruby
def user_name
 first_name + last_name
end
```
こんな感じでmodelをわざわざ渡す必要がなく、すっきりと書くことができます。

このようにDecoratorを用いることによって、Viewをシンプルに保ちつつ、メソッドが冗長になりにくく、見やすいものを作成することができます。



# 最後に

使い分け方としては、modelに依存したものであればDecorator、modelに依存関係がないものであればHelperを用いることによって、どちらか一方の肥大化を避けるために適切に定義してやるのがいいのかなと思っています。


# 参考文献

README
https://github.com/amatsuda/active_decorator/blob/master/README.md#decorating-associated-objects

https://jiro8899.hatenablog.com/entry/2020/02/16/235117

https://tech.misoca.jp/entry/2016/02/05/111644
[Python] 直感的な相対importができるツール

## 問題提起
- Pythonは、**上位のディレクトリ**や遠く離れたディレクトリから**importできない**
- Pythonの相対importは直感的ではない
    - 「そのファイル」からの相対位置指定ではない。呼び出し元ファイル(最初に実行されるpythonファイル)が変わると、**相対importの参照がずれる**
- Pythonでは、**自作ツールを複数のプロジェクトからimportするときのディレクトリ構成が難しい**
    - 上位のディレクトリ・兄弟のディレクトリのimportが難しいため

## 結論
相対パス参照のパッケージをインストール

```
pip install relpath
```

```python
from relpath import add_import_path
add_import_path("../")  # ここで、importしたいツールの場所を相対参照で指定

from my_module import some_function
```

## 詳細説明 (相対import)

`relpath`パッケージを利用すると、下記の例のように、
モジュールの直感的な相対importを実現できます。

```python
from relpath import add_import_path
add_import_path("../")

from my_module import some_function

some_function()
```

上記の例を見ると、単に`sys.path.append("../")`としても動作するように思われます。
しかし、プロジェクトフォルダの階層構造が複雑で、1つのモジュールが別々の場所から使われるような場合には、`sys.path.append("../")`では対応できないことがあります。
そのため、相対importを実現したいときは、常に`relpath`パッケージの`add_import_path`を利用することを推奨します。

## その他の使い方
`relpath`パッケージを使うと、importに限らず、
直感的な相対パス参照が可能です。

例えば、下記のような複数のpythonファイルからなるプロジェクトを考えます。

```
.
`-- project_folder
    |-- parts
    |   |-- data.txt
    |   `-- script_B.py
    `-- script_A.py
```

`script_A.py`の中では下記のように、`script_B.py`を利用します。

```python
# script_A.py

# load script_B.py
from parts.script_B import get_data

print(get_data())
```

この場合に、下記のコード例のように、
`script_B.py`から`"./data.txt"`を相対的に読み込もうとすると失敗します。(注1)

> (注1)
> 厳密には、`script_A.py`からの相対パス指定をすれば読み込めますが、
> 呼び出し元が別の場所に変更された場合、正常に動作しなくなるので、メンテナンス性が悪くなります。
> これを回避するため、`relpath`パッケージの利用を推奨します。

```python
# script_B.py

def get_data():
    with open("./data.txt", "r") as f:  # -> FileNotFoundError: [Errno 2] No such file or directory: './data.txt'
        return f.read()
```

そこで、`relpath`パッケージを使って下記のように書くと、
`"./data.txt"`を相対的に読み込めるようになります。(注2)

```python
# script_B.py

from relpath import rel2abs

def get_data():
    with open(rel2abs("./data.txt"), "r") as f:  # -> NO ERROR!!
        return f.read()
```

> (注2)
> 相対パスに関するpythonの仕様は、必ずしも間違いというわけではありません。
> pythonの仕様(相対パスの指定が、記述するファイルの場所に関わらず、常に最初の呼び出し元を基準として解釈される仕様)には、
> プログラムを開発する中でもしファイル読み込み等の命令を記述する場所(ファイル)が変更になった場合でも、
> パス指定方法の変更が不要になるという利点があります。
> `relpath`パッケージは、pythonの仕様の他に、プログラマーにもう一つの選択肢を与える手段に過ぎないので、
> 状況に応じて利用の要否を検討することを推奨します。

## 参考
- `relpath`パッケージのPyPIリンク
    - https://pypi.org/project/relpath/
DCGANを4周遅れぐらい、かつ、アンチな気分スタートで学ぶ。すでに、ぐらっときてますが。。。

#目的
目的は、タイトルのとおり。
DCGANを4周遅れぐらい、かつ、アンチな気分スタートで学ぶ。すでに、ぐらっときてますが。。。

GANなど、**敵対どうこうというのが、どうも、わざとらしく感じ**、食わず嫌いでした。
端的には、敵対する暇があったら、協力して、精度の良い画像とかを生成すればいい、
と思ってしまいます。

以下のgithubのコードを動かしてみました。
https://github.com/jacobgil/keras-dcgan/

#動かした結果
なぜか、7エポックぐらいで止まりました（メモリ不足？？）。
最初と7エポックの状態を示します。それなりに、数字らしくなっているかと。

![0_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/22f964f3-2d1f-69eb-034e-6b3f71b55c8f.png)


![7_1280.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/97a31bb9-9f0f-9da3-c3c2-4ad1d36fba9b.png)

#GANの説明
以下のサイトの図を借りました。

出典：https://www.freecodecamp.org/news/an-intuitive-introduction-to-generative-adversarial-networks-gans-7a2264a81394/

![GAN.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/59d2e44d-7441-319b-294d-5afa630ba4b7.png)




#これまでにわかったこと
##2020/09/20時点
「Discriminator」は、
「Generator」のまさに、**いま、不味い部分を具体的に狙い撃ちできる**ので、非常に、効率的に、厳しく判定できると思います。これは、この構造でないとできないと思われます。
よく説明にある「競わせる」という部分がそれを説明しているのでしょうが、、、、うまく理解できていませんでした。


#まとめ
この記事で役立つかもしれない情報。

* 以下のDCGAN、何もしなくても、素直に動作するのでは？（ワタシの環境では動きました。）
https://github.com/jacobgil/keras-dcgan/
* 「Discriminator」と「Generator」を準備するのは、すごく、合理的な気がします。
* 一度、動かされることをお勧めします、また、コードも単純なので、ちらっとながめるといいかもしれません。

コメントなどあれば、お願いします。:candy:
浸透価格戦略

応用情報技術者平成29年春期 午前68 


事業戦略のうち，浸透価格戦略に該当するものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f230cef5-72a6-68ca-fd7a-6551b1f63e67.png)

１、浸透価格戦略は、
　・新規製品を市場に投入する際に、
　・価格を低い水準に設定することで
　・可能な限り多くの顧客を獲得し、
　・早期に認知度アップやシェア拡大
を狙う価格戦略です。

市場シェアを獲得した後は、大量生産によるコスト削減などで中長期的に利益を生み出し初期コストを回収します。浸透価格戦略は、価格弾力性が大きい日用品業界などの価格戦略でよく見られます。

２、上澄み吸収戦略　（うわずみ）
浸透価格戦略とは逆に、最初に価格を高い水準に設定し、徐々に価格を下げていく価格戦略を上澄み吸収戦略と言います。

３、
・売上高をできるだけ維持しながら，製品や事業に掛けるコストを徐々に引き下げていくことによって，短期的なキャッシュフローの増大を図る。
⇒収穫戦略の説明です。

・事業を分社化し，その会社を売却することによって，投下資金の回収を図る。
⇒即時撤退戦略の説明です。

・新規事業に進出することによって，企業を成長させ，利益の増大を図る。
⇒拡大戦略の説明です。

・低価格戦略と積極的なプロモーションによって，新製品のマーケットシェアの増大を図る。
⇒浸透価格戦略の説明です。

参照：
https://www.ap-siken.com/kakomon/29_haru/q68.html
M&Aーー合併(Mergers)と買収(Acquisitions)

応用情報技術者平成29年春期 午前66

多角化戦略のうち，M&Aによる垂直統合に該当するものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d37427fc-067e-0ec9-1ab7-3decc45c58df.png)


１、M&Aは合併(Mergers)と買収(Acquisitions)を組み合わせた言葉で、他社を自社に吸収合併したり、他社の株式を多く取得し買収することで子会社化することです。事業の多角化、企業グループの再編、事業統合などの目的で実施されます。

M&Aは、合併する側とされる側の企業間の関連によって「垂直統合型」「水平統合型」及び「混合型」などに分類されます。
・垂直統合型
　生産を行う工場が「部品工場」や「営業会社」等のサプライチェーンの上流や下流にある工程を企業グループに統合することで市場競争力や資材の供給力を高める形のM&A。
・水平統合型
　同業他社を買収する形のM&A。市場シェアや事業規模を拡大する目的などで実施される。
・混合型
　異業種との合併となるM&A。新規分野・新規市場に進出する目的などで実施される。

２、
・銀行による保険会社の買収・合併
⇒水平統合型に該当します。

・自動車メーカによる軽自動車メーカの買収・合併
⇒水平統合型に該当します。

・製鉄メーカによる鉄鋼石採掘会社の買収・合併
⇒垂直統合型に該当します。

・電機メーカによる不動産会社の買収・合併
⇒混合型に該当します。


参照：
https://www.ap-siken.com/kakomon/29_haru/q66.html
AWSのIPアドレスを知りたい

AWSの公式ページに各サービスのIPアドレスについて説明があります。
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html

ただ、実際のIPアドレス範囲はJSON形式になっています。

機械で処理する分には便利ですが、サクッと見たいときには不便なのでスクリプト化していつでも最新の範囲を表示できるスクリプトを備忘録として残します。

確認したのは PowerShell Core です。

# ip-ranges.json

Invoke-WebRequestでダウンロードします。wgetやcurlでもお好みで。

```powershell
Invoke-WebRequest https://ip-ranges.amazonaws.com/ip-ranges.json -OutFile ip-ranges.json
```

# 抽出

まずJSON形式をオブジェクトへコンバートする。
CloudFrontとAPI GatewayのIPv4範囲をピックアップしてみました。ソートや形式などはお好みで。

```powershell
Get-Content -Path .\ip-ranges.json |
  ConvertFrom-Json |
  ForEach-Object prefixes |
  Where-Object {($_.service -eq "CLOUDFRONT") -or ($_.service -eq "API_GATEWAY")} |
  Where-Object {($_.region -eq "GLOBAL") -or ($_.region -eq "ap-northeast-1")} |
  Sort-Object service,region,ip_prefix |
  Format-Table service,region,ip_prefix
```

## IPv6

`ForEach-Object prefixes` の代わりに `ForEach-Object ipv6_prefixes` になります。

## CSV化

出力段を `Format-Table ・・・` ではなく `ConvertTo-CSV` に置き換えるとCSV形式になるのでファイル保存して加工には便利かも。
Expoアカウントの作成方法

# まえおき

React Nativeの開発支援サービスExpoのアカウント登録手順です。

# 手順

1. [Expo公式サイト](https://expo.io/)へアクセスします。

1. 画面右上の[Sign Up]をクリックします。
    ![スクリーンショット 2020-09-20 17.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/38ef0aea-94df-10f9-131e-bc7a7ce8c901.png)

1. アカウント情報を入力し[Create Your Account]をクリックします。
    ![スクリーンショット 2020-09-20 17.36.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249974/0c4b6939-a451-4eda-66bb-ff00fb2e3be6.png)

以上で登録作業は完了です。
xgboostで勾配ブースティング木モデリングをしよう

# 勾配ブースティング木とは？
データ分析コンペでよく使われるアルゴリズムの一つ。
GBDTと略される。

G・・・ Gradient(勾配) = 勾配降下法
B・・・ Boosting(ブースティング) = アンサンブル手法の1つ
D・・・ Decision(決定)
T・・・ Tree(木)

つまり、「勾配降下法(Gradient)」と「Boosting(アンサンブル)」、「決定木(Decision Tree)」を組み合わせた手法。

## 勾配降下法
重みを少しずつ更新して誤差の勾配が最小となる点を探索するアルゴリズム。
「誤差が小さくなる=予測が正確になる」と考える。

## ブースティング
複数のモデルを組み合わせてモデルを作成するアンサンブル手法の一つ。
同じ種類のモデルを直列的に組み合わせ、予測値を補正しながらモデルを学習させる。
弱学習器（予測の精度があまり高くないもの）を複数組み合わせることで強学習機（精度の高いもの）を作ることができる。

## 決定木
樹形図によってデータを分析する手法。
例えば「アイスクリームを買うかどうか」を予測する場合、

「気温が30℃以上」 => 購入するだろう
「気温が30℃未満」 => 購入しないだろう

という条件を用意し予測を行う。

# 勾配ブースティング木の特徴
- 特徴量は数値<br>
決定木の分岐を特徴量より大きいか小さいかで判断するため、特徴量は数値である必要がある。
- 欠損値を扱うことができる<br>
決定木の分岐により判断するため、欠損値の補完をしなくても使用できる。
- 変数間の相互作用が反映される<br>
分岐を繰り返すため、変数間の相互作用が反映される。
- 特徴量をスケーリングする必要がない<br>
特徴量の大小関係のみで判断するため、標準化などのスケーリングが不要。

# 勾配ブースティングの流れ
1. 目的変数の平均を計算する
1. 誤差を計算する
1. 決定木を構築する
1. アンサンブルを用いて新たな予測値を求める
1. 再び誤差を計算する
1. 3~5を繰り返す
1. 最終予測を行う

予測値と目的変数の差が次の決定木で修正されていくことで精度を上げている。

# 実装手順
今回は二値分類を行うものとする。
※JupyterNotebook上でのコード例です。


## ライブラリの読み込み
```python
import xgboost as xgb

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from matplotlib import pyplot as plt

%matplotlib inline
```

## データの読み込み
```python
df = pd.read_csv('hoge.csv')
df.head()    # 読み込みの確認
```

## 特徴量を選択する
```python
# 今回は特徴量Xから"foo"、目的変数Yから"bar"を取り除く

X = df.drop(['foo', 'bar'], axis=1)
y = df['bar']
X.head()    # 取り除けたことを確認

```

## 学習用データと評価用データの分割
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, shuffle=True)
```
test_size： 指定した割合を評価用データとして分割(0.3なら30%)
random_state： 乱数生成時のシードを指定
shuffle： データ分割時にランダムに並び替えを行うかどうか

## DMatrix形式に直す
xgboostではデータセットをDMatrix形式にする必要があります。

```python
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
```

## 学習用パラメータを設定

```python
xgb_params = {
    # 二値分類
    'objective': 'binary:logistic',
    # 評価指標loglossを仕様
    'eval_metric': 'logloss',
}
```

## モデルを学習
```python
bst = xgb.train(xgb_params,
                dtrain,
                # 学習ラウンド数
                num_boost_round=100,
                # 一定ラウンドを回しても改善が見込めない場合は学習を打ち切る
                early_stopping_rounds=10,
               )
```

## 予測の実行

```python
    y_pred = bst.predict(dtest)
```

## 精度の検証

```python
    acc = accuracy_score(y_test, y_pred)
    print('Accuracy:', acc)
```
これで精度が出力されるので、必要に応じてパラメータを調整する。

<br>
以上の流れで勾配ブースティング木での分析は可能なはずです。
本番データの分析等はここでは省略します。
その他xgboostには特徴量の重みを可視化できたりと便利な機能があるので調べてみてください。

# 参考
Python: XGBoost を使ってみる
https://blog.amedama.jp/entry/2019/01/29/235642


GBDTの仕組みと手順を図と具体例で直感的に理解する
https://www.acceluniverse.com/blog/developers/2019/12/gbdt.html

Kaggle Masterが勾配ブースティングを解説する
https://qiita.com/woody_egg/items/232e982094cd3c80b3ee

書籍：
門脇大輔、阪田隆司、保坂佳祐、平松雄司（2019）『Kaggleで勝つデータ分析の技術』技術評論社
[Python] pickleされたファイルはクロスプラットフォームなのか

# Q. pickleされたファイルはクロスプラットフォームなのか
例えば、Mac上でpickleしたファイルをWindows上に持っていきloadして使えるものなのか。

# A. クロスプラットフォーム
クロスプラットフォームかそうでないかというと、クロスプラットフォーム。
参考：https://stackoverflow.com/questions/1849523/is-pickle-file-of-python-cross-platform#:~:text=6%20Answers&text=Python's%20pickle%20is%20perfectly%20cross,and%20%22rb%22%20modes%20respectively.


また、公式ドキュメントにもあるようにpickleのフォーマットは後方互換性があるため、古いpickleを使って新しいpickleでloadすることはできる。逆はできないかもしれない。
ただし、**pickleのフォーマット**自体は後方互換性があるが、Pythonモジュールはバージョンごとに減っていたり名前が変わっていることがあるため、バージョン違いのPythonでdump/loadをするとエラーになるかもしれない。
> The pickle serialization format is guaranteed to be backwards compatible across Python releases.
> 引用元：https://docs.python.org/3.6/library/pickle.html#comparison-with-marshal
npm から取得した Node-RED をカスタマイズして起動する(1)

# 何のための記事？

Node-REDをHerokuで運用する際に、Heroku環境では一部機能が動作しない場合があった。
その際、Node-REDの実装を調査する必要があったので関連するメモを整理して投稿します。
**※本記事はHerokuと直接関係はありません**

# 1. Node-REDを自作プログラムから動かす

* Node.jsなどは予めインストールしておく。

## 1.1 導入

```sh
$ mkdir node-red-sample
$ cd node-red-sample
$ npm -y init 
$ npm install node-red
$ node ./node_modules/node-red/red.js  --userDir ./data --settings ./node_modules/node-red/settings.js
```

ブラウザで http://127.0.0.1:1880/ を開く。

## 1.2. 解説
上記の手順では、下記のオプションを指定しています。

* --userDir : 追加するノードなどが保存される場所を指定する


* --settings : 使用する設定ファイルを指定する
 
    *※デフォルトで red.js と同じフォルダに存在するsettings.jsを参照するので--settings以降は省略可能*

# 2. 設定をカスタマイズする



## 2.1 カスタマイズ方法(1) : settings.js を指定して起動

settings.js を自分用に書き換えてred.jsの起動パラメータに渡す事で、好みの設定で起動するように変更できます。

package.json と同じフォルダに settings.js をコピーする。

```shell
$ cp ./node_modules/node-red/settings.js ./
```

settings.js を書き換えたら下記のようにコマンドを入力して起動する。

```
$ node ./node_modules/node-red/red.js --userDir ./data --settings ./settings.js
```

## 2.2 カスタマイズ方法(2) : settings.js を userDir に入れておく


```shell
$ mkdir data
$ cp ./node_modules/node-red/settings.js ./data/
```
settings.js を書き換えたら下記のようにコマンドを入力して起動する。

```
$ node ./node_modules/node-red/red.js --userDir ./data
```

# 3. エントリーポイント(?)を変更する

エントリーポイントを `./node_modules/node-red/red.js` ではなく、独自のファイルにする方法。

```shell
$ cp node_modules/node-red/red.js ./main.js
```

コピーして作成した main.js を一部修正する。

```diff
- var RED = require("./lib/red.js");
+ var RED = require("node-red");
```

書き換えたら起動する。

```
$ node main.js --userDir ./data
```

# まとめ

これでローカルでのデバッグできる環境は整いました。

**次の記事 → [npm から取得した Node-RED をカスタマイズして起動する(2)](https://qiita.com/eurogrve/items/189b850a870087b533f9)**
条件によりf.radio_buttonにdisabledオプションを付与したい

Ruby 2.6.5
Rails 5.2.0
地図上からユーザーの投稿を検索できる機能を持ったアプリを開発しています。

ユーザーがログインしていない時にform_with内の一部のradio_buttonを無効化したかったのですが、
当初は下記のような感じで条件式を書いていました。

```erb:index.html.erb

<%= form_with url: map_request_path, method: :get do |f| %>
  <%= f.radio_button :posts, "all_user", checked: true %>全てのユーザーの投稿
  <% if logged_in? %>
    <%= f.radio_button :posts, "following", disabled: false %>自分とフォロー中のユーザーの投稿
    <%= f.radio_button :posts, "current_user", disabled: false %>自分の投稿
  <% else %>
    <%= f.radio_button :posts, "following", disabled: true %>自分とフォロー中のユーザーの投稿
    <%= f.radio_button :posts, "current_user", disabled: true %>自分の投稿
  <% end %>
  <%= f.submit '投稿されたお店を表示', class: "btn btn-primary" %>
<% end %>

<div id="map_index"></div>
<script>
  ~
  ~
  ~
  initMap();
</script>
```

if logged_in? で 条件により disabled: の箇所を操作していたのですが、冗長なコードとなっていました。
一行でどうにかしたかったので調べてみた結果、下記のようにすることでスッキリしました。

```erb:index.html.erb

<%= form_with url: map_request_path, method: :get do |f| %>
  <%= f.radio_button :posts, "all_user", checked: true %>全てのユーザーの投稿
  <%= f.radio_button :posts, "following", disabled: current_user.nil? %>自分とフォロー中のユーザーの投稿
  <%= f.radio_button :posts, "current_user", disabled: current_user.nil? %>自分の投稿
  <%= f.submit '投稿されたお店を表示', class: "btn btn-primary" %>
<% end %>

<div id="map_index"></div>
<script>
  ~
  ~
  ~
  initMap();
</script>
```

disabled: current_user.nil? と書き、
current_user が空かどうか (ログインしているかどうか)の真偽値を disabled: の箇所に持ってくることができました。

ログインしていない時
![スクリーンショット 2020-09-20 17.07.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589400/1fbcbb8b-97dc-6397-1dc5-63654c877553.jpeg)

ログインしている時
![スクリーンショット 2020-09-20 17.07.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589400/9e038c56-8788-c741-5946-401f32240c05.jpeg)


#### 参考にさせていただきました
[条件によりtext_fieldにreadonlyオプションを付与したい](https://teratail.com/questions/169215)
wslのデフォルトバージョンをwsl2にしようとするとカーネルコンポーネントの更新が必要といわれる


この記事を参考にwsl2を入れていたが、wsl_update_x64.msiをダウンロードするページに行っても、ダウンロードできなかった。
https://qiita.com/tomokei5634/items/27504849bb4353d8fef8
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package

日本語のページではなくて、英語のページにあった。

https://docs.microsoft.com/en-us/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package
![コメント 2020-09-20 170856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102172/6bca0c3a-cf17-488a-6bce-f6bff5a3ff8c.png)

# 参考
https://twitter.com/Masahito/status/1307217634446909441
VPSサーバ上でTensorFlow2を動かす

#準備

* さくらVPS
* Python 3.6.0
* TensorFlow 2.3.0
* Apache2

Flaskを本番環境で使う準備については下記を参照してください。
[Apache2+WSGI+Flaskを動かす
](https://qiita.com/Riskchan/items/e799adedcf683f352873)

#TensorFlowのインストール
pipのアップデート

```
$ pip3 install --upgrade pip
```

TensorFlowのインストール

```
python3 -m pip install tensorflow
```

確認

```
$ python3 -c "import tensorflow as tf; print( tf.__version__ )"
```
この記事を執筆時点では2.3.0が帰ってくる。

#参考にしたサイト

* [UbuntuにTensorFlowをインストールする【機械学習システム公開のため】](https://self-development.info/ubuntu%E3%81%ABtensorflow%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%80%90%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%85%AC/)
UNIXコマンドとPowerShell

#はじめに
普段はMicrosoft大好きインフラエンジニアとして働いてるので、コマンド＝Powershell(or コマンドプロンプト)になりました。（社会人2年目ですがLinuxは見たことしかないです。。。やべえ。。。）
unixコマンドを勉強する機会があったので、普段仕事で使っているPowerShellのコマンドと対応付けました。

しかし、超超超初心者なため、UNIXコマンドは超超超基本的なものしか書いていません。（めっちゃ自分用）
勉強していて追加で覚えたら追加するかも？

#コマンド対応表
| UNIXコマンド | PowerShellコマンド | 補足・備考 |
|:-----------|------------:|:------------:|
| Touch | New-Item -ItemType File | -ItemTypeを省略してもデフォルトがFile |
| Cat | Get-Content |  |
| mkdir | New-Item -ItemType Directory |  |
| cd | cd | 上の階層→ cd .. <br> ホーム→ cd |
| pwd | Convert-Path |  |
| ls | Get-Childitem |  |
| mv(アイテム移動) | Move-Item <移動するアイテムのパス> <br>-Destination <移動先パス> |  |
| mv(アイテム名変更) | Rename-Item <br> -Path <変更するアイテムのパス> <br> -NewName <新ファイル名> |  |
| cp | Copy-Item <br> -Path <コピーしたいアイテムのパス> <br> -Destination <コピーしたアイテムの配置先> |  |
| rm | Remove-Item <br> -Path <削除したいアイテムのパス> |  |

#思ったこと適当に
・やっぱPowerShellの方が言葉を書いてる感あってわかりやすいかも（unixコマンドも勉強していけばそうでもないのかな）
【初心者でもわかる】ラジオボタンのデザインを変更して、好きなアイコンにしてしまう

# どうも、7noteです。ラジオボタンのデザインを変更して、オシャレなアイコンに変えてしまう方法を紹介

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/radiobutton/
ROI(Return on Investment，投下資本利益率)、EVA(Economic Value Added,経済的付加価値)、IRR(Internal Rate of Return,内部利益率)、NPV(Net Present Value,正味現在価値)

応用情報技術者平成29年春期 午前61


情報戦略の投資対効果を評価するとき，利益額を分子に，投資額を分母にして算出するものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2bcf5fba-ba97-4169-7085-e28cdadf3e40.png)


１、ROI(Return on Investment，投下資本利益率)は、
投資額に対してどれだけ経常利益を生み出しているかを見る尺度です。以下の公式で算出されます。
　ROI(%)＝(当期経常利益÷投下資本)×100
　ROIが高いほど稼ぐ力が強いということになります。

２、
・EVA
⇒Economic Value Addedの略で経済的付加価値のこと。企業が一定期間に生み出した経済的価値を評価する指標のひとつです。
　EVA＝税引後営業利益－投下資本×資本コスト（率）
   　＝NOPAT（税引後営業利益）－資本コスト額

・IRR
⇒Internal Rate of Returnの略。内部利益率を表します。

・NPV
⇒Net Present Valueの略。正味現在価値を表します。

参照：
https://www.ap-siken.com/kakomon/29_haru/q61.html

 EVA（経済的付加価値）
https://ontrack.co.jp/f-terms/eva/
アクセスコントロール機能


応用情報技術者平成29年春期 午前60

識別コード及びパスワードによるアクセスコントロール機能を情報システムに組み込むことによって，コントロール可能なリスクはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/10269a37-1bc1-496f-ff3b-30b8fab97fe3.png)


１、情報システムにアクセス制御機能を組み込むことによって、
・データに対して権限がある者とない者を区別し、
・正当な利用者のみにファイルへのアクセス権限を与えること
ができます。

これによって、
　・外部からの不正アクセス
　・および内部不正によって、ファイルが改ざんされたりデータの破壊
がされたりするリスクを低減することができます。

言い方としては、下記のは理解しやいかもしれません：
ユーザIDとパスワードで情報システムにログインするのコントロールにより、何のリスクを予防できる？

２、
・通信上のデータの盗聴
⇒通信経路上の盗聴にはデータの暗号化が対策となります。

・データの入力エラー
⇒利用者の入力エラーにはシステムに入力チェックを組み込むことが対策となります。

・ハードウェアの物理的な破壊
⇒物理的な破壊へはサーバ室への入退室管理などが対策となります。


参照：
https://www.ap-siken.com/kakomon/29_haru/q60.html
ubuntuでpythonアプデ時

ubuntuにて、python3.8にupdate

```
sudo apt update
sudo apt install python3.8
```

update後、ubuntuを再起動させる。

```
sudo reboot
```

すると、以下のエラーが出た('ω')

```
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.
```

Ubuntuにおいて、shutdownコマンドやrebootコマンドはサポートされていない(?)
なので、コマンドプロンプトからWSLを停止させる。

まずUbuntuのバージョン確認する

```
cat /etc/issue
```

その後、コマンドプロンプトで以下を実行

```
wsl -t Ubuntu XXXXX(バージョン)
```
fishでPATH通す


メモ

zsh等だと、 ` export PATH="$PATH:[PATH_TO_FLUTTER_GIT_DIRECTORY]/flutter/bin"` とかを.zshrcファイルとかに書くところをconfig.fishに下記の様に書く。

```
$ vim ~/.config/fish/config.fish
set -x PATH ~/[PATH_TO_FLUTTER_GIT_DIRECTORY]/flutter/bin $PATH
```