OmniAICreator/Qiita-1.07M huggingface dataset:
いろんなwebサーバを使ってHelloWorld ～IIS編～その1

会社で同僚が内部のwebサーバを立ててredmineを使っていました。
おもしろそうだったので自分でもやってみようと思います。
一番ベタなのはapacheですが、せっかくなのでいろいろなwebサーバでやってみます。
今回はwindowsのIISです。
 
まず、前提条件として自分の環境です。
 
<img width="447" alt="20200425_自宅構成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/d34850bf-d787-8db3-12cd-93b0c48c4557.png">

 
特にこだわった構成でもありませんが、自宅のインターネット用のルータがあり、
あとデスクトップPCとノートPCがあります。
今回はデスクトップPCでwebサーバを立ててみて、ノートPCからそのwebサーバにアクセスできるか試してみようと思っています。
 
webサーバでは簡単なHelloWorldを表示させるようにしてみます。
実際続くか不明ですが、カスタマイズしていけたらいいなと思っています。
 
では、やっていきます。
 
まず、windows10でIISサーバを有効にします。
<img width="233" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/4f6b3dd3-00b7-f6bc-813c-8f99fd236b41.png">


windows機能「インターネットインフォメーションサービス」にチェックを入れます。
※一度目やってみるとなぜか、「参照されたアセンブリはシステムにインストールされていません」とエラーになりましたが、もう一度やってみると正常にできたので、深追いはしませんでした。
 
有効化できると、管理ツールに「インターネット インフォメーション サービス (IIS) マネージャー」が表示されるようになります。
<img width="671" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/69a2e107-eac1-ed2c-7258-f02cadfae8c9.png">


 
実行して、IISマネージャより、左ペインの「ホスト-サイト」で右クリックし、「Webサイトの追加」を実行します。
<img width="836" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/abbc5db5-1293-069b-262f-d172665048df.png">
 
サイトを指定していきます。
サイト名は適当な名前を入れて、物理パスも好きなところのフォルダを指定します。
<img width="439" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/1da38aac-b590-a0f4-7507-abc04d99b1ab.png">


物理は以下の下に今回表示する予定の、HelloWorld用のhtmlファイルを保存しておきます。
helloworldのテンプレートは、グーグルで「helloworld html template」とググればすぐに出てきます。
<img width="514" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/318a27c3-d7a9-7429-26e4-f5b947adabc2.png">



 
設定できたらまずwebサーバを構築したデスクトップからアクセスしてみます。
http://localhost:8080/index.html
 <img width="393" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/bce7ce0e-9ea5-79ae-80be-ec17decf4a80.png">


 
...エラーがでました。
調べてみると、フォルダのアクセス権の問題のようです。
今回設定したアクセス先のフォルダ「localSite」にユーザ「IUSR」でアクセス権を与えます。
<img width="212" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/f0fb815c-0782-55e5-93ec-42ee8084a672.png">



そして、もう一度アクセスしてみます。
 
（なんかタブが文字化けしてますが、）できました！！
<img width="577" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/340c5934-b17b-c478-ada1-ac04b5c4db91.png">


今は、webサーバ自体からアクセスしているので、冒頭に書いたとおり、
ノートPCからアクセスできるか確認してみます。
 
またうまくいきません！
<img width="540" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/038d18ab-8513-1896-e3ca-f6bc6064505d.png">


 
しかし、調べてみるとすぐにわかりました。
ファイアーウォールのポート開放が問題のようです。
開放してみました。 
受信の規則で、今回開放しているポート番号「8080番」をプライベート範囲で追加しています。
<img width="326" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/7bbe3d80-864c-57b3-167e-3d7201d1b563.png">

 
完成ですね。
先程まではlocalhostと指定していましたが、webサーバ側のローカルIPを指定しています。
<img width="540" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538462/a58bfdc5-ef99-2e50-1556-0bb6d03f80eb.png">
Rails6で複数のラジオボタンを使って評価機能を実装する

# 前置き
railsチュートリアルをベースにした自作アプリに、評価機能を実装しようとしました。
しかし、調べても出てくるのはせいぜいラジオボタン2個での実装だったりrails５とか４の古い情報・・・
ratyを使う方法は数多くヒットしましたが、どうやらjavascriptを使わなければならないようです。
javascriptに苦手意識のある私は、それを回避してどうにか簡単に実装できないかと考えました。
そこで目についたのが、ラジオボタンという機能です。これを使ってさくっと実装しちゃおうと思いました。

ということで自分が実装に至るまでやったことをまとめたいと思います。
私自身初心者ですので至らぬ部分があるかと思います。ご了承ください。

# 何を作る
投稿フォームにラジオボタンを並べて選択できるようにする。
micropost一覧画面で、投稿者が選択した評価をみられるようにする。

# 環境
Ruby on Rails 6.0.2.1

# 前提
railsチュートリアルにおいてmicropost投稿機能が完成していること。

# 実装

## micropostsテーブルにrateカラム追加

```
rails g migration AddRateToMicroposts rate:string
```

```[timestanp]_add_rate_to_microposts.rb
class AddRateToMicroposts < ActiveRecord::Migration[6.0]
  def change
    add_column :microposts, :rate, :string
  end
end
```

上記の様なマイグレーションファイルができるかと思います。
ここまできたら、

```
rails db:migrate
```

これでデータベースの用意は完了です。

## コントローラの編集

micropostsコントローラ内のmicropost_paramsで定義されている部分に:rateを追加します。

```microposts_controller.rb
class MicropostsController < ApplicationController
（略）
  private
    def micropost_params
      params.require(:micropost).permit(:content, :picture, :rate)
    end
（略）
end
```

## viewの作成

```new.html.erb
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(model: @micropost, local: true) do |f| %>
      <%= render 'shared/error_messages', object: f.object %>
      <div class="field">
        <%= f.text_area :content, placeholder: "本文を入力" %>
      </div>
      <div class="micropost_rate">
        <p>海水浴場の評価</p>
        <%= f.radio_button :rate, :"非常に悪い" %>
        <%= f.label :rate, "非常に悪い", value: :"非常に悪い" %>
        <%= f.radio_button :rate, :"悪い" %>
        <%= f.label :rate, "悪い", value: :"悪い" %>
        <%= f.radio_button :rate, :"普通", checked: true %>
        <%= f.label :rate, "普通", value: :"普通" %>
        <%= f.radio_button :rate, :"良い" %>
        <%= f.label :rate, "良い", value: :"良い" %>
        <%= f.radio_button :rate, :"非常に良い" %>
        <%= f.label :rate, "非常に良い", value: :"非常に良い" %>
      </div>
      <span class="picture">
        <%= f.file_field :picture, accept: 'image/jpeg,image/gif,image/png' %>
      </span>
      <%= f.submit "投稿する", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
```

rateについて記述した部分はもっと綺麗に書けそうな気がしますが・・・。
"checked: true"と記述すると、あらかじめチェックが入った状態でラジオボタンを用意することができます。
私はチェックなしの状態で投稿されたくないと考えたのでこのように書きました。
バリデーションもあるとなお良しだと思います。


```_micropost.html.erb
<li id="micropost-<%= micropost.id %>" data-micropost-id="<%= micropost.id %>">
  （略）
  <span>
    <p>海水浴場の評価</p>
    <%= micropost.rate %>
  </span>
</li>
```

# 終わりに
該当コードのみざっと書いてしまったのでわかりづらくなってしまったかもしれません。
気づいたことがあれば今後も改良していきます。
また、改善点等ありましたらコメントで教えていただけると嬉しいです！


