OmniAICreator/Qiita-1.07M huggingface dataset:
python 勉強 複数ファイルの読込と日付の曜日表示

#やりたいこと
１ファイルのみを集計対象として読み込んでいたが、
同じ形のデータが結構な日数分あるので同時に読み込んでしまいたい

#試したこと
#####1.対象ファイルをワイルドカードで指定して読み込み
#####2.日付から曜日を求めて曜日で集計

#1.対象ファイルをワイルドカードで指定して読み込み
globを使用。

<pre>
csv_files = glob.glob(r'インプットファイルがあるフォルダ\*.csv')
list = []

for f in csv_files:
    list.append(pd.read_csv(f, index_col=0).drop(['企業コード','企業名称','店舗コード','店舗名称','支払番号','返金番号'], axis=1))
df = pd.concat(list)
</pre>

csvファイルの読み込みは記載した感じ。
ただ、読み込みする際に前回同様に要らない項目もあるのでdropでできるのかわからなかったが、
やってみたらできた。

できた図はあまりにもみづらい。
そもそも私があまりプロットの知識がないので横に伸びず、下辺の文字がつぶれて見れない。。。


#2.日付から曜日を求めて曜日で集計

<pre>
def get_week(dt):
	w_list = ['月', '火', '水', '木', '金', '土', '日']
	return(w_list[dt.weekday()])
</pre>

なんて関数を用意したけど、うまく利用できていない。。。

あと、もともとのデータの日付が「"YYYY-MM-DD HH:MM:SS"」って形式だったので、
「"」を区切りにした1個目取得、「 （半角スペース）」を区切りにした1個目取得、さらに「to_datetime」に入れて形式変えて、
と面倒くさいにも程がある事この上ないったらありゃしない。
文字列から曜日算出できないかな。。。
もうちょっと模索が必要。。。

あと、できた図は曜日が「月→日」じゃくてアルファベット順の並びだった。
修正が必要。
【Git】コミットハッシュからコミット日時・内容等を取得する

以下でできます。

```bash
git show ${コミットハッシュ}
```

```bash:実行例
$ git show bf79a4685551a67b9231bfc7d5335cbed414c238
commit bf79a4685551a67b9231bfc7d5335cbed414c238
Author: ~~ 省略 ~~
Date:   Sat Aug 17 20:53:58 2019 +0900

    fugaコミット
    
    fuca

diff --git a/README.md b/README.md
index 0ef7e93..1a57997 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
+hoge
+fuga
 piyo
```