# 参考
[Railsガイド](https://railsguides.jp/form_helpers.html#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E5%91%BD%E5%90%8D%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B)
[テックアカデミー記事](https://techacademy.jp/magazine/22208)
作業ログを取得するコマンドを作成する

仕事でもそうですが、作業証跡を残すことは大事です。
個人の環境でも、詰まったところを後で探すために、作業ログを残したいと思いました。
自分の性格上、いちいちログの名前を決めたりする方法だと、面倒になって長続きしない。
Scriptを組んで、決まったコマンドを打てば作業ログを取得できるようにしました。

## alias で作業ログを取得するコマンドを作成する

コマンドは **.bashrc** に記載します。
今回は **vi** で入力しました。
作業ログを取得するためのコマンドは **outputlog** とします。
ログの名前は「年月日_時分秒.log」という形です。

### ./bashrc を開く

```
$ vi ~/.bashrc
```

### 一番下に alias を追記して保存する

```
alias outputlog='script /home/pi/Desktop/scriptlogs/$(date +%Y%m%d_%H%M%S).log'
```

これで終わりです。
ログを取りたいところで **outputlog** を実行すると、ログが取得できます。

## 課題

ターミナル上は問題ないのですが、ログに出力すると文字化けしてしまっています。
いくつか試してみたのですが、解消せず。
解消できる良い方法があればご教示いただきたいところです。
postgresql jdbcドライバ 9.4.1212 をjdk11で使用すると 'WARNING: An illegal reflective access operation has occurred'が出力される

postgresql jdbcドライバ 9.4.1212 をjdk11で使用すると 

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.postgresql.jdbc.TimestampUtils (file:/XXX) to field java.util.TimeZone.defaultTimeZone
WARNING: Please consider reporting this to the maintainers of org.postgresql.jdbc.TimestampUtils
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations

と出力されます。

これは、jdk9以上で、保護されたクラスに対して、
Field.setAccessible(true) を実行すると出力されるようです。

jdbc ドライバ　42.2.12　を使用するとこの警告は出力されません。

そこで、42.2.12 の　 org.postgresql.jdbc.TimestampUtils のソースを調べてみると、
106行目に
``  if (JavaVersion.getRuntimeVersion().compareTo(JavaVersion.v1_8) <= 0) `` 
とあり、後続の、Field.setAccessible(true) を回避しています。
Docker Hubに自分の作ったイメージをpushする手順

##実行環境


・docker for Mac
・Docker version 19.03.8
・dockerをインストール済である亊
##まずは自分の作ったイメージを確認する
```
docker image ls
```
```
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
jun3030              latest              ab382fbe9111        18 hours ago        750MB
first_docker         latest              ab382fbe9111        18 hours ago        750MB
alpine               latest              f70734b6a266        29 hours ago        5.61MB
golang               1.9                 ef89ef5c42a9        21 months ago       750MB
gihyodocker/echo     latest              3dbbae6eb30d        2 years ago         733MB
```
docker hubにpushしたいリポジトリを探し、そのIMAGE IDをコピーする。ここではjun3030のimageIDを選択。再びコマンドを打つ。


```
docker tag ab382fbe9111 jun3030/dockerrepo 


*捕捉
jun3030 = dockerアカウント作成時のID
dockerrepo = push先のリポジトリの名前
```
先程のコマンドの結果を確認


```
docker image ls
```
```
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
jun3030              latest              ab382fbe9111        18 hours ago        750MB
jun3030/dockerrepo   latest              ab382fbe9111        18 hours ago        750MB
first_docker         1.1.1               ab382fbe9111        18 hours ago        750MB
alpine               latest              f70734b6a266        29 hours ago        5.61MB
golang               1.9                 ef89ef5c42a9        21 months ago       750MB
gihyodocker/echo     latest              3dbbae6eb30d        2 years ago         733MB
```
新しく **jun3030/dockerrepo   latest              ab382fbe9111        18 hours ago        750MB** と作成されている事を確認。これを使いpushしていきます。

```
docker image push jun3030/dockerrepo
```

```
The push refers to repository [docker.io/jun3030/dockerrepo]
21874c1e017a: Pushed 
b6942a570355: Pushed 
186d94bd2c62: Mounted from library/golang 
24a9d20e5bee: Mounted from library/golang 
e7dc337030ba: Mounted from library/golang 
920961b94eb3: Mounted from library/golang 
fa0c3f992cbd: Mounted from library/golang 
ce6466f43b11: Mounted from library/golang 
719d45669b35: Mounted from library/golang 
3b10514a95be: Mounted from library/golang 
latest: digest: sha256:03faeca1797966567f99038d909acc2364a88b60f97d08791894998c4efe5cdb size: 2418
```

これで docker hub にpushしたイメージのリポジトリが出来上がっているはずです。
プロセスとスレッドの比較

マルチプロセスとマルチスレッドについて、タスクを分割するのにどちらの方針がいいのか、自分用にまとめたくなったのでまとめてみる。

|比較項目|マルチプロセス　　|マルチスレッド　　|
|:---|:---|:---|
|アドレス空間|独立|共有|
|共有メモリ|システムコール|元から共有|
|コールバック|プロセス間通信|直接呼べる|
|プロセス落ち|落ちたプロセス限定|全滅|

ポイントとしては、マルチスレッドはアドレス空間共有によるコールバックやリソース（割り込み等）の共有が楽ではあるが、地雷を踏めば全滅。また、独立した作業を協調して実行する場合は、スレッドにタスクを振るのではなくプロセスが個別に担当したほうが良いように思える。

コールバックのようなロジックが多いなら、そのタスクを１プロセスに集約するべきなのだろう。関数を直接呼べないというのは、実際に作っていく過程では結構なストレスを感じてしまう。

なかなか難しいものだ。
AnacondaでSpyderをアップデートする方法

Anaconda3を用いてSpyderを4.1.2にアップデートする方法をメモします。

AnacondaのパッケージとしてダウンロードしたSpyderを開いたところ、
以下のような表示が出たのでアップロード方法を調べました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566479/17f37751-71d6-595c-dece-c104693e9f99.png)

Anacondaを使用されている方は、Anaconda Promptというパッケージがダウンロードされていると思います。
ここからアップデートが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566479/a929cb2a-657b-b802-30c7-cdf7ea3033e7.png)

Anaconda Promptを立ち上げるとデフォルトでAnacondaをインストールしているパスが表示されると思うので、ここで'conda update --all'というコマンドを打ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566479/62882451-5136-f6c0-b281-3db68fc8e222.png)

実行すると以下のようにアップデートされるパッケージの一覧が表示されますので、
'y'を選択して実行すれば自動で更新が始まります。

インストール完了後は再度コマンドを受付する状態となりますので、
このあとにそれぞれのパッケージのバージョン情報が確認可能な、
'conda list'を実行し、インストールが完了していることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566479/98aae2b4-4c19-6f47-8969-5c186d90274a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566479/66d49b6b-6820-a68a-1b11-364be68967bf.png)

2021年12月19日追記：Spyder 4.1.5への更新も同様の手順で可能でしたので追記します。
[HTML] Bootstrap の SVG icon を使ってみたら簡単に使えた話


# Bootstrap の SVG icon を使ってみたら簡単に使えた話

簡単に使える icon は無いものか探していたら、「Bootstrap の SVG icon が簡単に使えるよ」って言われたので、行ってみたら本当に簡単だった。という話をメモします。

## 1, Bootstrap のページに行く

https://icons.getbootstrap.com/
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107592/b4f8a404-9560-2a76-ed94-399d1310f63c.png)

## 2, 表示したいアイコンを選ぶ

https://icons.getbootstrap.com/icons/arrow-repeat/
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107592/c8ea8b2e-ffa1-28ea-381c-e8975094f5fa.png)

## 3, SVG teg をコピーして、

下の方に表示されている SVG teg をコピーする。いまのところ便利なコピーボタンとかは見当たらない。

```HTML
<svg class="bi bi-arrow-repeat" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
  <path fill-rule="evenodd" d="M2.854 7.146a.5.5 0 00-.708 0l-2 2a.5.5 0 10.708.708L2.5 8.207l1.646 1.647a.5.5 0 00.708-.708l-2-2zm13-1a.5.5 0 00-.708 0L13.5 7.793l-1.646-1.647a.5.5 0 00-.708.708l2 2a.5.5 0 00.708 0l2-2a.5.5 0 000-.708z" clip-rule="evenodd"/>
  <path fill-rule="evenodd" d="M8 3a4.995 4.995 0 00-4.192 2.273.5.5 0 01-.837-.546A6 6 0 0114 8a.5.5 0 01-1.001 0 5 5 0 00-5-5zM2.5 7.5A.5.5 0 013 8a5 5 0 009.192 2.727.5.5 0 11.837.546A6 6 0 012 8a.5.5 0 01.501-.5z" clip-rule="evenodd"/>
</svg>
```
（右上の「Download」ボタンは、すべての SVG ファイルが zip になってダウンロードできるみたい。SVGファイルを img tag とかで表示したいひとはそちらからどうぞ。）


## 4, 表示したいところに貼り付ける

<p class="codepen" data-height="196" data-theme-id="light" data-default-tab="html,result" data-user="yamazaki3104" data-slug-hash="ExVWOZY" style="height: 196px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Bootstrap SVG icon">
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

以上、おしましい。あー、簡単。

## 5, 必要なら色やサイズを調整して終了。

div tag にstyle を指定して、SVG tag を囲めばいい。

```HTML
<div style='font-size: 7em; color: #eee; background-color: #555;'> ... </div>
```

<p class="codepen" data-height="228" data-theme-id="light" data-default-tab="html,result" data-user="yamazaki3104" data-slug-hash="WNQpYGJ" style="height: 228px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Bootstrup SVG icon test2">
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

終了。

あー、本当に簡単でした。

もっと種類が増えるといいですね。＞アイコン

みなさまのプログラミングライフの一助になれば幸いです。
PHPの標準入力について

// 標準入力からの入力値を変数に代入します
$single_line_input = fgets(STDIN);

// 取得した入力値を半角スペースで分解します
$array = explode(" ", $input_line);
ex)入力12 13 14 15
　　→[12,13,14,15]

// 単一行の入力の場合はこれだけで各入力値が配列の要素として使えます

・標準入力が複数行の場合

// 標準入力を一行ずつ配列に代入します
//trimは入力された文字列の前後の空白をなくす
while ($line = fgets(STDIN)) {
   $tmp[] = trim($line);
}

// 配列の各要素をさらに分解します
foreach ($tmp as $key => $value) {
  $array[] = explode(" ", $value);}
apple scriptを使ってDownloadsフォルダを探す苦行からの解放される

突然ですが皆さんダウンロードしていますか？
僕らIT系の人はダウンロードとは切って切り離せない関係ですよね？

* 何か新しいソフトをダウンロード
* 写真やアイコン素材ダウンロード
* メールで送られてきたファイルをダウンロード
* …etc

そしてダウンロードした後に必ずやることって何でしょうか？
そうです

**ダウンロードフォルダを開く!!**

ですよね!
もう絶対やりますよね、ダウンロードした後にダウンロードフォルダを開かない人がいたら会ってみたいものです笑

大体の人はこうしてるんじゃないでしょうか？

1. cmd + spaceでfinderと検索
2. ダウンロードフォルダを選択
3. ファイルを移動させたり開いたり

これめちゃくちゃ めんどくさい + 時間の無駄ですよね。
今回はこのダウンロードフォルダを開くまでをapple scriptを使ってこれを自動化する方法をご紹介します！