# 参考にさせて頂いた記事
- [gitのコミット指定方法\(ハッシュ値、HEAD、HEAD~\)を理解して、コマンドを有効活用しよう！ \- Qiita](https://qiita.com/developer-kikikaikai/items/e62c912702a28ab07360)
xrdpではまる。X Server -- no display in range is available. xrdp_mm_process_login_response: login failed

# WSLでwindows上にKALI LinuxのGUI環境を作ったところ、xrdpではまりました。

GUI環境のセットアップは無事完了し動作確認もできました。
翌日に利用したところログインできません。

```
no display in range is available.
xrdp_mm_process_login_response: login failed
```
もしやのUser/Passの物忘れかと思い、何度も試しましたが一向にログインできません。
**syslog**を確認したところ、どうも原因はディスプレイに必要なセッションレンジに空きが無いようです。

```
[20191001-00:00:00] [INFO ] starting Xorg session...
[20191001-00:00:00] [ERROR] X server -- no display in range is available
```

**xrdp**の設定ファイルをのぞいてみます。
切断されたセッションを強制終了する**KillDisconnected**が**false**になっていたので、これではゾンビセッションが増え続けそうです。パラメータを**false**から**true**に変更します。
更にセッションが足りないため、**MaxSessions**を**50**から**100**に増やしました。

```
sudo vi /etc/xrdp/sesmain.ini

[Sessions]
;; X11DisplayOffset - x11 display number offset
; Type: integer
; Default: 10
X11DisplayOffset=10

;; MaxSessions - maximum number of connections to an xrdp server
; Type: integer
; Default: 0
MaxSessions=100

;; KillDisconnected - kill disconnected sessions
; Type: boolean
; Default: false
; if 1, true, or yes, kill session after 60 seconds
KillDisconnected=true

;; DisconnectedTimeLimit - when to kill idle sessions
; Type: integer
; Default: 0
; if not zero, the seconds before a disconnected session is killed
; min 60 seconds
DisconnectedTimeLimit=0
```

xrdpを再起動します。

```
$ sudo /etc/init.d/xrdp restart
```

無事接続できました。
東京公共交通オープンデータを使ってレアな行き先を調べよう

# 東京公共交通オープンデータを使ってみた

東京公共交通オープンデータっていろんなデータが取れることがわかった
試しにJRの行き先一覧を時刻表から取得してみる

[東京公共交通オープンデータチャレンジ](https://tokyochallenge.odpt.org/)
[開発者サイト](https://developer-tokyochallenge.odpt.org/ja/)
[JR東日本 駅時刻表 / Station timetable of JR East](https://ckan-tokyochallenge.odpt.org/dataset/r_station_timetable-jreast)

railsでさらっと書いてみた

- Controller抜粋

```

# HttpClientを生成
http_client = HTTPClient.new
# APIからJRの時刻表を全部取る
response = http_client.get ”https://api-tokyochallenge.odpt.org/api/v4/odpt:StationTimetable”,
{"odpt:operator"=>"odpt.Operator:JR-East",
	"acl:consumerKey"=>開発者サイトで取得したアクセストークン}
	hash = JSON.parse(response.body)

@station_list = []
# 駅毎のデータなので毎に繰り返す
hash.each do | h |
	# 駅データの中に時刻表のデータがあるのでデータ分繰り返す
	h["odpt:stationTimetableObject"].each do | timetable |
		# 時刻表データの行き先毎に繰り返し、行き先を配列に入れる
		timetable["odpt:destinationStation"].each do | destStation |
				@station_list << destStation
		end
	end
end
# 配列のデータを駅毎にまとめてカウントする
@station_list = @station_list.group_by(&:itself).map{ |key,value| [key, value.count] }
# 駅名でソート
@station_list.sort!
		
```

- view抜粋

```
<table border=1>
  <th>行き先</th><th>本数</th>
  <tbody>
    <% @station_list.each do |station| %>
      <tr>
        <td><%= station[0] %></td>
        <td><%= station[1] %></td>
      </tr>
      <% end %>
</table>

```

ブラウザでアクセスすると以下のように出力される

![スクリーンショット 2019-10-01 14.13.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17843/488b9590-c3cc-4232-ebb4-7917cd43ca07.png)

行き先の日本語化は別途やろう
OCI DatabaseでのRACの作り方

* データベース作成時に「合計ノード数」を「2」にする。以上。
  * エディションが自動的にExtreme performanceになる
  * OCI-Cのように明示的にRACを選択するのではない

オンプレでの煩雑なインストール手順に比べ、圧倒的に楽です。
Webプロ コマンドまとめ

# 用語
|        用語        |                                                                        解説                                                                       |
|:------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------:|
| ディレクトリ       | ほぼ「フォルダ」と同じ意味（厳密には違う）                                                                                                        |
| ホームディレクトリ | パソコンに入っているアカウントごとに用意されているディレクトリ 基本的に作ったファイルはここの中に保存する（ワードやエクセルなどのファイルもそう） |

# ディレクトリ表示
- lsとはlistの略
- 自分が今いるディレクトリの一つ下にあるディレクトリの一覧が表示される

MacかLinuxなら

```shell:ターミナル
ls
```
Windowsなら

```shell:コマンドプロンプト
dir
```


# ディレクトリ移動
- cdとはchange directoryの略
- {ディレクトリ名}のディレクトリに移動
- {ディレクトリ名}は``ls``あるいは``dir``のコマンドを打ったときに出てくるディレクトリを入れる
  

```shell:ターミナルorコマンドプロンプト
cd {ディレクトリ名}

# 例
cd php7
cd Desktop 
```

- 一つ上のディレクトリに移動

```shell:ターミナルorコマンドプロンプト
cd ..
```

- ホームディレクトリに移動（次の2つのうちどちらでも良い）

```shell:ターミナルorコマンドプロンプト
cd 
cd ~
```




# サーバー起動

- PHPでサーバーを起動
- 起動後にlocalhost:{数字}にアクセスするとアクセスできる
- {ディレクトリ名}は``ls``のコマンドを打ったときに出てくるディレクトリを入れる
- 大文字と小文字を打ち間違えるとうまく起動しない

```shell:ターミナルorコマンドプロンプト
php -S localhost:{数字} -t {ディレクトリ名}

# 例
php -S localhost:8080 -t htdocs
```
【SQL Server】OracleのMINUS演算子に変わるEXCEPT演算子

# SQLServerでSELECTの差を取得する。
tableAとtableBがあり、tableAのみに存在するレコード（行）を抽出したいときに使用する。
差集合なので、A - B のベン図を想像すれば分かりやすい。
（AかつBでない）

```sql
SELECT * FROM tableA
EXCEPT
SELECT * FROM tableB
```
tableAのクエリにあって、tableBのクエリにない個別の値が返される。

反対にすれば、、、

```sql
SELECT * FROM tableB
EXCEPT
SELECT * FROM tableA
```

tableBのクエリにあって、tableAのクエリにない個別の値が返される。


結果の並び順を指定したい場合は ORDER BY 句を最後に指定する。
カラム名は左のクエリを指定する。

```sql
SELECT tableID
      ,tableName
FROM tableB
EXCEPT
SELECT tableID
      ,tableName
FROM tableA
ORDER BY tableID ASC;
```

## 注意点
1.それぞれのクエリの列は同じ数でなければならない。
2.順番も一致していなければならない。
3.データ型が一致していなければならい。
4.暗黙に同じ型に変換可能であること。
Link to a record detail page from a Lightning Component

I have a Lightning Component in my Home page that filter a list of feedItem. On the body I have a link to the list on the group that works perfectly.

繰り返す項目付けリンクの作成：

![2019-10-01_141748.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/a1d69d91-0288-fd97-fe1e-06124a5b4242.png)
Rails 部分テンプレート

# 部分テンプレート
+ 同じHTML構造の部分を共通化することによって、無駄なくビューファイルを作成する。
+ 部分テンプレートのファイル名は必ずアンダーバー「_」から始まる。

# (例)
```ruby:tweets/index.html.erb
 <div class="contents row">
  <% @tweets.each do |tweet| %>
    <div class="content_post" style="background-image: url(<%= tweet.image %>);">  
             #--------------ここから--------------
      <div class="more">
        <span><%= image_tag 'arrow_top.png' %></span>
        <ul class="more_list">
          <li>
            <%= link_to "詳細", tweet_path(tweet.id), method: :get %>
          </li>
          <% if user_signed_in? && current_user.id == tweet.user_id %>
            <li>
              <%= link_to '編集', "/tweets/#{tweet.id}/edit", method: :get %>
            </li>
            <li>
              <%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %>
            </li>
          <% end %>
        </ul>
      </div>
      <%= simple_format(tweet.text) %>
      <span class="name">
        <a href="/users/<%= tweet.user_id %>">
          <span>投稿者</span><%= tweet.user.nickname %>
        </a>
      </span>
    </div>  
              #----------------ここまでを切り取り----------------------
  <% end %>
  <%= paginate(@tweets) %>
</div>
```
# _tweet_html.erbを作成して切り取った部分を貼り付け
```ruby:tweets/_tweet.html.erb
<div class="content_post" style="background-image: url(<%= tweet.image %>);">
  <div class="more">
    <span><%= image_tag 'arrow_top.png' %></span>
    <ul class="more_list">
      <li>
        <%= link_to "詳細", tweet_path(tweet.id), method: :get %>
      </li>
      <% if user_signed_in? && current_user.id == tweet.user_id %>
        <li>
          <%= link_to '編集', "/tweets/#{tweet.id}/edit", method: :get %>
        </li>
        <li>
          <%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %>
        </li>
      <% end %>
    </ul>
  </div>
  <%= simple_format(tweet.text) %>
  <span class="name">
    <a href="/users/<%= tweet.user_id %>">
      <span>投稿者</span><%= tweet.user.nickname %>
    </a>
  </span>
</div>
```
# index.html.erbを以下のように編集
```ruby:tweets/index.html.erb
<div class="contents row">
  <% @tweets.each do |tweet| %>
    <%= render partial: "tweet", locals: { tweet: tweet } %> #
  <% end %>
  <%= paginate(@tweets) %>
</div>
```
ここでのrenderメソッドのlocalsオプションに注目してみると```{ tweet: tweet }``` の右側の ```tweet``` は__eachメソッド__内の変数としての```tweet```で```tweet```のインスタンスを示している。一方、左側の tweet は部分テンプレート内での変数の名前を表している。
### おしまい
【体験記】Java SE 8 Silverに合格しました

9/21に合格したので忘れないうちに体験記を書き残しておきます。

**試験結果:**
勉強期間: 約4週間
得点率:88%(合格ライン65%)

##受けた理由
現在通っている職業訓練校が実施している企業説明会にて、「就職活動をするにあたって持っておいた方がいい資格はなんですか？」と質問すると、どの企業も口を揃えて**「JavaSilverを取っているとそれだけで一段抜ける」**~~「あと基本情報技術者試験も」~~との事だったので、同期から一段抜ける為取得する事に決めました。

###受けると決めた時のJava知識
* Java言語を使用したSES経験あり(研修期間含め4か月で辞める)(現場経験0)(ダメ人間)
* なんかStrutsとかSpringとかあるんだよね～、DI？なにそれ？
* 継承、ポリモーフィズム、カプセル化は知ってるつもり、ただポリモーフィズムは実装出来る気がしない。
* String型がInt型やLong形となんか違うみたいなのは覚えてるとかその程度。
* ラムダ式？使いたいけど全然分からない…。

##勉強方法
恥ずかしながらこれまでまともに勉強をしたことがなかったので、ネットで色々調べた結果、「黒本買って3週くらい問題解いたらいいんだ:smile:」と結論付けて実行することに。

[徹底攻略 Java SE 8 Silver 問題集[1Z0-808]](https://www.amazon.co.jp/dp/4844339931/ref=cm_sw_r_tw_dp_U_x_luSKDbDX4XBX3 "黒本")(通称"黒本")

8/25、黒本がAmazonから届き、慣れていない資格勉強が始まりました。
勉強期間の間は、自宅にて1日1~3章解くことに集中し、1週間の終わりに1度模擬Aを解く。
これを3回繰り返しました。(電車内勉強チャレンジもしてみたのですが、集中できなかったので1回でやめました)

**模擬Aの点数**

* 1週目模擬A:45/77
1週目の時は色んなところからボコボコにされて、「自分はJavaのことを知ってるようで全く知ってなかったんだなぁ」と思い知らされてしまいました。
若干凹みつつ、1週目に理解出来なかった問題を解けるように注目しながら2週目に取り掛かりました。

* 2週目模擬A:57/77
あまり点数は伸びませんでしたが、苦手だった問題が解けていたので「このまま勉強してればいけるのでは？」となんとなーく思っていました。
若干喜びつつ、今度は全体的な復習を意識しながら3週目に取り掛かりました。

* 3週目模擬A:65/77
凄くいけるような気がしてきたので、ここで1週間後に受験申し込みをすることに。
面倒な申し込みをクリアしつつ、残り1週間はとにかく模擬A・Bを解きまくることに専念していました。

**最終的な模擬の点数**
* 4週目模擬A:69/77
* 模擬B:65/77

根拠はありませんが、もう行ける気しかしません。(のんき)

##試験当日
張り切りすぎて開始1時間前に試験会場に到着し、近くのドトールで30分ずっと黒本とにらめっこしていました。
30分前に試験会場に入り、受付を済まし顔写真を撮られ、椅子に座って待っていました、この時の気分は処刑を待つ受刑者でした、怖かった。

肝心な試験の内容は、噂通り黒本模擬A・Bの問題と酷似したものが多数を占めていました。

試験終了後、10分で結果がメールで届きました。
得点率:88%(合格ライン65%)で合格でした、まさかのガッツポーズが出ました。

###間違えた内容

* superとthisを使用したコンストラクタのアクセス
* whileループについて
* コンストラクタの作成およびオーバーロード
* 多態性の使用方法
* 文字列の作成と操作

今見ても理解は出来ているので、結構凡ミスが多かったようです。
これを見ているJava Silverを受験する方は注意してくださいね(?)

#まとめ
結局、一番ネックなのは受験料でした。26,600円はつらい…:sob:
しかし、自分みたいなJava歴1年未満でも3週間勉強していれば取れるくらいなので、お金に余裕がある方は是非取ることをお勧めします、特にJavaを覚えて就職活動をする予定の方は特にお勧めします。
次の目標は基本情報技術者試験です、ｶﾞﾝﾊﾞﾙｿﾞｰ。
LPIC 101：Linuxパッケージ管理ツールコマンドに関するTips

Linuxにはパッケージ管理ツールというものが複数あり、LPIC 101試験ではその主要ないくつかのものについて学ぶ必要があるが、とにかくわかりにくい。同じような機能のオプションなどが異なる表記だったり、逆に同じ表記なのに微妙に／大きく異る機能だったりする。
このエントリでは、少しでも覚えやすくするために、個人的に2,3の似たような機能やサブコマンドを整理したい。
なお、メインのコマンドに続けて指定する要素は、dpkgでは「アクション」、rpmでは「オプション・併用オプション」、apt系・yum・zypperでは「サブコマンド」と呼ばれるが、面倒なので全部「サブコマンド」と呼ぶが、dpkgとrpmに関しては本来このような呼び方をしないので注意されたい。
また、yumの後継者的位置づけであるdnfについては、LPIC 101範囲では詳しく問われず、yumとほぼ同じであるため、割愛する。


##パッケージ更新関係
パッケージを更新するサブコマンドをコマンドごとに一覧にしてみた。同時に、リポジトリ情報の更新サブコマンドについても表にした。

|サブコマンド＼機能|パッケージ更新                |リポジトリ更新|
|:-----------------|:-----------------------------|:-------------|
|dpkg              |-i(--install) *1              |なし          |
|apt               |upgrade                       |update        |
|rpm               |-U(--upgrade)/-F(--freshen) *2|なし          |
|yum               |update                        |なし          |
|zypper            |update                        |freshen       |
*1 新しいバージョンを指定してインストールする
*2 -Uは対象が存在しなければインストール、-Fは存在しなくてもインストールしない


##listサブコマンド
listという言葉を含むサブコマンドがたくさんあり、何をするのかがコマンドごとに異なっていてわかりづらいものを、コマンドごとに一覧にした。
またrpmコマンドの併用オプションにはファイルを一覧表示するものが複数あるため、それも示した。

|コマンド			|機能							|
|:--				|:--							|
|dpkg -l(--list)		|インストール済パッケージを検索・表示			|
|dpkg -L(--listfiles)		|指定パッケージからインストールされたファイルを一覧表示	|
|apt list			|パッケージを一覧表示					|
|rpm -q -l(--list)		|指定パッケージに含まれるファイルの一覧表示		|
|rpm -q -c(--configfiles)	|設定ファイルのみを一覧表示				|
|rpm -q -d(--docfiles)		|ドキュメントファイルのみを一覧表示			|
|yum list			|全パッケージ情報の一覧表示				|


##パッケージ情報表示サブコマンド
パッケージの情報を表示するサブコマンドは、コマンドごとに異なる表記。

|コマンド					|サブコマンド			|
|:--						|:--				|
|dpkg						|-s(--status)			|
|apt-cache					|show, showpkg			|
|apt						|show				|
|rpm（インストール／アップグレードモード）		|-v				|
|rpm（照会モード）				|-i(--info)			|
|yum						|info				|
|zypper						|info				|


##その他
- yum check-updateとzypper list-updates(lu)は同じようなコマンド（前者は単数形、後者は複数形なことに注意）
- searchはdpkgだけ他と異なり、検索したファイルがどのパッケージからインストールされたかを表示する

####主要参照文献
- 中島能和著、濵野賢一朗監修『Linux教科書 LPICレベル1 Version5.0対応』（翔泳社、2019年）
Unityで解像度を変更した後、UIをInstantiateした際にサイズが変化する

##問題
UnityのGameシーンでは、解像度を自由に変更することが可能です。元々1920×1080で運用していたゲームを、複数解像度における調整のため3840×2160にしたところ、UIのサイズが半分になってインスタンス化されてしまいました。

##原因
Canvas Scalerにおいて、`UI Scale ModeをScale With Screen Size`に`Reference ResolitionをX1920, Y1080`にしていた。そのため、解像度を縦横2倍にした際に、キャンバス自体の大きさ(RectTransform.Scale)も2倍になっていたため。

##対処法
Instantiateした後、SetParentする際の第二引数にfalseを渡す。
デフォルトではtrueが渡されており、ワールド座標における位置サイズに変更されてしまう。falseを渡すと、ローカル座標での位置サイズにしてくれる。

[Transform.SetParent](https://docs.unity3d.com/ja/current/ScriptReference/Transform.SetParent.html)
61日目 Flexboxが使えるようになりました！

Progateにflexbox編が追加されていたのでやってみました。
PC、タブレット、スマホと画面サイズが異なる場合に
自動的にサイズを変えられるボックスみたいです。

使い方
###flexにしたい要素を適当なタグでかこむ。

```html
<ul class="flex-list">
  <li class="li1">item1</li>
  <li class="li2">item2</li>
  <li class="li3">item3</li>
  <li class="li4">item4</li>
</ul>
```

###CSSでflexを使うと宣言する。
```css
.flex-list {
  display: flex;
}
.flex-list li {
  flex: auto;
}
```

###タブレットの設定をする。
####例）画面サイズが1000px以下だったら、次のCSSを実行
```css
@media (max-width: 1000px) {
  .flex-list {
    flex-wrap: wrap;
  }
  .flex-list li {
    width: 50%;
  }
}
```

###スマホの設定をする
####例）画面サイズが670px以下の場合
```
@media (max-width:670px) {
  .flex-list {
    flex-direction:column;
  }
  
  .flex-list li {
    margin:0 auto;
  }
}
```

なるほど、こうやってレスポンシブサイトを作っているのですね。
面白かったです。
（所要時間 21分）
Windowsのネットワーク切り替えバッチを作ってみた

複数のマシンを管理していると、クライアントのIPアドレスやDNSサーバのアドレスを**DHCP**で配布すると思うが、必ずしもすべての事業所で対応できていないケースがある。
設置場所固定が前提のデスクトップPCであれば支障ないが、ノートPCを複数の拠点で使いまわす場合、接続するLANが変わるたびに設定（下図画面）を変えるのは些か煩雑であった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/b7cc9617-f724-9f40-ac1e-56899d7ade34.png)
そこで、IPv4のネットワーク設定を切り替えるバッチを作成した。

```bash:switch_network.bat
@echo off
echo 1：東京本社
echo 2：名古屋ビジネスセンター
echo 3：大阪事業所
echo.
choice /C:123 /M:どのネットワークに接続しますか
echo.

set NAME=イーサネット

if %ERRORLEVEL% equ 1 (
  netsh interface ipv4 set address "%NAME%" dhcp
  netsh interface ipv4 set dns "%NAME%" dhcp
  echo 東京本社に切り替えました！
) else if %ERRORLEVEL% equ 2 (
  netsh interface ipv4 set address "%NAME%" static <IPアドレス> <サブネットマスク> <デフォルトGW>
  netsh interface ipv4 set dns "%NAME%" static <優先DNS> primary
  netsh interface ipv4 add dns "%NAME%" <代替DNS>
  echo 名古屋ビジネスセンターに切り替えました！
) else if %ERRORLEVEL% equ 3 (
  netsh interface ipv4 set address "%NAME%" static <IPアドレス> <サブネットマスク> <デフォルトGW>
  netsh interface ipv4 set dns "%NAME%" static <優先DNS> primary
  netsh interface ipv4 add dns "%NAME%" <代替DNS>
  echo 大阪事業所に切り替えました！
)

ipconfig /all
pause
```

この例では「東京本社のみDHCP」「他拠点は固定IP」としている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/7d2e1efc-9516-6ec0-aa61-6897002ee428.png)
管理者権限を必要とするので、一般ユーザで運用するなら`runas`で昇格するラッパーバッチも用意しよう。

```wrapper.bat
cd %~d0%~p0
runas.exe /noprofile /savecred /user:<ドメイン名>\<管理者アカウント名> "switch_network.bat"
pause
```

初回だけ管理者にパスワードを入力してもらえば良い。パスワードは**資格情報**に保存されるので２回目以降は聞いてこない。
ただし、`runas`の仕掛けはセキュリティホールになり得るので、バッチファイルのパーミッションを適切に設定し、書き替えられないような「ひと手間」は加えるべきだろう。
Android studio－Fragmentに関して

Fragmentに関して昔の教則動画を見たら、またいろいろと更新されたようで、ここで記録しておきます。

#Import fragment package　

```java

package com.example.fragment;

import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TopSectionFragment extends Fragment{

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //convert xml file to View object; parent=parameter ViewGroup container of the method
        //you can use layoutInflater directly with the parameter of inflater
        View view=inflater.inflate(R.layout.top_section_fragment,container,false);
        return super.onCreateView(inflater, container, savedInstanceState);
    }
}
```


まずFragmentのインポートルートは上記になりました。
Androidxに移転したSupport系のパッケージはこちらのリンクで調べてみてください。
https://developer.android.com/jetpack/androidx/migrate/artifact-mappings

Androidxへの乗り換えに関しました。下記リンクで説明が見られます。
https://developer.android.com/jetpack/androidx/migrate

#FragmentをActvityでpreviewしたい場合
Android studio　3.x verから直接Fragmentをプレビューできなくなったようで、
Actvityのxmlにtools:layout=を入れないといけません。

```html

 <!--adding tools:layout=@layout/fragmentXmlFileName to preview the fragment-->

    <fragment
        android:id="@+id/fragment3"
        android:name="com.example.fragment.TopSectionFragment"
        android:layout_width="350dp"
        android:layout_height="200dp"
        android:layout_marginStart="28dp"
        android:layout_marginTop="16dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout="@layout/top_section_fragment" />
```
以上は覚書です。
flutter build iosの難読化に失敗する

# コメントで教えていただきました。

こちらの方法で難読化してください。
https://flutter.dev/docs/deployment/obfuscate

@shinriyo さんありがとうございます！

### 上記の方法の注意点

どうやら`--build-number`を指定する場合

```
$ flutter build ios --obfuscate --split-debug-info=<dir> --build-number=2
```
だと大量にエラーが出てしまいます。
なので

```
$ flutter build ios --build-number=2 --obfuscate --split-debug-info=<dir>
```
このように`--build-number`指定を先にしてあげたほうが良さそうです。
ここで数時間つまづきました...。

以下に以前のバージョンの情報は残しておきます。

# 以下の情報は古いです。

個人的メモです。

[https://github.com/flutter/flutter/wiki/Obfuscating-Dart-Code](https://github.com/flutter/flutter/wiki/Obfuscating-Dart-Code)
まずこのページをみると難読化の方法が書いてある。

### が、build aotってどこや。

`xcode_backend.sh`を開く。
で、だいたい180行目ぐらいのところに`build aot`が出てくる。ここや。
わからなければ、エディタかなんか使って検索する。
その一番下に追加する。

```
...
      ${local_engine_flag}                                                  \
      ${bitcode_flag}                                                       \
      ${extra_gen_snapshot_options_or_none}
```
こんな感じ。`bitcode_flag`の行の最後の`\`を忘れると`No such file or directoryとかcommand not found`とか言われるので注意。

あと、`extra_gen_snapshot_options_or_none`は変数なので`build aot`の前に

```
...
local extra_gen_snapshot_options_or_none=""
if [[ -n "$EXTRA_GEN_SNAPSHOT_OPTIONS" ]]; then
  extra_gen_snapshot_options_or_none="--extra-gen-snapshot-options=$EXTRA_GEN_SNAPSHOT_OPTIONS"
fi

RunCommand "${FLUTTER_ROOT}/bin/flutter" --suppress-analytics           \
  ${verbose_flag}                                                       \
  build aot                                                             \
...
```
こちらをお忘れなく。


### 難読化後も読めるように

`Release.xcconfig`には

```
EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate
```
だけでなく

```
EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate,--save-obfuscation-map=build/ios_dart_symbols_${FLUTTER_BUILD_NUMBER}.json
```
と書く。

これはありがたい記事がこちらにあります。ありがとうございます。
[https://qiita.com/waytoa/items/afea190f6bcbf97c1551](https://qiita.com/waytoa/items/afea190f6bcbf97c1551)

以上、個人的メモでした。
【CentOS, Eclipse】Cプロジェクトでライブラリファイルを読み込む

## やりたいこと
EclipseのCプロジェクトにCのライブラリ追加して、ライブラリ内のAPIを利用したい
## 環境
* CentOS 7(1908)
* Eclipse　eclipse-cpp-2019-09-R

## やり方
### 1.ライブラリファイルのコピー
1. 「include」ディレクトリを作成
2. ライブラリが入っているディレクトリ内(`.lib`)を、プロジェクトディレクトリに格納   
 （`shapefile`ライブラリを`make`すると`.lib`というディレクトリが作成され、その中にライブラリファイルがあります） 
3. `shapefil.h`ファイルをコピーし、プロジェクト内に作成した「include」ディレクトリ内に格納

### 2.ライブラリ定義の設定
1. プロジェクトを右クリック「プロパティ」→「C/C++ビルド」→「設定」→「ツール設定」
![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146452/e4edb384-1a8e-1805-c221-a10affa914e4.png)
2. 「G++リンカ」→「ライブラリ」→「ライブラリパス」に「.lib」を格納したフォルダを指定
3. 「G++リンカ」→「ライブラリ」→「ライブラリ」に「shp」を入力（ファイル名の「libshp」ではなく、「shp」を指定）
※ ライブラリファイル読込には以下の点に注意  
  ・ファイル名についている`lib`はライブラリプレフィックスとして自動で付与されるため、読み込む際はファイル名から`lib`を抜いた名称で呼び出す必要がある
![config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146452/a27dc803-3be1-84db-76a1-1484efdc3ee6.png)

## はまったところ
* そもそもライブラリをどうやって読み込むかがわからない
* ライブラリファイル読込にはパスだけではなく、ライブラリ名も必要

## 参考にさせていただいたURL
### Cのライブラリの仕組み
* [C/C++のビルドの仕組みとライブラリ](https://kamino.hatenablog.com/entry/c%2B%2B-principle-of-build-library)
* [Ｃ言語 ライブラリってなに？外部公開している情報ってなんなの？](https://qiita.com/developer-kikikaikai/items/c66a0cdae974cf446e24)

### eclipseの設定
* [How to add library path in Eclipse CDT](https://codeyarns.com/2013/09/22/how-to-add-library-path-in-eclipse-cdt/)
* [eclipse Cプロジェクトにライブラリを追加する方法](https://codeday.me/jp/qa/20190304/359351.html)
Docker-Composeで実行中のアプリケーションをホスト側OSのwebサーバーで待受けリバースプロキシでフォワードする

アプリケーションサーバをDocker(docker-compose)で構築して
ホスト側のWebサーバーからリバースプロキシでDockerアプリケーションにフォワードする方法


#１. Dockerで構築した10080ポートで実行しているWebアプリケーション

ホストOSの中で http://localhost:10080　で動作するWebアプリケーションが
実行中だとします。

それをホストOS側のnginxでリバースプロキシでフォワードしたい場合のnginx.confの設定

```nginx.conf

http  {
    
    ...

    server {
        # 待受ポート
        listen 80;
        listen [::]:80;
        # 独自ドメイン
        server_name your-domain.com

        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-Host  $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header "special-header";
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        # 当該設定のドキュメントルートを設定
        root /var/www/html/public_html_application;
        # 以下の記述でプロキシ設定を実行する
        location / {
            proxy_pass http://localhost:10080 ;
            # 非公開アプリケーションのため nginxでbasic認証を実装する
            # .htpasswdは任意の方法で生成する
            auth_basic "basic  authentication";
            auth_basic_user_file /etc/nginx/.htpasswd;
        }
        # リバースプロキシは行うものの、特定のパターンのURLのみ特定ページへリダイレクトさせたい場合
        # apacheのmod_rewrite機能と同等機能
        rewrite /special_pattern/(.*)  /replace/ last;
    }

    ...

}


```

以上が、 80ポートで待ち受けるアプリケーションの設定
次に 443ポート(SSL)で待ち受けるアプリケーションの設定

#2. Dockerで構築した3000ポートかつhttp2で実行しているWebアプリケーション

```nginx.conf

http {

    ...

    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  your-domain.com;
        root         /var/www/html/your-domain.com;

        # フォワードさせるアプリケーションが利用している ssl接続の証明書のパスを
        # 以下のディレクトリで指定する
        ssl_certificate "/var/www/your-domain.com/server.crt";
        ssl_certificate_key "/var/www/your-domain.com/server.key";
        # 以下のディテクティブはなくても動作するが、未調査のため各値がどう作用するか不明
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        
        location / {
            proxy_pass https://localhost:3000;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            # 非公開アプリケーションのため nginxでbasic認証を実装する
            # .htpasswdは任意の方法で生成する
            auth_basic "basic  authentication";
            auth_basic_user_file /etc/nginx/.htpasswd;
        }
    }

    ...

}
```
ONNXで fuse_matmul_add_bias_into_gemm 最適化

ONNXがサポートしている最適化 fuse_matmul_add_bias_into_gemm を調べてみました。

最適化してる場所はここ
https://github.com/onnx/onnx/blob/master/onnx/optimizer/passes/fuse_matmul_add_bias_into_gemm.h

コメントの方がわかりやすい。

```c++
// Before:
//   Z = MatMul(X, Y)
//   A = Z + Bias
// After:
//   A = Gemm(X, Y, Bias)
//
// the pass can handle the case when:
//   case 1: Bias is 1D tensor and Bias.dim[0] == Z.dim[1]
//   case 2: Bias is 2D tensor and Bias.dim[0] == Z.dim[0] or 1
//           and Bias.dim[1] = Z.dim[1]
```

次元があっていれば、連続する matmul -> add をgemmに置き換えます。

最適化前のグラフ

![fuse_matmul_add_bias_into_gemm.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/b5212754-c9a2-40d6-7b45-f1c42c7462e3.png)


passにfuse_matmul_add_bias_into_gemmを設定して、optimizer.optimizeを呼び出します。

```python
passes = ['fuse_matmul_add_bias_into_gemm']

optimized_model = optimizer.optimize(model_def, passes)
```

最適化後のグラフ

![fuse_matmul_add_bias_into_gemm_optimized.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/67a1f9b4-948c-393f-40d2-a2962e9b6352.png)


上手く行きました。

全ソース

```python
import onnx
from onnx import helper
from onnx import TensorProto
from onnx import optimizer

X = helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 5])
Y = helper.make_tensor_value_info('Y', TensorProto.FLOAT, [5, 1])
B = helper.make_tensor_value_info('B', TensorProto.FLOAT, [1, 1])
Z = helper.make_tensor_value_info('Z', TensorProto.FLOAT, [1, 1])

matmul = helper.make_node(
    'MatMul',
    inputs = ['X', 'Y'],
    outputs = ['matmul_out'],
)

add = helper.make_node(
    'Add',
    inputs = ['matmul_out', 'B'],
    outputs = ['Z'],
)

graph_def = helper.make_graph(
    [matmul, add],
    'test-model',
    [X, Y, B],
    [Z]
)

model_def = helper.make_model(
    graph_def,
    producer_name='onnx_example'
)

onnx.save(model_def, 'onnx/fuse_matmul_add_bias_into_gemm.onnx')

onnx.checker.check_model(model_def)

# 最適化パスを指定
passes = ['fuse_matmul_add_bias_into_gemm']

optimized_model = optimizer.optimize(model_def, passes)
onnx.save(optimized_model, 'onnx/fuse_matmul_add_bias_into_gemm_optimized.onnx')
```
メモ - GAE/SE php72,73 ローカル実行時の設定

php73@gae でローカルでテストするときのメモ。



php72/73 では dev_appserver.py が無くなったので、普通に php インストールしてテストする。

が、普通に

```
php -S localhost:8080
```

とかやるだけだと、gaeにデプロイした時と違う挙動になる。

```yaml:app.yaml
runtime: php73
entrypoint: serve --workers=4 --enable-dynamic-workers index.php 
```

```php:index.php
<?php
switch (@parse_url($_SERVER['REQUEST_URI'])['path']) {
    case '/':
        require 'hello.php';
        break;
    case '/test':
        require 'test.php';
        break;
    case '/dir/test':
        require 'dir/test.php';
        break;
	default:
        http_response_code(404);
        exit('Not Found');
}
```

とかのデバッグをローカルでやる場合、

http://localhost:8080/test

は問題ないが

http://localhost:8080/dir/test

は

```
Not Found
The requested resource /dir/test was not found on this server.
```

となってしまう。

この場合、ビルトインウェブサーバーの起動時にルータースクリプトとして index.php を指定するとよい。

```
php -S localhost:8080 index.php
```
C#: WEBフォーム画面でSQLにデータをINSERTする

## SAMPLE
下記のWEBフォームを作成し、名前と誕生日を入力してボタンを押下するとSQLserver上のテーブルにデータをINSERTする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/44663237-ea5e-e573-c2c0-9849546900b0.png)

## SQLserver
```sql
CREATE TABLE [test_data]
	( id INT IDENTITY(1,1)
	, name NVARCHAR(200)
	, birth DATE
	, PRIMARY KEY (id))
```

## ASP.NET
```html
<div>
    名前を入力してください
    <asp:TextBox ID="TextBoxName" runat="server"></asp:TextBox>
    <br />
    <br />
    誕生日を入力してください
    <asp:TextBox ID="TextBoxBirth" runat="server"></asp:TextBox>
    <br />
    <br />
    <asp:Button ID="ButtonInsert" runat="server" OnClick="ButtonInsert_Click" Text="Insert" />
</div>
```

## C# 
```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {

        protected void ButtonInsert_Click(object sender, EventArgs e)
        {
            var query = String.Format("INSERT INTO [test_data] ( name, birth ) VALUES ( '{0}','{1}' )", TextBoxName.Text, TextBoxBirth.Text );


            using (SqlConnection con = new SqlConnection("Data Source=ServerName; Initial Catalog=DatabaseName; uid=UserName; pwd=Password"))
            {
                try
                {
                    // データベースの接続
                    con.Open();

                    using (var transaction = con.BeginTransaction())
                    using (var command = new SqlCommand() { Connection = con, Transaction = transaction })
                    {
                        try
                        {
                            // コマンドのセット
                            command.CommandText = query;
                            // コマンドの実行
                            command.ExecuteNonQuery();
                            // コミット
                            transaction.Commit();
                        }
                        catch
                        {
                            // ロールバック
                            transaction.Rollback();
                            throw;
                        }
                    }
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception.Message);
                    throw;
                }
                finally
                {
                    // データベースの接続終了
                    con.Close();
                }
            }
        }
    }
}
```

## EXAMPLE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/8df9ca98-0e85-b58a-7002-90bba696c29c.png)
Webサイト上の税率8%っぽい箇所を探すクローラーを作った

今日から消費税が10%になりました。

通販サイトなどでプログラムが税額を計算する部分はテスト済みかと思いますが、案外ベタ書きしている箇所も散在し、人の目で探すのは大変です。

* 利用ガイド(送料540円とか)
* ランディングページ
* 商品の説明欄

そういった抜け漏れを探す簡単なクローラーを作ってみました。

* NPM https://www.npmjs.com/package/taxmonkey
* GitHub https://github.com/ideamans/taxmonkey

# 使い方

```bash
npm i -g taxmonkey
taxmonkey 'https://www.ideamans.com/'
```

`taxmonkey.tsv`ファイルに次のような結果が出力されます。

```
URL     行番号  結果    詳細    HTML
https://www.ideamans.com/       0       該当なし
https://www.ideamans.com/mt/sheetasset/ 0       該当なし
https://www.ideamans.com/lightfile/managed/pricing/     455     8%税込の可能性  [ 10,000円/サイト]は税別 9,260円 の8%税込金額を含む可能性があります     10,000円<small>/サイト</small>
```

# ロジック

以下のように8%っぽい金額を探します。

1. HTMLのテキスト要素から数値を探す。
2. その前後に`￥`、`円`があれば金額表記とみなす。
3. ただし、前後に`税別`や`税抜`がある場合は除外する。
4. 税別金額を逆算してキリのいい数字(10円単位)になったら8%表記の可能性あり。

ぶっちゃけ精度は高くありません。保険として使われることを想定してます。

# カスタマイズ

簡単なオプションがあります。例えば税別価格が100円単位のサイトであれば、`-r 100`とすることで少し精度が上がります。

```
taxmonkey <url>