## やり方
今回はapple scriptの[WatchingFolders]([Mac Automation Scripting Guide: Watching Folders](https://developer.apple.com/library/archive/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/WatchFolders.html))という機能を使っていきます。
apple scriptそのものについては[こちら](http://tonbi.jp/AppleScript/Introduction/01/)とか見ると良いかと思います!


1. まずapple scriptのエディタであるスクリプトエディタを使ってapple scriptを作成します。
たった5行のスクリプトがあなたの時間を節約します。

```applescript
on adding folder items to theAttachedFolder after receiving theNewItems
	tell application "Finder"
		open theAttachedFolder
	end tell
end adding folder items to
```
こんな感じ
<img width="350" alt="open_directory_on_add_item_と_Never_seeking_for_download_folder.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71154/688720a9-18ae-e3a7-c382-774a4ff64211.png">


技術記事なので少しだけ説明すると、フォルダにファイルが追加されると、イベントハンドラーが呼び出され、theAttachedFolderにフォルダーのオブジェクトが入ります。

```applescript
on adding folder items to theAttachedFolder
```

でそのフォルダーをFinderで開きます。

```applescript
tell application "Finder"
	open theAttachedFolder
end tell
```

追記: 日本語でフォルダ名がダウンロードとなっている場合は直接shellを実行した方が確実でした。
```
on adding folder items to theAttachedFolder after receiving theNewItems
	do shell script "open ~/Downloads/"
end adding folder items to
```

2. スクリプトが作成できたら、保存します。このとき注意点として

* /Library/Scripts/Folder Action Scripts/  ## どのユーザーでも利用可能
* ~/Library/Scripts/Folder Action Scripts/ ## 現在のユーザーのみ

のいずれかのフォルダに保存する必要があるので注意してください。
名前はなんでも良いですが今回はopen_directory_on_add_itemとしました。
(Folder Action Scriptsがない場合は自分で同じ名前のものを作成すればOKです)

3. 保存できたらスクリプトをDownloadフォルダに適用します。
	1. ダウンロードフォルダを選んで右クリック→サービス→フォルダアクション設定
	2. 作成したopen_directory_on_add_itemを関連付けるを選びます

<img width="254" alt="フォルダアクション設定_と_“このMac”を検索.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71154/3552ebfc-7f29-5baf-3137-dacf9b64001d.png">

さらにフォルダアクションを使用にチェックが入っていることも確認しておきましょう。

<img width="244" alt="フォルダアクション設定_と_Never_seeking_for_download_folder.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71154/2d934cfd-2edf-a434-2a18-e4efbb6e43df.png">

これで準備完了です！

## 動作確認
最後に動作確認しておきましょう！
何でもいいですが何かアイコンをダウンロードしてみます。
[Wombat - Free animals icons](https://www.flaticon.com/free-icon/wombat_427526?term=wombat&page=1&position=5)
ダウンロードが完了すると自動的にダウンロードフォルダが開くはずです!!

ダウンロードフォルダを探すという苦行から解放されましたね！是非試してみてください！
Ubuntu 20.04 に Python 3.8 をインストール（OS標準）

# はじめに

Ubuntu 20.04にPython 3.8をインストール

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt update; apt install -y python3
... 略
```

### 各種確認

```shell-session
# which python{,2,3}
/usr/bin/python3

# ll /usr/bin/python*
lrwxrwxrwx. 1 root root       9 Mar 13 12:20 /usr/bin/python3 -> python3.8*
-rwxr-xr-x. 1 root root 5457568 Mar 13 10:14 /usr/bin/python3.8*

# python3 -V
Python 3.8.2

# apt show python3
Package: python3
Version: 3.8.2-0ubuntu2
Priority: important
Section: python
Source: python3-defaults
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 194 kB
Provides: python3-profiler
Pre-Depends: python3-minimal (= 3.8.2-0ubuntu2)
Depends: python3.8 (>= 3.8.2-1~), libpython3-stdlib (= 3.8.2-0ubuntu2)
Suggests: python3-doc (>= 3.8.2-0ubuntu2), python3-tk (>= 3.8.2-1~), python3-venv (>= 3.8.2-0ubuntu2)
Replaces: python3-minimal (<< 3.1.2-2)
Homepage: https://www.python.org/
Task: minimal, ubuntu-core
Download-Size: 47.6 kB
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu focal/main amd64 Packages
Description: interactive high-level object-oriented language (default python3 version)
```

### 補足

Ubuntu20.04にPython3.9が出てきそうなので、 `apt install -y python3.8` とやるほうが確実かもしれない
ただしその場合 `/usr/bin/python3` は作成されないようなので注意。
「brew services start mysql」と「mysql.server start」の違い

#### brew services start mysql

Macの再起動後に自動的にSQLが**再起動される**

#### mysql.server start

Macの再起動後に自動的にSQLが**再起動されない**

####参考記事
・[brew services start mysql vs mysql.server start]
(https://stackoverflow.com/questions/49157541/brew-services-start-mysql-vs-mysql-server-start)
・[mysql - 「brew services start mysql」と「mysql.server start」の違い]
(https://ja.coder.work/so/mysql/468880)
・[Homebrew Servicesを使ってサービスを管理する]
(https://rcmdnk.com/blog/2016/04/25/computer-mac-homebrew/)
・[Mac に MySQL 5.7 を brew install して自動起動させる]
(https://www.d-wood.com/blog/2017/02/23_8835.html)
【50カウント】Pythonを使ったキー送信 for Windows

# はじめに

1～50 までの数字を Web ブラウザに入力する作業を Python で自動化してみました。

# 環境

Windows の Python3 で作りました。
Anaconda ディストリビューションは必要なライブラリが最初から入ってましたが、Python公式サイトなどからインストールされていて win32com.client が import できない場合は下記コマンドで必要ライブラリをインストールしてください。

```
> pip install pypiwin32
```


# スクリプト

```python:sr50.py
import time
import win32com.client

def main():
    wshell = win32com.client.Dispatch('WScript.Shell')
    # 起動済みのFirefoxブラウザをアクティブWindowにする
    wshell.AppActivate('Firefox')
    # テスト用
    #shell.AppActivate('メモ帳')
    # 1秒待つ
    time.sleep(1)

    # 50ループ
    for cnt in range(50):
        # カウンタ値を1ずらし
        cnt+=1
        # 連続入力対策で 2秒待ち
        time.sleep(2)
        # 確認用
        print(cnt)
        #50カウントキー出力
        wshell.SendKeys(str(cnt) + '\n')


if __name__ == '__main__':
    main()
```

# 使い方

予めブラウザで SHOWROOM の画面を開き、テキストボックスにカーソルを移動しておきます。
その後、下記 Python スクリプトを実行すると 50 カウントが開始されます。

ブラウザは Firefox 用に作ってますが、AppActivate の引数を変えることで他ブラウザにも対応できると思います。
※引数に指定する名前はタスクマネージャーのプロセス一覧に表示される名前となります


# 参考サイト

<a href="https://www.showroom-live.com/">SHOWROOM(ショールーム)</a>
<a href="https://studyappli.com/entry/showroom-comment-50count-4">SHOWROOMの『カウント』とは？50カウントの意味と効果まとめ</a>
<a href="https://www.atmarkit.co.jp/ait/articles/0407/08/news101.html">@IT Windows管理者のためのWindows Script Host入門</a>
Linuxって何のためにあるの？

# Linuxって何？
結論から言うと**OSの１種**。
OS(Operating System)というのは身近に割とあります。
以下、具体例
・キーボードを打ったら文字が出る。
・タッチパネルやマウスなどで操作できる
・イヤホンをさしたら、イヤホンから音が聞こる
この当たり前みたいな機能を提供してくれているものと認識してください。

# Linuxの特徴
①誰でも自由に使えて無料
②品質は高いため、世界からの信頼性は高い
③操作が自動化になるための仕組みがあり、サーバー運用が容易になる。
デメリットももちろんあるのですが、メリットの方が大きいかなと思います。
デメリットは日本語対応があまりされてないとかそれくらいですかね。そんなにないです。
ここでディストリビューションとパッケージ・マネージャについてまとめておきます。
**必ず必要になる知識**です。
## ディストリビューションとは
LinuxはOSの中核である「カーネル」と他のソフトで出来上がっています。
※カーネルって何なの？って思った方は下のリンク（▶︎）をクリックしてください。説明しています。
<details><summary>カーネルとは、</summary>OSの中で大事な役割を果たしているものです。このカーネルがないとパソコンとして成り立たないというくらいに大事です。**ただ、カーネルだけいても意味がありません。**その他のソフトウェアと連携してこそ、力を発揮してくれるような存在です。まあ、**ソフトウェアの中心人物**なんだなぁというくらいの認識で十分です。</details>
ただ、このカーネルと他のソフトを連携して…という作業は一般ユーザーにはきついです。
**最初からカーネルとソフトウェアが連携されているものがディストリビューション**と呼ばれるものです。便利だね！
##パッケージ・マネージャ
結論から言うと、**コンピューターに何のソフトウェアがインストールされたかを記録して、更新・削除を容易にしてくれる**ものです。
※ちなみにAmazon Linuxではyumコマンドを用いて、パッケージのインストール・更新ができます。
以下、参考例です

```terminal
# パッケージをインストールする
% yum install [ファイル名]

# システムにインストールされているパッケージをアップデートする
% yum update

# パッケージをアンインストールする
% yum remove [ファイル名]

# サーバーにあるパッケージを一覧する
% yum lis
```
[Joke] God Activity Architectureの奨め

God Activity Architecture(GAA)は、Activity内に全てのコードを配置するアーキテクチャです。MVPと比べてみましょう。

# MVP
![mvp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/4b217037-7aa8-34b0-6f7d-6e80b34e4612.png)

# GAA
![gaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/ee15af0a-8ba1-7b90-9ae6-3de77c4ab187.png)

# 長所

ファイルを探したり、あちこちのファイルを行き来しなくてよくなります。パッケージやプロジェクト構成、命名などで悩む必要もありません。

学習コストも最低です。Hello Worldができたらもう習得済みです。たぶんAndroid開発者なら誰でも一番最初に採用するアーキテクチャでしょう。

# 短所と対策

GAAを使うとUnitTestはほぼ不可能になります。これは短所ですが、実は利点もあります。単体テストは不可能だと主張できます。よってテストにかかるコストは100%カットできます。

また、GAAを使ったコードは、よく以下に例えられます。
![spaghetti.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/59798c06-b69e-6fa5-dc62-28b8a1e19bc2.jpeg)
GAAを使うと、コードはスパゲッティ級の密結合になります。リファクタリングや引継ぎは困難です。が、そもそもGAAは1人のエンジニアが開発/保守することしか想定してません。スパゲッティを作るには1人で充分ですよね！

# 最後に

もちろんジョーク記事です。間違ってもチーム開発にGAAを採用しないでください。チーム開発には、それに見合ったアーキテクチャを選びましょう！

# 参考記事

* God Activity Architecture — One Architecture To Rule Them All
  * [元ネタ](https://medium.com/@taylorcase19/god-activity-architecture-one-architecture-to-rule-them-all-62fcd4c0c1d5) / [Reddit](https://www.reddit.com/r/mAndroidDev/comments/dd9ynp/god_activity_architecture_one_architecture_to/)
PostgreSQLのデータベースクラスタ内のサブディレクトリや設定ファイルの役割（１、ディレクトリ構造を確認）

##はじめに
OSS-DB silverの勉強をしていて、知識だけでは理解がなかなか進まないという印象を受けたので、Dockerで立ち上げたPostgresを操作しながら理解を深めようと思います。
こちらでは、操作した結果を合わせて書いていきます。

##使用環境
・Docker
・postgres:11-alpin
https://hub.docker.com/_/postgres


##データベースクラスタとは何か
PostgreSQLにおけるデータベースの格納領域の事を指します。
####データベースベースクラスタの場所とディレクトリ構成を確認しよう
データベースクラスタは、PostgreSQLにおけるデータベースの格納領域で、実体はファイルシステム上のディレクトリです。パスはPGDATAで表記されます。

実際にdockerコンテナ内で確認します。

``` zsh
#postgresはコンテナ名 ユーザーはpostgresでログイン
% docker exec -it  --user=postgres postgres bin/bash 
```

```bash
#データベースクラスタの場所を確認(PGDATA=の中身)
$ set
~
PGDATA=/var/lib/postgresql/data
~

#データベースクラスタの場所に移動
$　cd /var/lib/postgresql/data

#data内をtreeで確認
$ tree -L 1
.
├── PG_VERSION 
├── base          #データベースごとのサブディレクトリを保有するサブディレクトリ
├── global        #pg_databaseのようなクラスタで共有するテーブルを保有するサブディレクトリ
├── pg_commit_ts  #トランザクションのコミット時刻のデータを保有するサブディレクトリ
├── pg_dynshmem   #動的共有メモリサブシステムで使われるファイルを保有するサブディレクトリ
├── pg_hba.conf   #PostgreSQL に接続するクライアントの認証に関する設定を記述するファイル
├── pg_ident.conf #Ident認証のユーザー名をPostgreSQLのロール名にマッピングするためのファイル
├── pg_logical    #論理デコードのための状態データを保有するサブディレクトリ
├── pg_multixact  #マルチトランザクション状態のデータを保有するサブディレクトリ（共有行ロックで使用される）
├── pg_notify     #LISTEN/NOTIFY状態データを保有するサブディレクトリ
├── pg_replslot   #レプリケーションスロットデータを保有するサブディレクトリ
├── pg_serial     #コミットされたシリアライザブルトランザクションに関する情報を保有するサブディレクトリ
├── pg_snapshots  #エキスポートされたスナップショットを保有するサブディレクトリ
├── pg_stat       #統計サブシステム用の永続ファイルを保有するサブディレクトリ
├── pg_stat_tmp   #統計サブシステム用の一時ファイルを保有するサブディレクトリ
├── pg_subtrans   #サブトランザクションの状態のデータを保有するサブディレクトリ
├── pg_tblspc     #テーブル空間へのシンボリックリンクを保有するサブディレクトリ
├── pg_twophase   #プリペアドトランザクション用の状態ファイルを保有するサブディレクトリ
├── pg_wal        #WAL（ログ先行書き込み）ファイルを保有するサブディレクトリ
├── pg_xact       #トランザクションのコミット状態のデータを保有するサブディレクトリ  
├── postgresql.auto.conf #ALTER SYSTEMにより設定された設定パラメータを格納するのに使われるファイル
├── postgresql.conf #PostgreSQLのパラメータを設定するファイル
├── postmaster.opts #最後にサーバを起動した時のコマンドラインオプションを記録するファイル
└── postmaster.pid  #現在のpostmasterプロセスID（PID）、クラスタのデータディレクトリパス、postmaster起動時のタイムスタンプ、ポート番号、共有メモリのセグメントIDを記録するロックファイル
```
最後にtreeで確認したdata配下がデータベースクラスタのディレクトリ構成となっています。


#終わりに
このデータベースクラスタはPostgreSQLサーバーと1対1で対応します。
1つのPostgreSQLサーバーは、1つのデータベースクラスタだけを使って、データベースサービスを提供します。
PostgreSQLの操作によって、このデータベースクラスタ内にどういったデータが保存されるか、また設定ファイルの変更内容がPostgreSQLにどう影響するかは下記記事で書いていきます（途中）

１、ディレクトリ構造を確認
[２、PG_VERSION、baseの役割](https://qiita.com/michi-michi/items/dd33d3e1e831d0d79b35)
[３、globalの役割](https://qiita.com/michi-michi/items/c3ca6b1efe13e3a3af84)
[４、pg_commit_tsの役割](https://qiita.com/michi-michi/items/dc9ca80a12aa58be3cd1)
[5、pg_dynshmemの役割](https://qiita.com/michi-michi/items/5da6f480808dc6eda3f7)
OpenJDK11 のソースをビルドするシェルスクリプト

OpenJDK11 のソースを CentOS 7.2 上でデバッグオプション付きでビルドするシェルスクリプトです。

# 確認環境
Windows10
VirtualBox 5.2
Vagrant 2.2.0
ゲストOS CentOS 7.2 (cpu 2、メモリ 4GB 、ディスク 100GB)
OpenJDK11 jdk-11+28

# シェルスクリプト

```
#!/bin/sh

yum -y update 
yum -y install java-11-openjdk-devel
yum groupinstall -y "Development Tools"
yum install -y libXtst-devel libXt-devel libXrender-devel libXi-devel cups-devel  fontconfig-devel  alsa-lib-devel
yum -y install epel-release
yum -y install python-devel python-pip
pip install -U pip  
pip install mercurial 

hg clone http://hg.openjdk.java.net/jdk/jdk11 -r jdk-11+28
cd jdk11
bash configure --with-debug-level=slowdebug --with-native-debug-symbols=internal
make CONF=linux-x86_64-normal-server-slowdebug all
build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version
```

# 補足
javaコマンドなどバイナリは 
/root/jdk11/build/linux-x86_64-normal-server-slowdebug/jdk/bin
配下に生成されます。

```
[root@localhost bin]# /root/jdk11/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version
openjdk version "11-internal" 2018-09-25
OpenJDK Runtime Environment (slowdebug build 11-internal+0-adhoc.root.jdk11)
OpenJDK 64-Bit Server VM (slowdebug build 11-internal+0-adhoc.root.jdk11, mixed mode)
```
Cloud SQLのインスタンスに接続してリモート上のDB環境をローカルに再現する

## 概要

Cloud SQLのインスタンスに接続してリモート上のDB環境をローカルに再現したい。

[前提]
ローカル環境はdockerでpostgresを使用。
## 準備編

Cloud SQLプロキシをローカルにinstall。
https://cloud.google.com/sql/docs/postgres/quickstart-proxy-test?hl=ja

ローカルにinstallすることで、簡単にリモート上のDBに接続できるようになる。

```sql
cloud_sql_proxy -instances=インスタンス名=tcp:5432 ;
```

上記で、ローカルからインスタンスに接続。

```sql
psql -h localhost -p 5432 -U postgres -d postgres
```

postgresで接続。

ちなみに、オプションの意味も載せとく。（忘れがちなので）

`-d: データベース名(未指定だと、ログインユーザー名のデータベースに接続する)`

`-U: ユーザ名(未指定だと、ログインユーザー名になる)`

`-h: ホスト名(未指定だと、localhostになる)`

```sql
\l
```

でデータベース一覧を確認し、dumpしたいDBが存在するか確認。

※場合によってはpasswordを求められるかも

## dump編


```sql
pg_dump -h localhost -p 5432 -U　ユーザー名　DB名 > dump.sql
```

dumpファイルを作成する。(今回だと`dump.sql`というファイル名)

```sh

docker cp ./dump.sql コンテナのDB名:dump.sql
```

ローカルではコンテナを使っているので、

dumpしたファイルをローカルのDBコンテナにコピーする。

```sh

docker exec -it コンテナのDB名 sh
```

コピーしたDBコンテナに入る

一応lsでちゃんと`dump.sql`が入っているか確認もするといいかも。

```sh

psql -U postgres -d DB名 < dump.sql
```

`dump.sql`の存在が確認できたら、上記コマンドdumpファイルをローカルに再現。

## 参考資料
https://cloud.google.com/sql/docs/postgres/quickstart-proxy-test?hl=ja
https://qiita.com/rice_american/items/ceae28dad13c3977e3a8
PowerShell で Power BI サービスから pbix をダウンロードする

Power BI サービスは pbix ファイルを UI でダウンロードできます。

[Power BI サービスから Power BI Desktop にレポートをダウンロードする ](https://docs.microsoft.com/ja-jp/power-bi/service-export-to-pbix)

[Power BI Rest API: Reports - Export Report](https://docs.microsoft.com/en-us/rest/api/power-bi/reports/exportreport)

今回は上記 API を PowerShell モジュールから実行して pbix ファイルを取得します。

# Report Id 確認

Power BI サービスでレポートを開き、report id を確認。
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/yq61tf9o8qdue90mhhml.jpg)

# PowerShell

PowerShell を管理者権限で実行して、PowerBI モジュールをインストール。

```powershell
Install-Module -Name MicrosoftPowerBIMgmt
```

Power BI サービスにログイン。

```powershell
Login-PowerBI
```

pbix ファイルのダウンロード。

- ReportId と OutFile を環境に合わせて書き替え

```powershell
$date = (Get-Date).ToString("yyyyMMdd")
$ReportId = "960e6b3d-b1ce-49fb-8e87-201d6e02f1e0"
$OutFile = "C:\Users\kenakamu\Desktop\test$date.pbix"

Invoke-PowerBIRestMethod -Method GET `
-Url https://api.powerbi.com/v1.0/myorg/reports/${ReportId}/Export `
-ContentType "application/zip" -OutFile $OutFile
```
同じファイル名があると失敗するため注意。
SimpleSAMLphpを呼び出すとセッションが切り替わる！？

#はじめに
PHPでSimpleSAMLphpを使ってSAML認証を実装するときに、セッションでどはまりしちゃったので、
同じ犠牲者が出ないようにメモを残しておきます。

##SimpleSAMLphpのセッションに切り替わる
自身でPHPのセッションを開始させ使っていても、
SimpleSAMLphpの処理を呼び出すと、
それ以降SimpleSAMLphpのセッションに勝手に切り替わります。

ここで厄介なのが、切り替わった後は自身で開始させたセッションが使えなくなってしまうってこと。

そこで、再度自身のセッションに切り替えるためのおまじないが
**SimpleSAML_Session::getSessionFromRequest()->cleanup();**
です！

```Sample.php
session_start(); //自身でセッションを開始させる

$auth = new \SimpleSAML\Auth\Simple('default-sp'); //Simpleをインスタンス化
$auth->requireAuth(); //認証処理呼び出す → ここでSimpleSAMLphpのセッションに切り替わる

$_SESSION['key'] = 'value'; //自身のセッションは使えないのでエラーになる

SimpleSAML_Session::getSessionFromRequest()->cleanup(); //セッションを切り替えるおまじない

$_SESSION['key'] = 'value'; //今度はちゃんとvalueをセッションに保存できる

```



たった１行で解決できることに１日を費やしてしまった、、。

##おわりに
このおまじないは以下ページで紹介されてますよ
[SimpleSAMLphp SP API reference](https://simplesamlphp.org/docs/development/simplesamlphp-sp-api)

SimpleSAMLphpは脆弱性があるって2019年にアナウンスされてたと思うので、使うときはそこらへん注意が必要かもです。
SharedPreferencesはprocess間共有できない

# 発生事象
SharedPreferencesで古い値を取得してしまうことがあった。（毎回ではないところがバグに気付きにくかった・・・）

# 原因
今回、AlarmManagerを使用してBroadcastReceiver内でSharedPreferencesの値を使用しており、AlarmManagerのサンプルでは以下のようになっていることが多く、それを深く考えずそのまま使用してしまっていたので別プロセスでのアクセスになってしまっていた。

SharedPreferencesはドキュメントにもあるように、マルチプロセスでの動作を保証していない。
`Note: This class does not support use across multiple processes.`
[SharedPreferences](https://developer.android.com/reference/android/content/SharedPreferences.html)

```xml
<receiver
  android:name=".AlarmReceiver"
  android:process=":remote" />
```

# 解決
実際、別プロセスで扱う必要はなかったのでprocess指定を外すことで常に最新の値を取得することができるようになった。

# 別プロセスで扱いたい場合に考えること
* MODE_MULTI_PROCESSはdeprecatedになっているので良くない
* ContentProviderを使う
* SharedPreferencesではなく別のものを使う（SQLiteとかライブラリとか何が良いかは値によって判断）

# まとめ
基本的なことですが、サンプルなどを引っ張ってきて実装するときはコードの意味をきちんと理解しないとダメですね。

# 参考
BroadcastReceiverにprocess =":remote"をつける必要があるかどうかについて
[Should I use android: process =“:remote” in my receiver?](https://stackoverflow.com/questions/4311069/should-i-use-android-process-remote-in-my-receiver)
Cent OS 8でApache httpd2.4とTomcat9の連携方法

#はじめに
[Cent OS 8にApache httpd2.4の最新版をソースからインストール](https://qiita.com/t_skri/items/3cd0d92b2d0ac50386e9)
[Cent OS 8にTomcat 9をインストール](https://qiita.com/t_skri/items/3d9f2d425ae1f1b4c417)
こちらでインストールした2つを連携させます。

Tomcat:v9.0.31以降、デフォルト値が変わっていますので注意が必要です。

#環境
- Cent OS 8
- Apache httpd:v2.4.43
- Apache Tomcat:v9.0.34

#httpdの設定変更
httpd.confの変更と、httpd-proxy.confを作成します。

##httpd.conf変更
```Bash
vi /usr/local/apache2/conf/httpd.conf
```

```
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
```

こちらがコメントアウトされていますので、コメントアウトを外して有効化します。

次に作成するhttpd-proxy.confを読み込むため、末尾に以下の内容を追記します。

```
Include conf/extra/httpd-proxy.conf
```

##httpd-proxy.conf作成
連携したいパスを指定します。

```Bash
vi /usr/local/apache2/conf/extra/httpd-proxy.conf
```

```httpd-proxy.conf
<Location /docs/>
  ProxyPass ajp://127.0.0.1:8009/docs/
</Location>
```

##再起動

```Bash
systemctl restart httpd
```

#Tomcatの設定変更
server.xmlの設定を変更します。

```Bash
vi /opt/apache-tomcat/conf/server.xml
```

```
<Connector protocol="AJP/1.3"
           address="::1"
           port="8009"
           secretRequired="false"
           redirectPort="8443" />
```
AJPに関する項目がコメントアウトされていますので、コメントアウトを外して有効化します。
非セキュアですが、secretRequiredオプションをfalseにする必要があります。
ネットワーク環境によっては、「address="::1"」を取らないと動作しないことがあります。


```
<!--
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
-->
```
Tomcatのデフォルトポート(ポート番号8080)が有効になっていますので、上記設定をコメントアウトします。


##再起動

```Bash
systemctl restart tomcat
```

#動作確認
ポート番号を取り除いたアドレスでアクセス出来ればOKです。
http://hostname/docs/

#まとめ
以上でApache httpd2.4とTomcat9の連携が出来る様になりました。
Leap MotionにてキャリブレーションがBADのまま、何も出来ない

LeapMotionを使い始めた際にキャリブレーションが上手くいかなくて何度かやり直したら、認識しているがキャリブレーションがBADのまま何も出来ない状態に陥ってしまう症状に出くわしました。
折角なので復旧方法を残しておきます。

#症状
- コントロールパネルのDevice Status
 - Service Status [Connected]
 - Device Statsu [**Disconnected**]
 - Calibration Status [**BAD**]
 - 以下グレーアウト

- デバイスマネージャー上は、「ユニバーサルシリアルバスデバイス」の項目に「LeapMotion Controller」がある
 - 「West Bridge」表記ではない
- Firmware Reset Toolは、「ResourceHost running」のまま進まない

- タスクトレイアイコンはオレンジ、本体LEDはグリーン点灯

#環境
- Windows10 Pro 1809
- Leap_Motion_Developer_Kit_4.0.0+52173
- Firmware 1.7.0

#対処法
結論から書くと、4.0のソフトウェアをアンインストール後「**LeapDeveloperKit_3.2.1+45911_win**」をインストールし、キャリブレーションをやり直す事で復旧しました。

公式サイトでV2としてダウンロードできる「LeapDeveloperKit_2.3.1+31549_win」ではダメで、3.2.1である必要があります。


#参考URL
- [LeapMotion Forums/Leap Motion icon on task bar has orange light on but cannot calibrate](https://forums.leapmotion.com/t/leap-motion-icon-on-task-bar-has-orange-light-on-but-cannot-calibrate/7946)
- [Leap Motion Orion 3.2.1](https://developer.leapmotion.com/releases/leap-motion-orion-321)
HerokuにMeCabを入れる際ハマっていた記録


#目的

flaskにpandas、plotly、MeCabを入れHerokuで簡単なwebアプリケーションを立ち上げ、簡単な形態素解析と集計をどこからでもできるようにしようとした。

Herokuのデプロイでハマったので、忘れないように記録。

#環境
Windows10
Python3.7
Anaconda

#やったこと
flask準備省略。
ローカルでは問題なし。


```python:main.py　テスト用コード（xlsx入力、plotly出力、html出力部分は省略）
# -*- coding: utf-8 -*-
import os
import csv
from flask import *
from werkzeug.utils import secure_filename
import pandas as pd
import plotly
import pathlib
import MeCab

app = Flask(__name__)

@app.route("/")
def init():
    cmd = "pip freeze"
    out = os.popen(cmd).read()
    return out

@app.route("/0")
def mecab():
    sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。
これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。"""
    t = MeCab.Tagger('')
    out = t.parse(sentence)
    return out

if __name__ == '__main__':
    app.run()
```

```:requirements.txt
gunicorn==19.9.0
click==7.1.1
Flask==1.1.2
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
numpy==1.18.3
pandas==1.0.3
plotly==4.6.0
python-dateutil==2.8.1
pytz==2019.3
retrying==1.3.3
six==1.14.0
Werkzeug==1.0.1
xlrd==1.2.0
mecab-python3
```

```:Procfile
web: gunicorn main:app
```

```:.buildpacks
https://github.com/sunny4381/heroku-buildpack-linuxbrew.git
```

```:.cellar
mecab
mecab-ipadic
```

```
$ git init
$ heroku create flask-mecab-heroku
$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-multi
$ heroku config:add LD_LIBRARY_PATH=/app/.linuxbrew/lib
$ heroku config:set MECAB_PATH=/app/.linuxbrew/lib/libmecab.so
$ git add .
$ git commit -m "first"
$ git push heroku master
```

参照　
herokuでpython+django+scikit-learn+mecab(1)
https://qiita.com/kenchin110100/items/6f1c84ac8858525fffc5

#問題
Linuxbrewでmecabのインストールはできるが、pipが動かない。
pipでパッケージのインストールはできるが、Linuxbrewが動かない。

#解決
$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-multi
ではうまく動かない。
複数のbuildpackをセットする必要があった。

```
$ git init
$ heroku create flask-mecab-heroku2
$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git
$ heroku buildpacks:add --index 2 heroku/python
$ heroku config:add LD_LIBRARY_PATH=/app/.linuxbrew/lib
$ heroku config:set MECAB_PATH=/app/.linuxbrew/lib/libmecab.so
$ git add .
$ git commit -m "first"
$ git push heroku master
```
出力
https://flask-mecab-heroku2.herokuapp.com/
https://flask-mecab-heroku2.herokuapp.com/0

やれやれ。これで解析ページを作ることができる。

振り返ると単純なことなのだが、わからないときはわからないのだよねぇ。
また、これが最適解かというとそうでもないような・・・

　
　


本当はこのあたりのwebアプリを作ることができるとよいのだが、herokuのメモリは500MBほどしかないのね
https://qiita.com/kzuzuo/items/d41327433c9cdc6a5fd3
https://qiita.com/kzuzuo/items/8a80d8974bf3a7db7e54
【Rails】kaminari + Bootstrapで見た目を整え、ページネーションを中央にする

# kaminariとは
* ページネーションを簡単に実装できるrailsのgemです

[GitHub/kaminari](https://github.com/amatsuda/kaminari)

## 導入方法

```ruby:gemfile
gem 'kaminari'
```
gemを追加し

```terminal:terminal
$ bundle install
```
インストール

導入はこれで完了

## 表示されたページネーションを中央に
やり方非常に簡単です

まずはテンプレートファイルを作成

```terminal:terminal
$ rails g kaminari:views default
```

もしもBootstrapを導入しているなら

```terminal:terminarl
$ rails g kaminari:views bootstrap
```

``default``ではなく``bootstrap``を選択する事で勝手に綺麗に整えてくれます

* Bootstrap4を導入しているなら``bootstrap4``にしてください

作成されたファイルをみてみると

```erb:views/kaminari/_pagenator.html.erb
<%= paginator.render do %>
  <nav>
    <ul class="pagination">
      <%= first_page_tag unless current_page.first? %>
      <%= prev_page_tag unless current_page.first? %>
      <% each_page do |page| %>
        <% if page.left_outer? || page.right_outer? || page.inside_window? %>
          <%= page_tag page %>
        <% elsif !page.was_truncated? -%>
          <%= gap_tag %>
        <% end %>
      <% end %>
      <%= next_page_tag unless current_page.last? %>
      <%= last_page_tag unless current_page.last? %>
    </ul>
  </nav>
<% end %>
```

``ul``に``class="pagination"``が当てられているので

```scss:application.scss
.pagination {
  justify-content: center;
}
```

これでページネーションが中央に表示されました！
ElastAlertでアラート通知先にAWS SNSを使った時のメモ

# ドキュメントの記載が古かった

実際は

・sns_topic_arnとaws_region
　現在もこの設定でOK
・aws_access_key
　aws_access_key_idになっていた
・aws_secret_key
　aws_secret_access_keyになっていた
・profile
　試していないが、[ソースコード](https://github.com/Yelp/elastalert/blob/master/elastalert/alerts.py)みた感じでは「aws_profile」になっているようだった

https://elastalert.readthedocs.io/en/latest/ruletypes.html#sns

>sns_topic_arn: The SNS topic’s ARN. For example, arn:aws:sns:us-east-1:123456789:somesnstopic
>
>Optional:
>
>aws_access_key: An access key to connect to SNS with.
>
>aws_secret_key: The secret key associated with the access key.
>
>aws_region: The AWS region in which the SNS resource is located. Default is us-east-1
>
>profile: The AWS profile to use. If none specified, the default will be used.

# 動作する設定の書き方

以下のように「aws_region」だけsnsにネストした形で書かないとうまく動かなかった。理由は以下のissueに参照。
[SNS alert ERROR #674](https://github.com/Yelp/elastalert/issues/674)

```
alert:
  - sns:
      # example, aws_region: "ap-northeast-1"
      aws_region: "~aws region name~"
# example, arn:aws:sns:us-east-1:123456789:somesnstopic
sns_topic_arn: "arn:aws:sns:~aws region name~:~id~:~topic name~"
aws_access_key_id: "~my access key~"
aws_secret_access_key: "~my secret key~"
```

ちなみに実際に設定した値ではありません。動かす環境で違う設定になるので、動かす環境の値を指定してください。

# aws_profileの使い方が間違っている(2020/5/10追記)

[alerts.py](https://github.com/Yelp/elastalert/blob/master/elastalert/alerts.py)がバグっている。
profileを使う場合、aws_access_key_id、aws_secret_access_key、regionを外部ファイルであるprofileに記載できる。
ただし、現在の実装ではaws_access_key_id、aws_secret_access_key、region、profileをすべて指定する前提になっている。
profileがどういうものか理解していれば、以下の修正案のような実装になるはずなのである。


修正前

```alerts.py(対象のコードのところ(948～956行目))
    def alert(self, matches):
        body = self.create_alert_body(matches)

        session = boto3.Session(
            aws_access_key_id=self.aws_access_key_id,
            aws_secret_access_key=self.aws_secret_access_key,
            region_name=self.aws_region,
            profile_name=self.profile
        )
```

修正案

```alerts.py(対象のコードのところ(948～956行目))
    def alert(self, matches):
        body = self.create_alert_body(matches)

        if self.profile is None:
            session = boto3.Session(
                aws_access_key_id=self.aws_access_key_id,
                aws_secret_access_key=self.aws_secret_access_key,
                region_name=self.aws_region
            )
        else:
            session = boto3.Session(profile_name=self.profile)

```


```sh
# Create ~/.aws/credentials

[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

# Create ~/.aws/config

[default]
region = us-east-1

# alert rule setting

alert:
  - sns
sns_topic_arn: "arn:aws:sns:~aws region name~:~id~:~topic name~"
aws_profile: "default" # profile name
```
SwiftUIでUITabBarControllerを使う

SwiftUIでTabViewを使うと、タブの切り替えごとに画面を再生成するし、スクロール位置が上に戻っちゃうとかいろいろ問題あるので、UIKitのUITabBarControllerを使った。

タブで切り替えるSwiftUIのViewはUIHostingControllerを使ってラッピングします。

```swift
struct ContentView: View {
    var body: some View {
      TabBarControllerView()
    }
}

struct TabBarControllerView: UIViewControllerRepresentable {
    
    func makeUIViewController(context: Context) -> UITabBarController {
        let controller = UITabBarController()
        
        let vc1 = UIHostingController(rootView: TabView1)
        vc1.tabBarItem = UITabBarItem(title: "tab1", image: UIImage(named: "tab-icon-sample"), tag: 1)
        
        let vc2 = UIHostingController(rootView: TabView2)
        vc2.tabBarItem = UITabBarItem(title: "tab2", image: UIImage(named: "tab-icon-sample"), tag: 2)
        
        let vcs = [vc1, vc2]
        controller.setViewControllers(vcs, animated: true)
        return controller
    }

    func updateUIViewController(_ uiViewController: UITabBarController, context: Context) {
    }
}
```

UIViewControllerRepresentableを使ってUITabBarControllerをラッピングしています。
STM32F3のオペアンプをPGAモードで動かす

[前回、DACから正弦波を出せるようになった](https://qiita.com/amutou/items/3d055f264e109abdcb2d)ので、それを利用してPGA(Programmable Gain Amplifier)の動作を確認します。

***

前回、DACは12bitでオフセット2048、振幅±1024、という設定でした。今回はアンプで増幅するので、振幅は±256、オフセットも256、という設定にします。これにより、0Vから0.41Vの正弦波を出力できます。ただし、DACのバッファを有効にしているとレールツーレールでスイングしてくれないので、DAC_OUTPUTBUFFER_DISABLEでバッファを無効にしています。

***

STM32F3のオペアンプはレジスタ1本で、最低限使うならそのうちの半分ほどを設定すれば十分なのですが、これが意外と曲者なので、おとなしくHALを使うことにします。とはいえ、HALも曲者なので、構造体の宣言ではクリアとInstanceの設定だけして、必要なところだけ設定します。

```c++
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_SYSCFG_CLK_ENABLE();

GPIO_InitTypeDef gpio_port_A{.Pin = GPIO_PIN_4, .Mode = GPIO_MODE_ANALOG};
GPIO_InitTypeDef gpio_port_B{.Pin = GPIO_PIN_12, .Mode = GPIO_MODE_ANALOG};
HAL_GPIO_Init(GPIOB, &gpio_port_A);
HAL_GPIO_Init(GPIOB, &gpio_port_B);

OPAMP_HandleTypeDef hopamp = {.Instance = OPAMP4};

hopamp.Init.Mode = OPAMP_PGA_MODE;
hopamp.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO2; // PA4 (DAC1 ch1)
hopamp.Init.PgaGain = OPAMP_PGA_GAIN_2;

HAL_OPAMP_Init(&hopamp);
HAL_OPAMP_Start(&hopamp);
```

PA4は前回DACの出力ポートとして初期化済みですが、コピペしたときに忘れると困るので、ここでも初期化しています。

とりあえずPGAモード、入力にPA4、ゲインは2、という設定でInitとStartを行います。

***

上からゲイン2、4、8、16、のときの、DAC出力(黄)とPGA出力(紫)です。

![SDS00001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/3d93382c-5b9b-f38b-a84d-a6f500e2c5f3.png)
![SDS00002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/27532086-286c-0f82-31b9-ee96c9ca6d00.png)
![SDS00003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/e7b8627c-c5ea-d7af-31c5-95a5a9ecbb6f.png)
![SDS00004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/2eade990-0925-17a4-b3f8-6e50e1e2db7d.png)

DACの振幅は0.46V程度で、ゲイン2では0.8V、4では1.6V、8では3.2V、と、設定どおりに増幅されています。ゲイン16は飽和してしまうため、上が切れた波形として出ています。

STM32F3のPGAは、ローサイドのシャントを受けることを想定しているのか、0Vを中心に増幅します。小型マイクのような物を使いたい場合は、結構面倒になりそうです。おとなしく固定ゲインの反転増幅回路とか組んだほうが楽だと思います。

***

PGAはもうちょっと多機能で、いろいろな使い方ができますが、面倒なので今回は扱いません。
dockerですでに80ポートが使われていてnginxが立ち上がらなかった

# dockerでnginxが立ち上がらなくなった
## 環境
- Mac Catalina 10.15.3
- docker 10.15.3

## エラー内容
違うPCで久しぶりにdockerを使ったら、nginxが立ち上がらなくなった。

```shell
$ docker-compose up -d nginx mysql phpmyadmin workspace
Starting jmro-laradock_docker-in-docker_1 ... done
Starting jmro-laradock_mysql_1            ... done
Starting jmro-laradock_workspace_1        ... done
Starting jmro-laradock_phpmyadmin_1       ... done
Starting jmro-laradock_php-fpm_1          ... done
Starting jmro-laradock_nginx_1            ... 
Starting jmro-laradock_nginx_1            ... error

ERROR: for jmro-laradock_nginx_1  Cannot start service nginx: driver failed programming external connectivity on endpoint nginx_1 (fd8a8299d3337d4a655f4bb78958492a803605d772ee3d7c790addda69ff1386): Bind for 0.0.0.0:80 failed: port is already allocated
```
む、、、すでに80ポートが使われている！？
他に立ち上げた覚えがない。


##対応方法
###まずはpsで何が立ち上がってるか確認

```shell

$ docker ps
a8b4949d9a7f        wordpress:latest           "docker-entrypoint.s…"   5 months ago        Up 14 seconds       0.0.0.0:80->80/tcp                  hlw-wp
```
犯人発見！
どうやら自動起動の設定を書いてしまっていたらしい。
一応下記のコマンドで自動起動になっているコンテナを確認。

###dockerで自動起動有効になってるものを表示
```shell
$ docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always
/hlw-wp always
/hlw-db always
```

###自動起動を停止
```shell

$ docker update --restart=no hlw_wp
$ docker update --restart=no hlw_db
```

###再度チャレンジ
```shell
$ docker-compose up -d nginx mysql phpmyadmin workspace                                                                                
Starting jmro-laradock_mysql_1            ... done
Starting jmro-laradock_docker-in-docker_1 ... done
Starting jmro-laradock_workspace_1        ... done
Starting jmro-laradock_phpmyadmin_1       ... done
Starting jmro-laradock_php-fpm_1          ... done
Starting jmro-laradock_nginx_1            ... done
```
立ち上がった。
html 基礎・基本　htmlの仕組み＃２

前回に引き続きwebフロント技術を学ぶ過程をメモとして書き残したものです。
読みにくかったり、わかりずらいとこも多いと思いますが、そういうところは質問お願いします。

なんか、前回と比べて内容が簡易化してるところが見えるかもしれませんが、自分が学んでる教材の問題なので気楽に読み流してください。
最初の部分は意味不明な内容があり少し書き方が雑です。

## いろいろな仕組み
ウェブブラウザでは拡張子によってその描写方法を変更している
- `.txt` - テキストファイルとしてそのまま表示
- `.html` - HTMLファイルとして表示

そして、ブラウザがhtmlのタグを理解して、それに応じた描写変更を行っている
HTMLでは使えるタグが明確に決められており
- `h1`:見出し
- `a`:リンク
- `p`:段落
などがあります

このように、HTMLを理解して描写する機能をHTMLレンダリングエンジンという。
この機能を持つアプリケーションとして、IE,Chromeなどのブラウザがある。

##段落と改行！
急に話は変わりますが、htmlにおいては
- 改行
- 連続する空白(半角スペース)
これらはすべて、単一の半角スペースとして扱う。
そのため段落を適切に改行してやることが大切。`P`タグを使ってあげよう！
また、段落の中で改行したくなった時には`<br>`を使って改行できます。

##リンクを埋め込む
webページを扱って大事になってくる機能としてリンクがあります。
htmlにおいてリンクを埋め込むためには`a`タグを利用します。
`<a href="url"> </a>`
タグの中の`href`のところにurlを情報として付けれます。
この`href`のように属性に対して情報をつけ加えるものを属性といいます。
前回の、ノートのリンクをはっつけてみました！
<a href="https://qiita.com/nol_miryuu/items/0db3ab7cf6d6e3b44533">おすとー</a>飛ぶよ？

##画像を埋め込む！
次は、またまたwebページにおいては重要な画像を埋め込むところです。
画像を表示するためのタグとして、`img`タグがあります。
また、`src`属性がありここにurlを指定します。
`<img src=" ">`

##htmlを書く際に守るべきルールがいくつかあります。
まずは、DOCTYPE宣言です
htmlの文頭に記載します。
これは、タグではなく使用しているhtmlのバージョンを示すものです。
`<!DOCTYPE html>`


##htmlにおいて、重要になる３つのタグがあります。
`html`,`head`,`body`の三つです
文章に関する情報を記載するhead
文章本体を記載するbody
と、部分において分離します。
- `html`:文書全体を囲むタグ
- `head`:文書に関する情報を記載する部分を表すタグ
- `body`:文書本文を記載する部分を表すタグ

この、三つのタグは省略は可能ですが、特に理由がなければ常に書くようにしましょう
また、文書を作る際にインデントを使うことでhtmlの全体構造を視的に認識しやすくなる
ので活用するのがおすすめです。

##文字コードの指定！
htmlにおいても文字コードのしては大事です。
せっかく書いた文も読み込みが正確に行われなければ、ただの遺物書と化すでしょう
htmlの`head`内でファイルに記述されている文字コードを宣言します
文字コードの宣言では`meta`タグを使って`charset`属性に文字コードを指定します。
特に理由がない限りは`utf-8`になると思います。
`<meta charset="utf-8">`


##htmlにおいて色を変えていく！
背景色をなどの見た目を変更するのに、`style`という属性を追加する
`style`はすべてのタグに追加が可能な属性になっている
- `background-color:red;` 背景色を赤にする
- `color:white;` 文字色を白にする
- `border: solid 1px black;`　黒いの枠線を付ける
`<h1 style=" "></h1>`

左詰めで変だなーと思ったら間隔を調節しよ
- `padding-left:10px;` 左の余白を10pxとる

また、`style`属性で複数指定する場合は`;`で各定義を区切る。

##styleを分離する

`style`を本文中で書いていくとものすごく見た目が悪くなってきます。
`style`では指定したスタイルに要素を変えます。
少しわかりずらいのでコードを見せると、
`h1{ background-color: blue; color: white;}`
こんな感じで`h1`に対してスタイルを付けることができます。

##idを使って特定するぞ！
`id`は要素に追加できる属性の一つです。ほかの要素とは別の値を割り当てます。
`<h1 id="first"></h1>`

`idセレクタ`を利用して選択した要素を特定してスタイルを適用します
`#id { }`を使うことでid指定した`style`が適用される。

##idとclass

`id`は重複して同じ値を指定できないため、一つにしか適用できません。
そこで使うのが`class`です。
`class`の属性を使うことで複数に同時に適用が可能です。
また、使用するときは
`.class名 {}`で使用します。

##styleファイルを分ける
スタイルを外部ファイルとして参照するのに`link`タグに
属性`rel="stylesheet"`を定義して、`href`属性に参照するファイル名を指定します。
`<link href="style.css" rel="stylesheet">`

##アクションを追加する！
最後にcssと続いてくるのがjavascriptです。
buttonを利用して、押されたときに何かしらのアクションを加えていく！
`<button onclick="alert('')"</button>`
`onclick`という属性はクリック時に処理を行う。
そこに、`alert`という命令を付ける。
そうすることで、buttonにアクションを追加できる。

##scriptを分離する
css同様、scriptを文中に混ぜると著しく扱いが難しくなる。
今回は関数を定義して扱う。
関数の定義には`function`を使う。
`<script> function doClick() {}</script>`
それを、onclickなどの属性に埋め込む。


またまた、文脈がおかしなところが多々出ますが　書いてうちに直せればなと思っています。
今回の勉強はこんなところで終わらせていただきます。
ElasticSearchサーバ、Sparkサーバのlimits.confの修正

#はじめに
ElasticSearchサーバ、Sparkサーバの構築時、limit 1024は足りない場合があります。

#変更
sudo vi /etc/security/limits.conf

```
*  soft  nproc  65535
*  hard  nproc  65535
*  soft  nofile 65535
*  hard  nofile 65535
```

#再起動
`sudo reboot`

#確認
`ulimit -n`

以上