URLを起点にクローリングを開始し、「税込8%っぽい」金額表記をリストアップします。

位置:
  url  クローリングを開始するURL

オプション:
  --help             ヘルプを表示                                         [真偽]
  --version          バージョンを表示                                     [真偽]
  --output, -o       出力先のファイルパス        [デフォルト: "./taxmonkey.tsv"]
  --concurrency, -c  並列実行数                                  [デフォルト: 8]
  --limit, -l        最大ユニークURL数                        [デフォルト: 1000]
  --device, -d       クローリングを行うデバイス(mobile|pc)[デフォルト: "mobile"]
  --round, -r        キリのいい金額の単位                       [デフォルト: 10]
  --timeout          各ページのタイムアウト秒数                 [デフォルト: 30]
  --rate             税率                                     [デフォルト: 0.08]
  --host             開始URL以外でリンクをたどるホスト名        [デフォルト: ""]
  --verbose, -v      エラーや警告を標準エラーに出力   [真偽] [デフォルト: false]
  --quiet, -q        プログレスバーを非表示           [真偽] [デフォルト: false]
  --ext              HTMLドキュメントとみなす拡張子(カンマ区切り)
                                 [デフォルト: ".html,.htm,.php,.jsp,.asp,.aspx"]
  --index            インデックスドキュメントとみなすファイル名(カンマ区切り)
   [デフォルト: "index.html,index.htm,index.php,index.jsp,index.asp,index.aspx"]
```
Elasticsearchで不要なフィールドの削除

使用されなくなった古いフィールドを削除したい。
フィールドを消すには`id`を指定して次の`_update`クエリを実行するか、

```:kibana/DevTools
POST test/1/_update
{
  "script": "ctx._source.remove('field_to_delete')",
}
```

フィールドをもつドキュメントすべてに対して削除したい場合は`exitsクエリ`で絞って`_update_by_query`を実行する。

```:kibana/DevTools
POST test/_update_by_query
{
  "script": "ctx._source.remove('field_to_delete')",
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "field_to_delete"
          }
        }
      ]
    }
  }
}
```

しかし、`exitsクエリ`はフィールドがnullかつ`null_value`の設定をしていない場合、フィールドを持っていないと判断してしまう。つまり、不要なフィールドがnullの場合は検索結果に入ってこない。

[existsクエリ](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html)
[null_valueの設定をすればnullは検索できる](https://www.elastic.co/guide/en/elasticsearch/reference/current/null-value.html)

厄介なこととして、例えば、上の更新コマンドを実行中に処理を誤って中断してしまった場合や、全て削除したにも関わらず、そのあと追加されたドキュメントが不要なフィールドを持っていた場合、同じインデックス内に不要フィールドを持っているやつと持っていないやつが混在することになる。

その場合、例えば厳密にentityの型を定義しているデータマイニングツールなどでは、処理の途中でカラム数が合わず処理が失敗する可能性がある。

そうでなくても、同じインデックス内にフィールドのあるなしのドキュメントが混在するのはよくない。

しかし、データ量が多く、全データに対してなにかやるのは嫌だけど、不要なフィールドを持っているドキュメントだけを検索してやっつけるということができないので割と困った。

## 対応方法①：全データに対して`_update_by_query`
やはり、全件検索をするのは免れなそう。
ただし、消したいフィールドを含むドキュメントだけ削除するようにすることができるので処理速度をある程度削減できた。
（全ドキュメントに不要なフィールドがある場合は効果なしだと思われる）

```
POST test/_update_by_query
{
  "script": {
    "source": """
        if (ctx._source.containsKey('field_to_delete')) {
            ctx._source.remove('field_to_delete');
        } else {
          ctx.op='noop';
        }
"""
  }
}
```

ステータスの確認は以下を実行する。

```
GET _tasks?detailed=true&actions=*update*
```

次のような結果がかえってくる

```
{
  "nodes" : {
    "qsJdt39QT0uDGRMhIb468w" : {
      ...
      "tasks" : {
        "qsJdt39QT0uDGRMhIb468w:59320333" : {
          ...
          "status" : {
            "total" : 10000
            "updated" : 10,
            ...
            "noops" : 174885,
            ...
          },
          ...
        }
      }
    }
  }
}
```
`total`10000件に対して、`updated`が10件、`noops`が174885件とどれくらい不要なフィールドがあったのか確認することができる。

## 対応方法②：reindex
不要なフィールドが全てnullの場合（existsを使った検索が０件ならば、逆に全てがnullであるといえる）新しいマッピング定義を行ったインデックスに対してreindexをすることで不要なフィールドを取り除くことができる。

ただし、大量のデータの場合、一時的でもデータ量が２倍になるので、ディスク容量などに余裕が必要となるので注意が必要。


## 参考
https://stackoverflow.com/questions/29002215/remove-a-field-from-a-elasticsearch-document
https://stackoverflow.com/questions/56649273/elasticsearch-delete-field-from-all-documents-where-it-exists-with-painless
CUDAの依存関係でエラーが出た話

#はじめに
CUDAの依存関係で困ったので解決策をメモしておきます。

#エラーについて
Ubuntuでパッケージをインストールしようとした際、エラーが出て、
`sudo apt-get -f install`を実行してみてくださいと言われる。
実行するとCUDAの依存関係について以下のようなエラーが出る。

```
hoge@hoge:$ sudo apt-get -f install
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
依存関係を解決しています ... 完了
以下の追加パッケージがインストールされます:
 libcublas-dev
以下のパッケージが新たにインストールされます:
 libcublas-dev
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 119 個。
60 個のパッケージが完全にインストールまたは削除されていません。
38.9 MB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 109 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
(データベースを読み込んでいます ... 現在 344965 個のファイルとディレクトリがインストールされています。)
.../libcublas-dev_10.2.1.243-1_amd64.deb を展開する準備をしています ...
libcublas-dev (10.2.1.243-1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libcublas-dev_10.2.1.243-1_amd64.deb の処理中にエラーが発生しました (--unpack):
'/usr/lib/x86_64-linux-gnu/libcublas_static.a' を上書きしようとしています。これはパッケージ nvidia-cuda-dev 7.5.18-0ubuntu1 にも存在します
dpkg-deb: エラー: サブプロセス ペースト がシグナル (Broken pipe) によって強制終了されました
処理中にエラーが発生しました:
/var/cache/apt/archives/libcublas-dev_10.2.1.243-1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
(base) hiroka@hiroka:~/work/U-Net$ sudo apt --fix-broken install
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
依存関係を解決しています ... 完了
以下の追加パッケージがインストールされます:
 libcublas-dev
以下のパッケージが新たにインストールされます:
 libcublas-dev
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 119 個。
60 個のパッケージが完全にインストールまたは削除されていません。
38.9 MB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 109 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
(データベースを読み込んでいます ... 現在 344965 個のファイルとディレクトリがインストールされています。)
.../libcublas-dev_10.2.1.243-1_amd64.deb を展開する準備をしています ...
libcublas-dev (10.2.1.243-1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/libcublas-dev_10.2.1.243-1_amd64.deb の処理中にエラーが発生しました (--unpack):
'/usr/lib/x86_64-linux-gnu/libcublas_static.a' を上書きしようとしています。これはパッケージ nvidia-cuda-dev 7.5.18-0ubuntu1 にも存在します
dpkg-deb: エラー: サブプロセス ペースト がシグナル (Broken pipe) によって強制終了されました
処理中にエラーが発生しました:
/var/cache/apt/archives/libcublas-dev_10.2.1.243-1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```
エラー文を見てみると`nvidia-cuda-dev 7.5.18-0ubuntu1`が邪魔をしていることがわかる。
これは、`nvcc-V`コマンドを実行するために、nvidia-toolkitをインストールする際に入るもので、直接削除するのはリスクがあるため、今回は、`dpkg`する際に引数を`force`にすることで、インストールを行った。[参考サイト](https://eng-entrance.com/linux-package-dpkg "参考サイト")
以下の文を実行する。(ファイル名は調整)

```
$sudo dpkg -i --force-overwrite /var/cache/apt/archives/libcublas-dev_10.2.1.243-1_amd64.deb
```

その後、再び`sudo apt-get -f install`を実行。
この手順でインストールを行うことができました。

#おわりに
今回は、色々調べた結果、強制的に展開を行いましたが、依存関係について、詳しくなりたいので、
解決法や、アドバイスがありましたら、教えていただけると幸いです。
また、同じようなエラーで困っている人がいれば参考にしていただけると幸いです。
boto3でMinioのオブジェクトストレージにアクセスする(docker-compose)


# Minio

MinioはS3互換のオブジェクトストレージです
[MinIO is a high performance object storage server compatible with Amazon S3 APIs ](https://github.com/minio/minio)

# 概要
* docker-composeでMinioを起動する
* boto3を使用してMinioのオブジェクトストレージにアクセスする

## tree
```bash
.
├── docker-compose.yml
├── list_objects_sample.py
└─- .env
```

## docker-compose.yml
```yaml
version: '3'
services:
  app:
    image: python:3.7
    container_name: my-app
    working_dir: /var/www/app
    volumes:
      - app-volume:/var/www/app
    depends_on:
      - s3
    tty: true
  s3:
    image: minio/minio
    container_name: my-s3
    volumes:
      - s3-volume:/data
    ports:
      - "9001:9000"
    command: ["--compat", "server", "/data"]
volumes:
  app-volume:
    driver: local
  s3-volume:
    driver: local
```


## .env
```bash
AWS_ACCESS_KEY_ID=dummy_s3_access_key
AWS_SECRET_ACCESS_KEY=dummy_s3_secret_key
AWS_DEFAULT_REGION=us-east-1
AWS_S3_ENDPOINT_URL=http://s3:9000
```

.envを作っておくと、docker-composeが自動で環境変数に設定してくれます

## list_objects_sample.py
```python
import boto3
import os

s3_endpoint_url = os.getenv('AWS_S3_ENDPOINT_URL', None)
s3 = boto3.client('s3', endpoint_url=s3_endpoint_url)
res = s3.list_objects_v2(Bucket='bucket-name')
print(res)
```

boto3は環境変数AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGIONを使用します
endpoint_urlは環境変数で設定できないので、clientのパラメータとして設定します
本番環境ではAWS_S3_ENDPOINT_URLを設定しないことで、endpoint_url=Noneとなります

## 実行
```bash
docker-compose build
docker-compose up -d
# http://localhost:9001/minio/ にアクセスしてbucket作成、file登録する
docker run my-app python list_objects_sample.py
```
服の形状と表面テクスチャの組み合わせデータからランダムに着替えリストを出力するPGM

pythonで服の形状と表面テクスチャの組み合わせデータからランダムに着替えリストを出力するPGMを作りました

githubURL:https://github.com/NanjoMiyako/randomKigae

服の形状と表面テクスチャの組み合わせデータは予めweareInfo.csvファイルに設定しておきます

参考URL:
<a href="https://vba-gas.info/gas-n">
【Google Apps Script(GAS)】文字列の改行（メッセージボックスの改行）
</a>

<a href="https://qiita.com/idontwannawork/items/61d07972faacc490d2ac">
Pythonのopen関数はencoding引数を指定しよう - Qiita
</a>

<a href="https://note.nkmk.me/python-file-io-open-with/">
Pythonでファイルの読み込み、書き込み（作成・追記） | note.nkmk.me
</a>

サンプル画像
out6.jpg
![out6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/058730a5-8db6-f7f8-2d97-9cc448fedb8a.jpeg)
elasticsearch-ruby で FrozenError が出たので対処した

# 何が起きたか

以下の `force_encoding` 実行時に `body` が凍結されていたようで、 FrozenError が発生した。

```ruby
# Licensed to Elasticsearch B.V under one or more agreements.
# Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
# See the LICENSE file in the project root for more information

module Elasticsearch
  module Transport
    module Transport

      # Wraps the response from Elasticsearch.
      #
      class Response
        attr_reader :status, :body, :headers

        # @param status  [Integer] Response status code
        # @param body    [String]  Response body
        # @param headers [Hash]    Response headers
        def initialize(status, body, headers={})
          @status, @body, @headers = status, body, headers
          @body = body.force_encoding('UTF-8') if body.respond_to?(:force_encoding)
        end
      end

    end
  end
end
```

https://github.com/elastic/elasticsearch-ruby/blob/ccece45a29cc40456a812c23a0f025c5bcfbb33a/elasticsearch-transport/lib/elasticsearch/transport/transport/response.rb#L19

# 前提

- Ruby 2.6.1
- AWS Elasticsearch Service Engine version 7.1
- elasticsearch-ruby 7.3
- faraday 0.16.2

# なぜ凍結されているか

すいません、調査していません。ググっても情報が出てこないので、この組み合わせだと発生するのかなーと。

# 対処内容

Faraday の Middleware を実装して対処しました。

```ruby
require "faraday"
# Elasticsearch::Transport::Transport::Response で body.force_encoding の際に
# FrozenError が発生するため、body を解凍するミドルウェアをかませる。
module Faraday
  class Response
    class Unfreeze < Middleware
      def parse(body)
        +body # 解凍
      end
    end
    register_middleware unfreeze: Unfreeze
  end
end
```

上記ミドルウェアを `Elasticsearch::Client` の初期化時に追加。

```ruby
ES = Elasticsearch::Client.new(url: url) do |faraday|
  faraday.request(:aws_sigv4, 
    service: 'es',
    region: aws_region,
    credentials_provider: credentials_provider)
  faraday.response :unfreeze # <= ここに追加
  faraday.adapter Faraday.default_adapter
end
```

これで上手くいきました。
【C++】配列から条件に合う値をfilterするいい方法は「小さいテンプレートメソッドを自作する」です

C++で配列から条件に合う値をfilterするいい方法は？

## ちなみにRuby

```rb
[1,2,3,4,5].select {|i| i.odd?} # -> [1,3,5]
['a','ab','c'].filter {|str| str.include?('a')} #->["a","ab"]
```
かなり直感的。できればこう書きたい。

ここまでとはいわないのでもう少し便利に汎用的なものがほしい！
それを探して、StatckOverflowの「[Modern way to filter STL container?](https://stackoverflow.com/a/53268928/12146231)」スレッドでみつけた方法が便利だったので紹介します。

## テンプレート関数をうまく利用した`filter`を自作

コンテナと条件は引数で指定する形で、このメソッドひとつ定義しておけばコンテナの型はなんでもいいので汎用性が高いです。

```cpp

template <typename Cont, typename Pred>
Cont filter(const Cont &container, Pred predicate) {
	Cont result;
	std::copy_if(container.begin(), container.end(), std::back_inserter(result), predicate);
	return result;
}
```

## つかいかた：サンプルコード

```cpp
#include <iostream>
#include <vector>
#include <algorithm>

template <typename Cont, typename Pred>
Cont filter(const Cont &container, Pred predicate) {
	Cont result;
	std::copy_if(container.begin(), container.end(), std::back_inserter(result), predicate);
	return result;
}

int main()
{
  // --------------------------
  // 「整数配列から偶数のみを取る」
  std::vector<int> numbers{ 1, 2, 3, 4, 5, 6 };
  const auto odd = filter(numbers, [](int a) { return a % 2 == 0; });

  for (auto& n : odd) {
    std::cout << n << std::endl;
    // 2, 4, 6
  }

  // --------------------------
  // 「どのビットが立っているかを調べる」
  const unsigned long expect_value = 0x23;
  std::vector<unsigned long> bits = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20 };

  const auto matched_bits = filter(flags, [](unsigned long bit) { return expect_value & bit; });

  for (auto& v : matched_bits) {
    std::cout << std::hex << v << std::endl;
    // 1, 2, 20 (hex表記)
  }

  // --------------------------
  // 「30歳以上の名前を集める」
  struct Person
  {
    std::string Name = "";
    int Age = 0;
  };
  std::vector<Person> people = {
    { "ueki", 35 },
    { "yamada", 20 },
    { "suzuki", 50 },
    { "saito", 19 },
  };
  const auto people_30_plus = filter(people, [](Person person) { return person.Age > 30; });
  
  for (auto& person : people_30_plus) {
    std::cout << person.Name.c_str() << std::endl;
	// "ueki", "suzuki"
  }
}
```

## まとめ

- 汎用性のあるテンプレートメソッドがあると、たくさんのメソッドをつくらずに済む
- 「`for`ループで回して値をチェック」より説明的でコードリーディングのとき脳への負担が軽い
- 他のロジック（`map`,`redudce`）にも応用ができる
ReactNative(Expo)でConfirmダイアログを出す


どうやら[react-native-simple-dialogs](https://github.com/douglasjunior/react-native-simple-dialogs)というのあるらしく、Confirmの他に普通のダイアログ、Progressとかも出せるみたいなので試してみる。


## 実装

とりあえず直近必要なConfirmダイアログをを出してみる。
どうやらViewの中に\<ConfirmDialog>を書いておき、visibleをstateで制御するようだ。

```js:App.js
import React from 'react';
import { StyleSheet, Text, View, Button } from 'react-native';
import { ConfirmDialog } from 'react-native-simple-dialogs';

export default class App extends React.Component {

    state = {
        dialogVisible: false,
    }
    render() {
        return (
            <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
                <Text>App</Text>
                <Button
                    title="実行"
                    onPress={() => this.setState({ dialogVisible: true })}
                />
                <ConfirmDialog
                    title="確認画面"
                    message="本当に実行しますか？"
                    visible={this.state.dialogVisible}
                    onTouchOutside={() => this.setState({ dialogVisible: false })}
                    positiveButton={{
                        title: 'はい',
                        onPress: () => {
                            // alert('OK')
                            this.setState({ dialogVisible: false });
                            console.log('OK');
                            // alert('OK');
                        }
                    }}
                    negativeButton={{
                        title: 'いいえ',
                        onPress: () => this.setState({ dialogVisible: false })
                    }}
                // overlayStyle={{ backgroundColor:"#eee"}}
                />
            </View>
        );
    }
}
```

## 事項結果

いろいろ使えそう。


![スクリーンショット 2019-10-01 12.23.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/2e04aea5-067a-e739-9673-fb38d6686d20.png "スクリーンショット 2019-10-01 12.23.07.png")
Javaで税率を返すメソッドを作成する

消費税率が 8% から 10% になりました。

税率は

```Java
  public static final String TAX_PERCENT = "0.08";
```

みたいに定数として持たせると危険です。

2014年04月  8%
2019年10月 10%

のようにして税率は変わってきており、今後も増税のタイミングが発生することが予想されます。

このように日時によって税率が変わるため、以下のように税率を返すメソッドを用意するのがおすすめです。

```Java
  public static final String EIGHT_TAX_PERCENT = "0.08";

  public static final String TEN_TAX_PERCENT = "0.10";

  public static final String TEN_TAX_PERCENT_CHANGE_DAY = "2019-10-01 00:00:00";

  public static BigDecimal getTaxPercent() {
    try {
      Date now = new Date();
      SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      Date dateTime = sdformat.parse(TEN_TAX_PERCENT_CHANGE_DAY);
      return now.getTime() >= dateTime.getTime()
        ? new BigDecimal(TEN_TAX_PERCENT)
        : new BigDecimal(EIGHT_TAX_PERCENT);
    } catch (ParseException e) {
      System.out.println(e);
    }
    // きっと永遠にこない
    return new BigDecimal("0");
  }
```
DjangoでMySQLに繋いだ後にAdminにログインできなくなった時の解決法

#背景


ローカルで一通り開発した後によっしゃGAEのMYSQLに繋ぐか！ってなった時に繋いでmigrateしたらerrorが出てしかもadminにログイン出来ない！となった。

実際のエラー内容は
```table django_session doesn't exist```


#環境

MacOS Mojave 10.14
Python 3.7.3
Django 2.2


#原因探し

とりあえず```python manage.py showmigrations```してみたら

```
$ python3 manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
 [X] 0003_logentry_add_action_flag_choices
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
blog
 [ ] 0001_initial
 [ ] 0002_auto_20190912_2307
 [ ] 0003_auto_20190912_2314
 [ ] 0004_auto_20191001_1124
sessions
 [ ] 0001_initial
```

こんな感じ。
そもそもmigrateをした時にblogで詰まっていた為そのあとのsessionsが実行されていないために起こっていたerrorみたいですね。


#応急処置


sessionsがmigrateされればとりあえずadminにログインできるようになるだろうという仮説を立てて、

```
python3 manage.py migrate sessions
```

をやってみると

```
Operations to perform:
  Apply all migrations: sessions
Running migrations:
  Applying sessions.0001_initial... OK
```
と出て実際にログインもできたのでとりあえず応急処置的になんとかするならこれで大丈夫かと。

blogのmodel.pyをしっかり書けていればそもそも発生しなかった現象なのでもう一度modelの書き方をしっかり学び直そうと思います。