OmniAICreator/Qiita-1.07M huggingface dataset:
AVRマイコンでWDTを使って長期スリープ

#低消費電力で長期間スリープしたい
タイマーにクロックを供給すると消費電力が大きいので、WDTで復帰したい。

##方法
WDTがタイムアウト時に、リセットではなく割り込みを起こす。
割り込みの中でソフトウェアカウンタを回し、期待する時間まで再度スリープする。

##はまりどころ
WDTのタイムアウト時に、リセットフラグも同時に上がる。
割り込みの中か、直後にリセットフラグを落とさないと、システムがリセットされる。
つまり、長時間のスリープができない。

##どうするか
割り込みの中でフラグを落とす。
RSTFLRをクリアする。また、WDTCSRを再設定する。

以上
[漏洞预警]泛微Ecology OA validate.jsp SQL注入漏洞

### 前言
近日泛微官方发布了Ecology OA产品的SQL注入补丁,亚信安全网络攻防实验室对其进行了分析,成功复现了validate.jsp接口的SQL注入漏洞.
### 影响范围
ecology 8 && 9
### 利用难度
高
### 漏洞URL(无需授权)
`/cpt/manage/validate.jsp`
### 漏洞复现

使用payload分别爆出用户名以及密码(用户名为ascii,密码为ascii码状态的MD5)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/bf953762-4226-7acb-b02d-d94b78da8f65.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/736595e3-08dd-43f6-ab24-5a2c948ab7b3.png)

由此可看出用户名的ascii码为`106、105、97、110、103、100、119`,其对应的字符为`j i a n g d w`

同理可以爆出密码

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/f2af3028-7eaa-3c49-c0d9-25d9971815a2.png)

其对应的密码ascii码为`56、56、49、51、68、55、67、66、55、67、49、53、56、66、70、70、57、66、67、56、57、65、68、54、69、50、50、50、66、51、51、55`
其对应字符为`8813D7CB7C158BFF9BC89AD6E222B337`

解出其密码为`Jdwnb1234`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/13ab12f0-494a-44d2-2ee9-dd300976b441.png)

最终登录成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/76550acf-cb33-83fc-382a-bd5dd57ae351.png)

### 修复建议
泛微官方已修复,并发布SQL(1017)注入安全补丁包,请移步`https://www.weaver.com.cn/cs/securityDownload.asp`
AVRISP mk2のピン配置

# AVRISPのピン配置
忘れるのでメモ。
コネクタは、3番ピンのほうに出っ張りがある。

## ISP
| 信号 | ピン番号 | ピン番号 | 信号 |
|:-:|:-:|:-:|:-:|
| MISO | 1 | 2 | VCC |
| SCK | 3 | 4 | MOSI |
| RET | 5 | 6 | GND |

## PDI
| 信号 | ピン番号 | ピン番号 | 信号 |
|:-:|:-:|:-:|:-:|
| DATA | 1 | 2 | VCC |
| - | 3 | 4 | - |
| CLOCK| 5 | 6 | GND |

## TPI
| 信号 | ピン番号 | ピン番号 | 信号 |
|:-:|:-:|:-:|:-:|
| DATA | 1 | 2 | VCC |
| CLOCK | 3 | 4 | - |
| RESET| 5 | 6 | GND |

以上
Slack ワークフローを試してみた

[Slack ワークフローが登場した](https://slackhq.com/intl-ja-jp-automate-tasks-in-slack-with-workflow-builder) という話を聞いて、早速いじってみました。

いまのところ、トリガーは以下の三種類あります。

* メニューから実行 (Actions menu)
* メンバーがチャンネルに Join したとき (New channel member)
* 絵文字でリアクションしたとき (Emoji reaction)

メニューから実行を選択した場合、指定したチャンネルの上部にアクションボタン(カミナリマーク)が表示され、ここからワークフローを起動できます。
![upload_d7527c623f167dd6d5072f431e0574d7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57661/d608aff8-5cfc-f601-9a6d-3384a55ce6fe.png)

そして、実行できるアクションは以下の二種類です。

* メッセージを送信する (Send a message)
* フォームを表示 (Create a form)

アクションはいくつか繋げることができるので、

* ふたつのチャンネルにメッセージを送信
* あるチャンネルにメッセージを送信しつつ、DM も送る
* フォームで入力した内容をメッセージとして送信する

みたいなことができます。

## ワークフロー作ってみた

ワークフローを作るときはワークスペースのメニューから Workflow Builder を選択します。
![upload_f1a1c8ba5c96d192841151cfb0b0e7b0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57661/fcbc742b-3602-d84d-fc84-92c358ca2a15.png)

10/16夜時点ではこのメニューが出ているワークスペースと、そうでないスペースがあるのでなにかしら利用条件があるのかもしれません。フリープランだとこのメニューが出ていないように見えます。
ちなみに Permission は選択できるようで、デフォルトではゲスト以外であればワークフローを作れるようです。
![upload_032180a9a1ba0a306976736c76fb5cde.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57661/bb4f3c5f-0c4a-2283-3caa-018ba41c71ac.png)

マウスで選択肢を選んでいくだけでさくさくワークフローを作ることができます。

試しに Slack アカウント作成の申請アクションを作ってみたのがこちら。

![upload_6306d4ff2c46d48e97174208077023a0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57661/ad7aed7a-9da4-9991-244f-372efcd626cf.png)

ウィザード形式であまり悩むことがないので、ここでの紹介は端折ります。あれこれ読むより実際にビルダーを立ち上げてみましょう。

他にも Slack アカウントが増えたときのウェルカムメッセージを送る部分も作ってみました。
基本機能で実現するので、5分ぐらいで動かせます。

## 気になるところ

ローンチ直後でトリガーもアクションも少ないので、できることはとても限られています。
[Slack の事例ページ](https://slack.com/intl/ja-jp/slack-tips/workflow-builder-examples) を見ても、だいたい同じようなことをやっているように見えます。
ウェルカムメッセージを送る、依頼/報告フォームを作る あたりが利用範囲のようです。
絵文字リアクションについては使いみちがぱっと思いつきませんでした。事例でも言及されていません。

また、作成したワークフローの編集権限は個人に紐付いてしまうのはちょっと気になります。
チームで扱えるとよいのですが、今のところはこつこつ collaborator を追加していくしかなさそうです。

あと、ワークフローで投稿したメッセージには他の bot は反応しないようです。
毎週実施しているチーム内投票のアンケートフォームをアクションボタンから作ろうと考えましたが、残念ながら Simple Poll は反応してくれませんでした。

## まとめ(と希望)

ということで、ここは今後のバージョンアップでトリガーやアクション、条件分岐などが増えると面白そうです。
普段使っている GAS で書かれた bot がワークフローで置き換えられると面白そうです。

* スケジュールトリガーで、リッチなリマインダーを作ったり
* ランダム選択機能があれば、リリース当番を決めるのにも役立ちそう
* スプレッドシートにデータを保存できると、フォームの使い勝手が更に上がりそう
* 入力された内容に基づいて条件判定できると、リッチなフォームが作れそう
* 特定のパターンのコメントをトリガーに動き出せると、簡易 bot が作れそう
* Webhook が呼び出せると、あれもこれもなんでもできる

ということで、いまのところはすごいワークフローを作ることはできませんが、トリガーやアクションが増えるとそれに合わせて夢が広がっていきそうです。
Slack Workflow automation の今後に期待しましょう。
Docker(Nginx + php-fpm-alpine) + Laravel(6.0)をXdebugでステップ実行する

# 背景

タイトルどおり

## 前提条件

OSはmacOS Mojave
Docker(Nginx + php-fpm-alpine) + Laravel(6.0)の環境構築ができていること
[Laravelのローカル環境をDockerを利用してSSLからLaravel Duskの設定まで](https://qiita.com/ProjectEuropa/items/81368cae59f786cf6f0f)あたりを参考に。

## php.iniの編集(追記)

```php.ini
[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host="host.docker.internal"
xdebug.remote_port=9012
xdebug.remote_log=/var/log/xdebug.log
```

php.iniをマウント設定

```docker-compose.yml

#省略
  php-fpm:
    build: ./php-fpm
    ports:
      - 9000:9000
    volumes:
      - ../_docker-configs/xdebug/php.ini:/usr/local/etc/php/php.ini
#省略
```

## Dockerfileの編集(追記)

[php-alpineコンテナにxdebugをインストールする時にハマったメモ](https://qiita.com/ucan-lab/items/fbf021bf69896538e515)を参考に

```dockerfile

# 追記
RUN apk add autoconf build-base
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
```

## VSCodeのlaunch.jsonの編集

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9012,
            "pathMappings": {
                "/var/www/html": "${workspaceFolder}"
            },
            "ignore": [
                "**/vendor/**/*.php"
            ]
        }
    ]
}
```

あとはブレークポイントを貼ってステップ実行できればおｋ。

![スクリーンショット 2019-10-18 16.22.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/9e83a57b-7317-f709-44a4-c2ca46a684a6.png)

## 参考

[Dockerで作るNginx + PHP7 + Xdebug環境](https://crudzoo.com/blog/php-docker)
フレームワーク使ってるとコード補完してくれへんやんけ問題

C#とかJavaとかやとフツーに書いてたら、よっぽど七面倒なリフレクションしてるとか、非公開APIいじくってるとかでなければまあだいたいインテリセンスだのコード補完はええかんじに動いてくれる

ところが色々ガバガバな言語やと、フレームワーク側で各種機能がDIされたりするとき、コード上ではメンバ変数とか型がなーんも明示されてへんから、IDE側ではよーわからんわってなってコード書いてるときになんにもコード補完が出んのでしばくぞってなるやん

まあコード補完がないのは百歩譲ってええとして、だいたいIDEは~~おせっかい~~親切にも「なんやこのメンバ変数！　こんなん知らんで！　間違いちゃうけ？？」とか言ってウォーニング出してくるやん？　ほんまにこまる

phpdoc の @property を使いましょう

https://ah-2.com/2015/10/24/phpstorm_codeigniter3_autocomplete.html
TTL-232R-3V3,TTL-232R-5Vのピン配置

# TTL-232R-xxxってなに

USB-RS232の変換ケーブル。
めっちゃ便利でよく使う。
TTL-232R-5Vが5Vロジックで、TTL-232R-3V3が3.3Vロジック。
ただしVCCは両方とも5Vだ。

![M-05841.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111373/2f6d9dbe-865b-8e20-4625-d97ff72a8b72.jpeg)
http://akizukidenshi.com/catalog/g/gM-05841/

よく使う割に、ピン配置覚えてないのでメモる。

# ピン配置

|  ピン番号 | 色 | 信号 |
|----------|----|------|
|1|黒|GND|
|2|茶|CTS|
|3|赤|5V |
|4|橙|TXD|
|5|黄|RXD|
|6|緑|RTS|

以上
[ Java ] サーバクライアント通信1（未完）

今回からサーバクライアント通信について述べていく。
最終的にはサーバから値（例えば整数）を取得したいと考えている。

最初に**参考サイト投稿者の方々ありがとうございました**。

調査初日であったが、かなり難しいと感じた。
成功できていないので、躓いているところを書いていく。


##Socket
何も知らないので、とりあえず検索してみる。
-----*参考URL：https://zawapro.com/?p=687
-----*検索ワード：「android サーバクライアント通信」

この検索ワードだとSocketを扱ったサイトがとても多かった。
しかし、上記のサイトはサーバがコンソールベースのものである上、
データ取得ではなくデータ送信であった。
とても参考になりそうなサイトでだが、目的と異なるので別の手段に変更。

##UriとIntent
次に**目的のサイトへ接続することが鍵である**と判断し、
ボタンのクリックイベントに下記のプログラムを実装した。

~~~
                Uri uri = Uri.parse("https://jp.heroku.com/");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri );
                startActivity(intent);
~~~

実行してみるとボタンは現れたが、
クリックしても目的のサイトまで飛ぶことができない。
-----*参考URL：https://android.roof-balcony.com/intent/browser/
-----*検索ワード：「android URLに接続する」

実装に問題はないので、
**エミュレータのwifiアクセスポイントがおかしい**と考え、
端末の設定からアクセスポイントを以下のように変えた。

・プロキシ　10.0.2.2
・ポート　　8080

-----*参考URL：http://www.hnyssh.net/?p=793
-----*検索ワード：「android エミュレータ wifi接続」

しかし、これもうまくいかなかった。
エミュレータのwifiアクセスマークもONであったので、
wifiがつながっていないということはなさそうである。
別の方法を試そう…

##JSON
どうやらJSONというデータ形式を扱うAPIがあるらしいので、
JSONを使う方法に切り替えていこうと思う。

-----*参考URL：https://qiita.com/hkusu/items/8572d768243fe7e7ed88
-----*検索ワード：「android JSON 外部API」

この検索ワードは本目的に合いそうなサイトがたくさん転がっていた。

##次回
JSONに関する記事を書く予定。
以上。
ドカベンOPをhtml/css/jsで再現してみた


どうも、毎度おなじみ中野です。（まだ２回目の投稿）

今回は「ドカベンのオープニングの文字が浮き出るやつ」を作りました。

![画面収録 2019-10-18 10.06.21.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515312/5685e7d6-81c5-886a-859f-57d1c16afc34.gif)

[ドカベンしてみる](https://nakano1120.github.io/dokaben/)

##コード

```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ドカベン</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <b><div class="dokaben" id="kadoben">ドカベン</div></b>
    <input type="text" id="dokabentext" value="ドカベン">
    <input type="button" name="db" id="dokabutton" value="ドカベンする" onclick="dokabenscript()">
    <script src="script.js"></script>
</body>
</html>
```
```css:style.css
.dokaben{
    font-size:1000%;
    color:#ff0000;
}
#ani0{
    transform: rotateX(88deg);
}
#ani1 {
    transform: rotateX(80deg);
}
#ani2 {
    transform: rotateX(65deg);
}
#ani3 {
    transform: rotateX(50deg);
}
#ani4 {
    transform: rotateX(40deg);
}
#ani5 {
    transform: rotateX(30deg);
}
#ani6 {
    transform: rotateX(22deg);
}
#ani7 {
    transform: rotateX(14deg);
}  
#ani8 {
    transform: rotateX(7deg);
} 
#ani9 {
    transform: rotateX(0deg);
}   

```
```javascript:script.js
let play=0///今動いているか
let count=1///アニメのカウント
let dokaben = document.getElementById("kadoben");///動作をする要素

function dokabenscript(){
    if(play>0){///もしプレイしていたら
        return;///やらせない（固い意志）
    }

    play=1///動いていることにする

    dokaben.innerHTML=document.getElementById("dokabentext").value;///入力された文字を反映

    count = 0;///カウントをゼロに
    dokaben.id=("ani0")///アニメをゼロに戻す

    let intarval = setInterval(function(){

        count++;///カウントしていく
        dokaben.id=("ani"+count);///IDを書き換え

        if(count >= 9){///アニメが終了したら
            clearInterval(intarval);　//intervalを終わる
            play=0///動いていないことにする
        }

    },200)
    
}
```

基本は、`setInterval(function(){~},200)`で１回づつIDを変更して動いてるかのように見せているだけです。

短時間で考えたスクリプトなので、仕組みは単純です。

みんなも改変して遊んでみよう！

##今後やりたいこと
- 他の再現アプリを作る
- もう少し再現度を高くする etc...
オープンソースのファミコンエミュ。コードリーディング

#オープンソースのファミコンエミュ。コードリーディング

###概要
タイトルどおりのことをチャレンジしようとしたけど
2019/10/18現在。結果的には挫折している。
したがって、本記事は執筆時点ではただのリンク集的なものとなっている。


###経緯
久々にソースコードリーディングしようと思って
適切なオープンソースソフトウェアを探していた。

どちらかというと、低い層のプログラム(OSやドライバ)のが良い。
x86のエミュレータであるQEMUを考えていたが、コード量膨大なので
僕らのファミコンであれば、もう少しお手軽なのでは？
と安易に考えただけであった。

言語的には、C/C++ が良かったが、いざ探してみると
C#の実装のものや、今回の調べ物で初めて知ったrustなる言語による実装もあった。

コードリーディングするにしても、実際にビルド＆動作させながら行いたいので
まずはビルドなのだが、どれもそれでつまづいた。
時間かけて、調査、試行錯誤すれば乗り越えられそうだが
当面やりたいのは、動かしながらコードリーディングだったので
QEMUを対象にすることとした。（これは別記事とする。）


###オープンソースのファミコンエミュレータ

実際にソースコードダウンロード→ビルドまでチャレンジしてみたのが以下の4つ
どれも特徴があって面白い

My Nes
[My NesはC#で書かれたポータブルでオープンソースのNES/ファミコンエミュレータ](https://sourceforge.net/projects/mynes/)

NESTOPIA
[C++で実装。オープンソースで開発されている、最も完成度が高いといわれるファミコンエミュ。](http://nestopia.sourceforge.net/)

VirtuaNES
[C++で実装。国産のファミコンエミュ。](http://virtuanes.s1.xrea.com/vnes_dl.php)

rustynes 
[Rust/WebAssemblyで作られたファミコンエミュレータ](https://github.com/bokuweb/rustynes)


###参考記事リンク

以下もとても面白い
特に、@bokuwebさんのHelloWorld記事は、これを見ながら手を動かすとNESエミュレータそのものが目的であれば
かなり参考になる。


[ファミコンエミュレータの創り方　- Hello, World!編 -](https://qiita.com/bokuweb/items/1575337bef44ae82f4d3)

[ギコ猫でも分かる。ファミコンプログラミング](http://gikofami.fc2web.com/)

[ファミコン オープンソースソフトウェアの紹介](https://qiita.com/kwyjibo135/items/bc1784ef294f420e1a2e)
認可付きAPIから画像を取得してVueで表示する

# やりたいこと
`axios`で、認証付き画像を取得し、`<img>`で表示する

# 問題
認証付きAPIが画像を返してくれるが、バイナリデータがそのまま来るため`src`で指定できない。困る。

# 解決
##その1 `base64`で文字列にして読み込む

- `responseType: "arraybuffer"`を指定する

```vuejs:ImageFromApi.vue

<template>
  <img :src="dataUrl" />
</template>

<script>
import axios from "axios";

export default {
  name: "ImageFromApi",
  props: {
    apiUrl: {
      type: String,
      required: true
    }
  },
  data: function() {
    return {
      dataUrl: ""
    };
  },
  mounted() {
    axios
      .get(this.apiUrl, {
        responseType: "arraybuffer",
        headers: {
          Authorization:
            "Bearer " + <Tokenを入れる>
        }
      })
      .then(response => {
        const prefix = `data:${response.headers["content-type"]};base64,`;
        const base64 = new Buffer(response.data, "binary").toString("base64");
        this.dataUrl = prefix + base64;
      });
  }
};
</script>

```


##その2 `blob`で`ObjectURL`を生成して読み込む

- ` responseType: "blob"`を指定する

```vuejs:ImageFromApi.vue
<template>
  <img :src="blobUrl" />
</template>

<script>
import axios from "axios";

export default {
  name: "ImageFromApi",
  props: {
    apiUrl: {
      type: String,
      required: true
    }
  },
  data: function() {
    return {
      blobUrl: ""
    };
  },
  mounted() {
    axios
      .get(this.apiUrl, {
        responseType: "blob",
        headers: {
          Authorization:
            "Bearer " + <Tokenを入れる>
        }
      })
      .then(response => {
        this.blobUrl = window.URL.createObjectURL(response.data);
      });
  }
};
</script>

```

## 結論
画像を表示するたびに`base64`が走り、重い画像がさらに重くなるので、
```その2 `blob`で`ObjectURL`を生成して読み込む```を採用とする。
Dartはインデックスに負の数を指定することができない

# はじめに
Flutterでアプリを作っていた時、Dartの文法について調べて知ったことを書いておきます。


# 僕の思い込み
アプリの仕様で文字列の最後の文字を取得する必要があり、何も考えずに`str[-1]`としたところ、エラー画面が出てコンソールには以下のように出力されました。

```
Uncaught exception:
RangeError (index): Index out of range: index must not be negative: -1
```

##### Dart 「-1はインデックスの範囲外だよ。それにインデックスに負の数は指定しないでね。」

僕がさわったことのある他の言語ではできたので、どの言語でもできるもんだと思っていました。

少し調べただけでも、

- C
- C++
- Java
- PHP
- JavaScript

では0以上を指定する必要があるんですね。マイナスでもいい言語の方がマイナーなんですかね？


## 公式ドキュメントによると

```dart
List<String> languages = ['English', 'Spanish' ,'Chinese', 'Japanese'];
String country = 'Japan';

// Listの場合
print(languages[-1]); // エラーが出る
print(languages.last); // Japanese と出力される
print(languages[languages.length - 1]); // Japanese と出力される

// Stringの場合
print(country[-1]); // エラーが出る
print(country.last); // エラーが出る
print(country[country.length - 1]); // n と出力される
```

1. 最後の要素を取得したいのであれば、配列なら`last`というListクラスのプロパティを使うことができます。Stringでは使えません。
2. 「最後から2番目」のように最後から数えた位置にある要素を取得したい場合は、`languages.length - 2`のように配列に含まれる要素の数から「〇番目」の数だけ引いてやればインデックスを求められます。これはListとStringのどちらでも使えます。

### 注意点
- どちらの場合も要素が1つ以上存在する必要があります。
- 2の方法では、要素数から引いた後の数がマイナスになってしまうと、マイナスの数を指定したのと同じことですからエラーが出ます。
【CURL】windows10のコマンドプロンプトでもcurlを使ってみた。

メモとして残します。

windows10のアップデート1803から確か使えるようになったので使ってみました。

試したプロトコルはhttp,https

#■やり方
##基礎
```shell
curl "{URL}" 
```
##リダイレクトを考慮したレスポンスを取得 -Lオプション
→基本付けたほうがいいやつ

```shell
curl -L "{URL}"
```

##レスポンスのヘッダ情報を取得 -Iオプション
```shell
curl -I "{URL}" 
```

##ベーシック認証あり -uオプション
```shell
curl -u {userid}:{pass} "{URL}" 
```

##レスポンスをテキストへ出力 (ファイルダウンロード)
```shell
curl "{URL}" -o "{出力先パス}"
or
curl "{URL}" > "{出力先パス}"
```
(自分用メモ) スライドを作成するときに参考にするサイト

# 背景
毎回スライド作成するときに探している気がするのでその手間を減らすため

# アイコン
1. カジュアル
   * いらすとや https://www.irasutoya.com/

2. フォーマル
   * icooon-mono https://icooon-mono.com/
   * flaticon https://www.flaticon.com/
        * https://www.flaticon.com/search?word=api&author_id=1

# 画像
1. 

# 参考
* https://qiita.com/TAKAKING22/items/20c006206d2ce23a5608
日本で一般に広まっているプログラマ三大美徳の「短気」の解釈は変ではないか？

Perlの生みの親Larry Wall氏が唱えたプログラマ三大美徳(怠惰、短期、傲慢)を基本的に私は好きなのですが、
「怠惰」と「傲慢」はともかく「短気」については何かしっくり来ていませんでした。

日本では「短気」の解釈として「将来を見越して拡張性とメンテナンス性の高いコードを書きましょうね」と言うのが広まっています。
実際、「プログラマ三大美徳」でGoogle検索した時に上位に来る記事の解釈はこれが多いです。

# 一般に広まっている解釈の元ネタ
これらの元ネタを辿って見ると、
日経XTechの[小飼弾氏の記事](https://tech.nikkeibp.co.jp/it/article/Watcher/20061005/250058/)に当たります。
小飼弾氏と言うとPerl界の大御所なのは言うまでもありませんし、Larry wall氏本人との親交も深い方ですので、信頼性の高い記事と評価されて盛んに引用されたのでしょう。

この記事の中で小飼弾氏はIMPATIENCEを引用しつつ以下のように訳しています。

```
IMPATIENCE
The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least that pretend to. Hence, the second great virtue of a programmer.
訳すとこんな感じしょうか。

短気
コンピューターが怠慢な時に感じる怒り。この怒りの持ち主は、今ある問題に対応するプログラムにとどまらず、今後起こりうる問題を想定したプログラムを書く。少なくともそうしようとする。よって、プログラマーの第二の美徳である。
```

その上で、プログラムの拡張性の重要性を記事の後半部分で例を交えて語っています。

# ちょっと訳に違和感がある

ただ、ちょっとこの訳は変な気がします。
``This makes you write programs that don't just react to your needs, but actually anticipate them.``
の部分を``今ある問題に対応するプログラムにとどまらず、今後起こりうる問題を想定したプログラムを書く。``
と訳されていますが、素直に構文解釈すると`anticipate`の主語は`programs`になりますし、
``them``が指している``your neeeds`` を将来の問題と訳すのは少々無理やりな気がします。

また、拡張性がないことを``computer is being lazy``と言って怒るのもよく分かりません。

「短気を備えたプログラマは、単にユーザーの要求に反応するだけではなくそれ(ユーザーのやりたいこと)を予見するようなプログラムを書く」
と言うような解釈の方が正しいのではないでしょうか。
要するに、やりたいことを先回りしてくれるプログラムを書くということで、
コードとしての拡張性の話と言うより、UI/UX系の話に見えます。

当たり前のことも分かってくれないcomputerに対して怠慢と怒るなら筋は通りますし。

# Programming Perl 第4版の記述
実はこの三大美徳の定義、ラクダ本の後の版では全面的に切り替わっています。

```
Impatience
Impatience is that nasty feeling you get when the computer is doing what it wants instead of what you want. Or, more correctly, when the programmer on the other side of the software chose the wrong default settings, made a poor GUI, or doesn’t give you access to this data. You’ve experienced it enough to not inflict the same pain on other programmers, turning your frustration with your wasted time into a benefit for other people.
```
訳すと、
「短気」とはコンピュータがあなた(ユーザー)のやりたいことではなく、コンピュータがやりたいことを実行した時に不快に感じることだ。(この不快に感じる時はというのは)より正確に言えば、ソフトウェアを開発したプログラマが誤ったデフォルト設定をしたり、酷いなGUIを作ったり、必要な情報へのアクセス手段を用意していなかった時である。
あなたは同じ苦しみを他のプログラマに負わせる気がなくなるほどそのような経験をしたはずだし、そのフラストレーションと無駄にした時間を他の人々の利益に変換するべきだ。

と言うようなところでしょうか。(間違いがあったらご指摘お願いします)

具体例が追加されたことで、以前``computer is being lazy``と大雑把な書き方をされていたものが、プログラムの使い勝手が悪いことであると明確化されています。
要するに「不適切なUI/UXに不快感を感じ、同じようなプログラムを作らないようにすること」が「短気」と言うわけです。
Route53 にレコードをまとめて登録する方法

Route53 の HostedZone を作成した直後、レコードが一つもない時には Import 機能を使用できますが、既存のレコードの場合では使用できません。

また、Route 53 API のリクエスト頻度は、1 秒あたり 5 件のリクエストの制限があります。

大量のレコードを追加・変更したい場合に、change-resource-record-sets コマンドの --change-batch オプションが便利です！

### 1. jsonファイルを作成します

jsonファイルの中に、ChangeResourceRecordSets リクエストを記載することで、後ほどchange-resource-record-setsコマンドに渡せて実行できます。
リクエストのアクションは三種類で、CREATE、DELETE、UPSERT です。
CREATE は新規のレコードの作成、DELETEはレコードの削除、UPSERTはレコードの変更です。

ドキュメントでは一つのリクエストしか記載してなかったのですが、実は複数まとめて記載することができます。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/simple-resource-record-route53-cli/

sample.json

```
{
        "Comment": "CREATE a record ",
        "Changes": [{
                "Action": "CREATE",
                "ResourceRecordSet": {
                        "Name": "a.example.com",
                        "Type": "A",
                        "TTL": 60,
                        "ResourceRecords": [{ "Value": "192.0.1.1" }]
	                                		}
                },{
                "Action": "CREATE",
                "ResourceRecordSet": {
                        "Name": "b.example.com",
                        "Type": "A",
                        "TTL": 60,
                        "ResourceRecords": [{ "Value": "192.0.1.2" }]
		                                	}
                },{
                "Action": "CREATE",
                "ResourceRecordSet": {
                        "Name": "c.example.com",
                        "Type": "A",
                        "TTL": 60,
                        "ResourceRecords": [{ "Value": "192.0.1.3" }]
		                                 	}
                }]
}                
```

### 2. change-resource-record-sets コマンドを実行します
$ aws route53 change-resource-record-sets --hosted-zone-id ZXXXXXXXXXX --change-batch file://sample.json
javascriptで最初に現れる(function(){ ... }())は何を意味するのか

# (function(){ ... }())は何？
javascriptでプログラムを書くときプログラムの最初に

```js
(functin() {
...
}());
```

と記載されたプログラムをよく見る。これは**即時関数**と呼ばれている。

#即時関数を利用する目的
即時関数を利用する目的は変数のスコープを狭くすることである。通常、javascriptでは以下のように変数を定義するとtest.js以外からも参照可能なグローバル変数として扱われる。

```js:test.js
var name = "abc";
```

即時関数を使用して以下のように定義すればtest.js内の即時関数ブロックの中でしか参照できない変数として変数nameを定義することができる。こうすることに変数のスコープを狭め、別ファイルのスクリプトで変数nameに意図しないデータが混入されることを防ぐことができる。

```js:test.js
(functin() {
var name = "abc";
}());
```

#ES6以降では即時関数を使う必要はない
ES6以前はjavascirptがグローバルスコープと関数スコープして用意していなかったため、即時関数は保守性を高める上で必要なハックではあった。しかし、ES6ではブロックスコープで変数を定義できるletキーワードが用意されている。letを使用した以下のコードではブロック内でしかその変数は有効にならない。

```js:test.js
{
//nameはこのブロック内でのみ有効
let name = "abc";
}
```

また先頭（グローバル）でletを使用して宣言してもvarと異なり、そのファイル内でしかその変数は利用できない。

```js:test.js
//nameはtest.js内でのみ有効
let name = "abc";
{
}
```

即時関数は初見で見た時、知らない人にとってはどうしてもその意味は伝わりずらい。人にとってわかりやすいコードをするためにこれからはletをつかうのが望ましい。


# 参考情報
即時関数とES6の仕様を踏まえた上で即時関数はどのように考えるべきか丁寧にまとめてられています。
https://qiita.com/raccy/items/310b4353a757296f797f
DIを出来る限りシンプルに紹介する

# 本記事について

本記事ではDI（依存性の注入、Dependency injection）について出来る限りシンプルに紹介します。
DIに関連の深いDIコンテナやService Locatorは次の記事で触れる予定です。

# DIの概要

DIはその名の通り依存性を注入する設計パターンです。
ClientクラスがServiceクラスを利用して機能を実現している場合に、ClientはServiceがなければ成り立ちません。

```kotlin
class Client {
    private val service = Service()
    fun search(): String {
        return service.request()
    }
}

class Service {
    fun request(): String {
        return "requested"
    }
}
```

この関係を、ClientはServiceに依存していると言います。
この依存をClientで決めずに外から注入する設計パターンをDIと呼びます。

# DIの実装

## 実装の準備

依存関係を外から注入するためにはServiceのInterfaceを定義する必要があります。

```kotlin
class Client {
    private val service: ServiceInterface
    fun search(): String {
        return service.request()
    }
}

interface ServiceInterface {
    fun request(): String
}

class Service: ServiceInterface {
    override fun request(): String {
        return "requested"
    }
}
```

これで準備は整いました。
ここからの実装は以下の3パターンがあります。

- コンストラクタ・インジェクション
- セッター・インジェクション
- インターフェース・インジェクション

## コンストラクタ・インジェクション

ClientのコンストラクタでServiceを渡してDIを実現する方法です。

```kotlin
class Client(private val service: ServiceInterface) {
    fun search(): String {
        return service.request()
    }
}

interface ServiceInterface {
    fun request(): String
}

class Service: ServiceInterface {
    override fun request(): String {
        return "requested"
    }
}
```

## セッター・インジェクション

ClientにServiceのセッターで実現する方法です。

```kotlin
class Client {
    private var service: ServiceInterface? = null
    fun search(): String {
        return service!!.request()
    }
    fun setService(service: ServiceInterface) {
        this.service = service
    }
}

interface ServiceInterface {
    fun request(): String
}

class Service: ServiceInterface {
    override fun request(): String {
        return "requested"
    }
}
```

Serviceがmutable, nullableになってしまうためあまり良いパターンではありません。

## インターフェース・インジェクション

インターフェース・インジェクションの実装は複雑であまり利用ケースが想定できないためこの記事では紹介を省略します。
気になる方は以下を参照ください。

[Inversion of Control コンテナと Dependency Injection パターン #インターフェース・インジェクション](https://kakutani.com/trans/fowler/injection.html#InterfaceInjection)
駆け出しコーダーがコーディング規約を作ってみた

HTML/CSSを綺麗に書きたい。

規約を作ることで得られるメリットは、HTMLとCSSの品質を一定に保つことであり、得られるメリットは大きい。


##原則

###規約は絶対じゃない

あくまでも原則であり、規約は規約
案件によってどうしようもない時もある。

例えば、以下のような状況
- 他の人のコーディングを途中から手伝う
- 他社でコーディングされたサイトを修正する

この場合、自分のコーディング規約に合わせるのは不可能なので、臨機応変にわかりやすいコードを書くことを心がける


##インデントはスペース2つで統一する

タブを使わず、半角スペース2つで統一します。

```haml

<nav>
　　<ul>
　　　　<li>
　　　　　　<a></a>
　　　　</li>
　　</ul>
</nav>
```

半角スペース2つ

```haml

<nav>
  <ul>
    <li>
      <a></a>
    </li>
  </ul>
</nav>
```

##階層構造

案件ごとに異なりますが、基本的には以下のような階層構造


```
/root
 │
 ├ static/
 │  ├ style.css
 │  ├ script.js
 │  └ ...(ライブラリ)
 │
 ├ img/(適宜ディレクトリを設置。不要なら直下に)
 │
 │ index.html
 ├ 下層ページディレクトリ
 │  └ index.html

```


##IDとClassの使い分け

基本的にClassを使います。

###IDを使う場合
- JacaScriptを使う場合
- ページ内リンクを使う場合
- ページごとの名前空間として

```css
#about{
  .contents{
    /*aboutページのスタイル*/
  }
}
```

`<body>` タグにページIDをつけて、ページごとのスタイルを指定する。
または、`<wrapper>`につける


##命名規則
###単語はハイフン(-)で区切る

- `menu-container`
- `comment-list`
- `header-logo`
- `btn-small`

など


###アンダースコアやキャメルケースは基本的に使わない
今はBEMを使ってませんので、大丈夫かと思いますが、
単語の区切りなどでアンダースコアを使わないようにします。

画像タイトルも同様です。

header_logo　→　`header-logo`

キャメルケースは使いません。


###単語は省略しない（用語として浸透しているものはOK）

単語の省略語として浸透しているものはOK
自分で勝手に言葉を略して命名しない。

####浸透している略語の例

- wrapper　→　wrap
- description　→　desc
- infomation　→　info
- colum　→　col
- thumbnail　→　thumb
- category　→　cat
- previous　→　prev
- button　→　btn
- image　→　img
- navigation　→　nav


##HTML
###文字として扱う「<」, 「>」, 「&」, 「"」は必ず実体参照にする

- 「<」 - `&lt;`
- 「>」 - `&gt;`
- 「&」 - `&amp;`
- 「"」 - `&quot;`


###タグの属性値はダブルクオートで囲む

`""`で統一します。

```html

<a href=''>link</a>
```

```html
<a href="">link</a>
```

###空divは使わない、擬似要素で再現する

例えば、背景色のバックグラウンドを挿入したかった場合、`div`を使ったら簡単ですが、擬似要素を使ったほうがスマートです。

```html
<div></div>
```


##CSS
- 並び順はSMACCS
- プロパティとバリューの間は空ける
- ショートハンドを使う
- 少数値でも0をつける
- タグに直接スタイルを指定しない（なるべく）
- 要素セレクタは省略する
- セレクタを短くする




随時追加していきます。
Gmailが受信できない問題（独自ドメイン(お名前.com） + Heroku + PointDNS + Gmail）

#問題発生の手順
独自ドメイン適用のために参考にしたQiita記事はコチラ
[初めてHerokuで独自ドメインを公開するあなたへ](https://qiita.com/kenjikatooo/items/07c3d911210a4ca96781)

▼独自ドメイン適用手順
　1. herokuでアプリを公開
　2. herokuに独自ドメインを追加
　3. PointDNSを設定
　4. ドメイン側(お名前.com)でネームサーバーの更新
　5. 独自ドメインでアプリにアクセス可能！

設定が無事完了して一安心！
…と思いきや、Gmailが受信できない状態にm(_ _)m

##お名前.com設定後、Gmailが送信可能だけど受信不可に
Gmailのトラブルシューティングをもとに再設定するが、全然うまくいかない。。

GoogleのDNS確認ツールをつかってログや設定状況を確認するが、やっぱり怒られるばかり。

[GSuiteToolbox CheckMX](https://toolbox.googleapps.com/apps/checkmx/)

DNSやネームサーバの設定が悪いとわかっていても、ネームサーバーやDNSの設定は反映されるのが半日（最大72時間）かかかるので、待っている間の精神衛生が悪く、開発スピードにも悪影響がありました。（泣）

いっそ妥協してGmailそのまま使おうか、なんて思ったり。。。
ぶっちゃけそれでもいいのですけど、できれば独自ドメイン使いたいですよね。


##解決方法はPointDNSの設定
Gmailのチュートリアルではドメイン側（お名前.com）側のMXレコードを設定するように記載がありますが、
PointDNSの設定でネームサーバを変更しているため、お名前.com側の設定は反映されない（認識されない）ようです。

なので適切な設定は下記の通り。

①PointDSNのレコード値
→ お名前.comのネームサーバーへ設定

②GmailのMXレコード値
→　お名前.com側の設定は削除して、**PointDNSに追加**

<img width="942" alt="スクリーンショット 2019-10-18 0.59.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97406/f2487ff1-fd57-7e25-8581-354383953ee8.png">


私の場合はこれでうまくいきました😂

##終わりに
低レベルな内容かと思いますが、本事象がWEB上で見つからなかったので記事化しました。
同じことで躓いている開発者へ届け〜🐦
【GAS】ドライブ、Gmail、フォト それぞれの使用容量を調べる

# 目的

Gmail の使用容量を取得して、一定の割合を超えたらメールを飛ばす仕組みを作りたかった。

Gmail の使用容量は、ドライブ、フォトと共有しているとのことで、それぞれの使用容量を調べます。

# 手順

## 1. Drive API を有効にする

**リソース > Google の拡張サービス** を選択。

![Google の拡張サービス.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/74fb30c7-73ed-df08-e6ae-70c04aa7f7b3.png)

**Drive API** を有効にする

![drive_api.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238891/9df85bdd-9d55-e057-77b2-56b6d67a4669.png)

## 2. 使用容量を調べる



```.js
function myFunc() {
  var about = Drive.About.get();
  var quota = about.quotaBytesByService;
  Logger.log(quota);
}

// ↓ 結果 ↓
// [
//   {bytesUsed=19309750, serviceName=DRIVE},
//   {bytesUsed=2000998011, serviceName=GMAIL},
//   {bytesUsed=0, serviceName=PHOTOS}
// ]
```

 - `quota.serviceName` = サービスの名前
 - `quota.bytesUsed` = 使用容量（バイト）

# 参考

https://stackoverflow.com/questions/35199532/obtaining-total-and-free-used-space-via-google-app-script
starting container process caused "exec: \"docker-entrypoint.sh\": executable file not found in $PATH": unknown エラーが出た時の対処方法

AKSで自前のコンテナイメージをkubectl applyしたときにPodが起動しませんでした。
kubectl describe podで見てみると以下のようなエラーが出ていました。

```
Error: failed to start container "containerName": Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"docker-entrypoint.sh\": executable file not found in $PATH": unknown
```

docker-entrypoint.shに実行権限が付いていないことに起因して出力しているエラーです。
docker-entrypoint.shに実行権を付与して、イメージをビルドし直して、AKSから起動してあげるとうまく動作しました。

以上
WindowsではじめるSTM32第2版の補足

# このページの目的
技術書展6で「WindowsではじめるSTM32」という本を頒布しました。それの改訂第2版をこの秋に出しました（boothにて販売中 https://kotetsu-yama.booth.pm/items/1531784 ）。ただ、そのあとに「これも書いたほうがよかったかなー」という項目がありましたので、追記としてこのページを書くことにしました。ぼちぼちと気が向いたときに追記していきます。

# HALの勉強方法
こちらになります
https://qiita.com/kotetsu_yama/items/07947a769b64c95ce918

# CubeIDE 1.3.0
新しいIDEがでたので、入れてみました(Windows版です)。
立ち上げるとこんな画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/d9dabb95-ac12-7025-7ad5-1018e1a26f94.png)
これは、workspaceの.metadataフォルダを削除すると直ります。

出力のフォルダ構成も変わってますね。ここは適時読み替えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/a0747082-7eed-558c-15e4-a56493d21add.png)

#ADCのキャリブレーション
こちらになります
https://qiita.com/kotetsu_yama/items/d31da1e7ef6a4d21b097

#NucleoでSTLINKを切り取ることなくSTM32のVdd電圧を変える方法
こちらになります
https://qiita.com/kotetsu_yama/items/2c5c38a708f45184a57b

#STM32CubeIDEでプロジェクトのコピー
こちらになります
https://qiita.com/kotetsu_yama/items/aed4a7ce996fbd276634
nginx、怖いリバースプロキシの話(正規表現のキャプチャがURIデコードされて困った件)

自分への備忘録として。

http://example.com/api/hogehoge?foo=bar
にアクセスされたら、
http://example.com:8000/hogehoge?foo=bar
という形でリバースプロキシさせたいとき、ついついこんな風に書きたくなります。

```
location ~ ^/api/(.*)$ {
    proxy_pass http://example.com:8000/$1$is_args$args;
}
```

が、これは間違い。下のように書くべき。

```
location ~ ^/api/.*$ {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://localhost:8000;
}
```

どういうことかというと、nginxのlocationディレクティブにおける正規表現のキャプチャは、uriデコードされたものがキャプチャされてしまうのです。

なので、もし
http://example.com/api/hoge%20hoge
こういうURIエンコード済みのURIだった場合、
"http://example.com:8000/hoge hoge"
こんな空白入りのURIになってしまい、502 Bad Requestとかで死にます。

それを阻止するには、デコード前の状態をキャプチャしないとダメで、それを行うにはrewriteディレクティブを使います。

これは、公式ドキュメントにも書いてあります。
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass


>
If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive: 
>(中略)
When the URI is changed inside a proxied location using the rewrite directive, and this same configuration will be used to process a request (break):
>>
location /name/ {
    rewrite    /name/([^/]+) /users?name=$1 break;
    proxy_pass http://127.0.0.1;
}
>
In this case, the URI specified in the directive is ignored and the full changed request URI is passed to the server.
>

しかも、rewriteに後続する、proxy_passディレクティブには変数とかは使用してはいけません。余計なものを付けなければ、変更された完全なリクエストURIがサーバーに渡されます。

あー怖かった。
Goでデフォルト引数をつかいたーい

できへん。。

が、構造体にしてそっち編集すればいいんじゃない案がよさそう。
https://stackoverflow.com/a/13603885

試してみたけど、副効果としてスッキリ感がすごい！

```
func hoge(s string, p *ppp, fugaMap map[int]string, ch *chan fugafuga, wg *sync.Waitgroup){
}
```

```
type struct hogeParam {
    s string
    p *ppp
    fugaMap map[int]string
    ch *chan fugafuga
    wg *sync.Waitgroup
}
func hoge(p *hogeParam){
}
```
PHP7.4.0をDockerで気楽に体験する

## 追記
https://github.com/sakash1ta90/php74
開発目的で使えるソースにまとめました。

## 前提条件
```sh:terminal
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G103

% brew --version
Homebrew 2.1.15
Homebrew/homebrew-core (git revision 79f5c; last commit 2019-10-18)
Homebrew/homebrew-cask (git revision e49eb; last commit 2019-10-18)

% docker version
Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:26:49 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.2
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.8
  Git commit:       6a30dfc
  Built:            Thu Aug 29 05:32:21 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

## コンテナ作成
Dockerhubにいい感じのimageがあるので、それを使います。

```yml:docker-compose.yml
version: "3.3"

services:
  php:
    image: "php:7.4-rc-alpine"
    tty: true
    volumes:
      - ./src/:/src
    container_name: php74

```


FFIはそのままでは動かないので今回は割愛しました。

```php:src/index.php
<?php

// アロー関数
$y = 15;
$fn = fn($x) => $x + $y;

echo $fn(14), PHP_EOL;

$hoge = new class(1, "php")
{
  // プロパティ型指定
  public int $num;
  public string $name;
  public ?string $title;

  public function __construct(int $num, string $name) 
  {
    // null合体代入演算子
    $this->num ??= $num;
    $this->name ??= $name;
    // nullが入る
    $this->title ??= $title;
  }
};

var_dump($hoge->num, $hoge->name, $hoge->title);

// Fatal error: Uncaught TypeError: Typed property class@anonymous::$num must be int, string used
$hoge->num = "piyo";
```

## 実行
```sh:terminal
% docker-compose up -d
Creating php74 ... done

% docker exec -it php74 /bin/ash

/ # cd src

/src # php -v
PHP 7.4.0RC3 (cli) (built: Oct  4 2019 21:53:56) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0-dev, Copyright (c) Zend Technologies

/src # php index.php
29
int(1)
string(3) "php"
NULL

Fatal error: Uncaught TypeError: Typed property class@anonymous::$num must be int, string used in /src/index.php:24
Stack trace:
#0 {main}
  thrown in /src/index.php on line 24
```

## 雑感
7.4をビルドする記事は上がっていたけど、
コンテナからの簡単な検証記事はなかったので書いてみました。
Qiitaのシンタクスの対応も早い。
C言語での2次元配列の簡単な捉えた方

# 本記事でやりたいこと
C言語で２次元配列についての理解と作成がしたい。

# ２次元配列とは
↓こんなの
<img width="313" alt="スクリーンショット 2019-10-18 13.34.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201115/14a0993c-fc11-42f9-887c-635e9e27170d.png">

行があって、
列があって、

縦にも横にも値が入れられる表のこと。たぶんね。

# これをC言語で作成します。
ポインタやら、malloc(マロック)やら出てきますけど、

軽く流す気持ちで大丈夫です。

```ruby:matrix.c
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main(int argc, char *argv[])
{
    int n, i, j;
    int **matrixA, **matrixB, **matrixC;
    double st, en;

    if (argc < 2)
    {
        n = 64;
    }
    else
    {
        n = atoi(argv[1]);
    }

    matrixA = malloc(sizeof(int *) * n);
    matrixB = malloc(sizeof(int *) * n);
    matrixC = malloc(sizeof(int *) * n);

    for (i = 0; i < n; i++)
    {
        matrixA[i] = malloc(sizeof(int) * n);
        matrixB[i] = malloc(sizeof(int) * n);
        matrixC[i] = malloc(sizeof(int) * n);
    }

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            matrixA[i][j] = rand() % 10 + 1;
            matrixB[i][j] = rand() % 10 + 1;
            // printf("matrixB[%d][%d] = %d\n", i, j, matrixA[i][j]);
        }
    }

    st = omp_get_wtime();
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            matrixC[i][j] = matrixA[i][j] * matrixB[j][i];
            // printf("matrixC[%d][%d] = %d\n", i, j, matrixC[i][j]);
        }
    }
    en = omp_get_wtime();

    printf("Etime=%.6f\n", en - st);
    // printf("%d\n", n);
    // printf("argc = %d\n", argc);

    free(matrixA);
    free(matrixB);
    free(matrixC);

    return 0;
}


```

freeちゃんとできてないような。。。
あっているかどうかは置いておいて、
こんな感じです。

# 内容

#### とりあえず A, B, Cを定義して

```ruby:matrix.c
int **matrixA, **matrixB, **matrixC;
```

#### A, B, Cの行を配列を作成（mallocによって)

```ruby:matrix.c
matrixA = malloc(sizeof(int *) * n);
    matrixB = malloc(sizeof(int *) * n);
    matrixC = malloc(sizeof(int *) * n);
```

#### 各配列にも配列を作って完成！！(mallocによって)

```ruby:matrix.c
for (i = 0; i < n; i++)
    {
        matrixA[i] = malloc(sizeof(int) * n);
        matrixB[i] = malloc(sizeof(int) * n);
        matrixC[i] = malloc(sizeof(int) * n);
    }
```

<img width="637" alt="スクリーンショット 2019-10-18 14.18.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201115/730bcf9d-f22e-3c76-a961-30448b6d8d95.png">


こんな感じにイメージすればいいんじゃない？

実際は違うらしいんだけど。

てことで、誰かのためになればと思っています！！

お疲れ様でした。
pythonでシリアルポート通信

#はじめに
ちょっとしたRS232c通信をする装置をpythonで制御したい。以前ちょっと書いたけど、今度はpythonを使うことにしてみた。
https://qiita.com/niikura/items/5e51d2d2fd995e3d65fe
#使い方

モジュールインストールはpipで。

```console
$ pip install pyserial
```

ここで、気をつけないとならないのは、必要なモジュールはpyserialであってserialではないこと。同じハマり方していた人がいた。

https://teratail.com/questions/101843

接続方法はこんな感じで。

```py
$ python3
>>> import serial
>>> ser = ser.Serial("/dev/USB0",9600,timeout=0.1)
```
これで/dev/USB0に繋いだ先に接続できる。
書き込みはwirte()を、読み込みはread()とかreadline()を使う。

例えばa一文字を書き込んでみる。

```py
>>> ser.write("a")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 518, in write
    d = to_bytes(data)
  File "/usr/lib/python3/dist-packages/serial/serialutil.py", line 63, in to_bytes
    raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
TypeError: unicode strings are not supported, please encode to bytes: 'a'
```
エラーが出た。エンコードがおかしいと言っている。なので、正しくは、

```py
>>> ser.write(str.encode('a'))
1
```
とする。1というのは入力した文字数みたい。
改行したい場合は、\r\nを入力する。

```py
>>> ser.write(str.encode('a\n\r'))
3
```
とりあえず今日はここまで。
CarrierWave使ったオブジェクトのコピー

# オブジェクトのコピー
何かのmodelを関連model含めてそっくりそのままコピーしたい！ってときに便利なgemが[deep_cloneable](https://github.com/moiristo/deep_cloneable)です。
使い方はまとめてくださってる方がいるので[こちら](https://y-hilite.com/3331/)を参考に。

簡単に説明すると
１．routeにget :copyを追加
２．controllerにcopyメソッド追加
３．viewにcopyアクションへのリンク追加

これで簡単にオブジェクトのコピーが作成されます。

# １つ問題点がある
このgem、すごく便利なことはお分かりいただけたと思うんですが、１つ欠点があります。
それはCarrierWaveで保存された画像は複製されないということ。
厳密に言うとコピーはされるんですが、画像としてコピーされないんです。
何かの記事を書いていて、その画像も使いまわしたいときにいちいち「コピー→記事編集で画像投稿し直し」はやりたくないですね。

# 解決策
copyメソッドに少し手を加えます。

```ruby
def copy
  @sample = Sample.find(id: params[:id])
  @copy = @sample.deep_clone(include: [:records])
  @copy.image = @sample.image.file
  @copy.save
  respond_to do |format|
    format.html { redirect_to root_path, notice: 'コピーしました。' }
  end
end
```

重要なのは３行目ですね。
@sample.imageのままでは画像のURLそのものは取得できません。
@sample.image.fileとすることでURLのみを抽出し、コピー側へ渡し上書き保存させます。
これで画像まで含めた記事を丸々コピーできるようになりました。

2行目にinclude: [:records]がありますがこちらは子モデルも一緒にコピーしたいときに追加してください。


お役に立てたら幸いです！
【Vue.js】 vue-lazyloadのlazy-componentをSSR後だけ無効にしたい

画面外のコンポーネントを非表示にして高速化を図るために`lazy-component`を利用したい
しかし、SEOの観点での懸念からSSR時はlazy-componentを使わずに表示したい

# 実装
## コンポーネント
※一部nuxt.jsを想定した実装

```LazyLoad.vue
<template>
  <div>
    <lazy-component v-if="lazyLoadable()" @show="onShow" class="lazy-loaded">
      <slot />
    </lazy-component>
    <slot v-else />
  </div>
</template>

<script>
export default {
  data: function () {
    return {
      ssred: false
    }
  },
  created () {
    this.ssred = !!this.$vnode.elm
  },
  methods: {
    lazyLoadable () {
      if (process.server || this.ssred) {
        return false
      }
      return true
    },
    onShow () {
      this.$emit('show')
    }
  }
}
</script>
```

### 解説

- `process.server`でSSR時にスキップさせる
- `$vnode.elm`がSSR後は存在していることを利用してSSR後に再度lazy-component化しないよう対策

 
## 利用方法
```.vue
<template>
 <LazyLoad @show="foobar">
  <div>lazyloadしたいコンポーネント</div>
 </LazyLoad>
</template>
```
matlabにおけるFailed to load module "canberra-gtk-module"について

MATLABの実行自体には影響がないらしいので気にしなくて良いらしい。

>MATLAB prints message about "canberra-gtk-module" and/or "pk-gtk-module" on startup
>
>(1995075)
>Modified: 03 Sep 2019

>Description
>On some Linux distributions, a message appears in the terminal window when starting MATLAB: 

>Gtk-Message: <timestamp>: Failed to load module "canberra-gtk-module"

>and/or

>Gtk-Message: <timestamp>: Failed to load module "pk-gtk-module"
>
> This message is informational and has no effect on MATLAB.

## 参考
https://jp.mathworks.com/support/bugreports/1995075
GitHubからソースを取得してみる

GitHubからソースを`git clone`で取得するまでの流れです。

## リポジトリのURLを取得します

GitHubでソースを取得したいリポジトリを表示して、画面右上の「Clone or download」ボタンをクリックします。表示されたURLをメモします。

## gitをインストールします

今回はUbuntuで開発してるのでUbuntuでの操作となります。

```
# gitをインストールします
$ sudo apt-get update
$ sudo apt-get install git

# インストールの確認のためにバージョンを表示します
$ git --version
git version 2.17.1
```

## GitHubからソースを取得します

srcフォルダ配下にプロジェクトを取得することとします。

```
# プロジェクトを配置したいフォルダへ移動
$ cd src
# ソースを取得する
$ git clone [URL]
```

## ソースの確認

srcフォルダ配下にリポジトリ名でフォルダが作成され、ソースが取得されているはずです。

以上です。
主キーをUUIDで登録する方法（Spring Boot + Spring Data JPA）

### 1. IdentityGeneratorを継承したクラスを作成

```java:UuidGenerator.java
package com.sample;

public class UuidGenerator extends IdentityGenerator{
    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object obj) {
        // UUIDを生成し返却する
        return UUID.randomUUID().toString();
    }
}
```

### 2. Entityクラスの主キーにアノテーション設定

```java:User.java
@Entity
@Table(name = "users")
public class User {
    @Id
    // nameは任意、strategyにはパッケージを含むIdentityGeneratorクラスを指定
    @GenericGenerator(name = "UuidGenerator", strategy = "com.sample.UuidGenerator") 
    // generatorには@GenericGeneratorのnameを指定
    @GeneratedValue(generator = "UuidGenerator") 
    @Column(name = "user_id")
    private String id;

   // 以下省略
}
```
[iOS13] Settings.bundleのグループ名が重複すると設定アプリの内容が正しく設定されない

追記です　この記事にあるように設定のグループ名が重複していた場合、iOS13.2では設計アプリがクラッシュします。要対応！

業務内容なのでスクショはテストアプリを作って後々更新します。

iOS13検証をする中で、アプリのSettings.bundleのRoot.plistに
「同じ名前のグループ」
があると、インストール後設定アプリに内容が正しく反映されないことがわかりました。
回避方法はグループ名をユニークにするだけですが、チェックがめんどくさいので
スクリプトを書きました。

```sh
xmllint --xpath "/plist/dict//string[text()='PSGroupSpecifier']/following-sibling::key[text()='Title']/following-sibling::string" Root.plist | sed 's/\/string>/\/string>\'$'\n/g'|uniq -c | awk '{if($1 > 1){print $0}}'
```

XMLLintさんで「PSGroupSpecifier」のあるアイテムの「Title」の「String」を引っ張ってきて、改行してuniqをかけます。1　以上の行があったら出力します。

```
   3 <string>A</string>
```

これでとりあえずチェックをかけて、問題なかったらOK。問題が見つかったら該当行を探して修正しましょう。
policyベースのipルーティング管理

policyベースのipルーティングについて、毎回調べているのでメモとしてまとめておく。

# ルーティングテーブル

Linuxではipルーティングテーブルを複数設定できる。`ip route add`でテーブルを指定せずにルートを追加した場合は、mainテーブルに追加される。

テーブルの一覧は、`/etc/iproute2/rt_tables`に保存されている。テーブルを追加したいときはここを変更する。

```shell
$ cat /etc/iproute2/rt_tables
#
# reserved values
#
255    local
254    main
253    default
0      unspectacular
#
# local
#
#1     inr.ruhep
```

第一列はテーブル番号で、第二列はテーブル名である。例えば、vlanに関するルーティングを設定するためのvlanテーブルを追加するには、

```shell
$ echo "200 vlan" >> /etc/iproute2/rt_tables
```

とする。これにより、テーブル番号200、テーブル名vlanのテーブルが登録される。

# ルーティングポリシー
Linuxではルーティングポリシーを元に、参照するルーティングテーブルを決定する。各ポリシーには優先順位があり、優先度が高いものからマッチングされる。ポリシー一覧は、`ip rule`で表示できる。

```shell
$ ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
```

特に何も設定していない場合は、上のような構成となっている。各行先頭の数字は優先度を表している。優先度は数字が小さいほど高く、同じ値は複数回使用してはならない。優先度の後には、マッチングの条件(この場合は全てのパケットにマッチする)が示されている。また、lookupの後に続いているのは参照するテーブル名である。

マッチングの条件を満たすが、参照先のテーブルにマッチするルーティングがない場合は、次に優先度が低いルーティングポリシーが使用される。

例えば、192.168.0.0/24サブネットへ向かうパケットについて、先ほど作成したvlanテーブルを参照させたい場合は、

```shell
$ ip rule add to 192.168.0.0/24 table 200 priority 100
```

とする。100は優先度で、省略した場合はまだ使われていない番号のうち最大のものが使用される。すなわち、デフォルトでは32765が用いられる。

# ルーティング
例えば、192.168.0.0/24サブネットへ向かうパケットは、先ほど行った設定により、vlanテーブルを参照する。そのため、このパケットのルーティングはvlanテーブルで行うことができる。このパケットをeth0.1@eth0から送り出したい場合には、

```shell
$ ip route add to 192.168.0.0/24 dev eth0.1@eth0 table vlan
```

とする。`table vlan`でvlanテーブルに追加することを指示している。

同一ルーティングテーブル内では、マッチング条件がより細かい方が優先される。つまり、`default via 192.168.0.1 dev eth0.1`よりも`to 192.168.0.0/24 dev eth0.1`の方が優先される。もし、この判定方法で同順だった場合、metricが小さい方が優先される。metricは明示的に設定できるが、指定されていなかった場合、カーネルが自動的に決定する。iproute2以前は0となっていたが、iproute2ではそうではない可能性がある(参考: [In Linux, what metric has a route with no metric?](https://unix.stackexchange.com/questions/425924/in-linux-what-metric-has-a-route-with-no-metric))。metricも同じだった場合、最後に追加したルーティングが選択される。

# 参考
- [ip-rule(8)](http://man7.org/linux/man-pages/man8/ip-rule.8.html)
- [ip-route(8)](https://manpages.debian.org/jessie/iproute2/ip-route.8.en.html)

https://qiita.com/takc923/items/6b648a0e6c265658e581

https://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.rpdb.simple.html

https://blog.scottlowe.org/2013/05/29/a-quick-introduction-to-linux-policy-routing/

http://linux-ip.net/html/tools-ip-rule.html

https://serverfault.com/questions/648276/routing-selection-specificity-vs-metric

https://unix.stackexchange.com/questions/425924/in-linux-what-metric-has-a-route-with-no-metric
[5.2.1で解決済み] Spring Security 5.2.0.RELEASEには、リリースノートに書かれていない非互換性があります

# 対象
- spring-security-config 5.2.0.RELEASE

# 何が非互換性か
`WebSecurityConfigurerAdapter` の `configure(WebSecurity)` メソッドの定義から、 `throws Exception` が削除されています。

コミット差分は[こちら](https://github.com/spring-projects/spring-security/commit/34dd5fea30d4e3d862dfc675cb97cf967a6ad25b#diff-5b46e0ff6fdabbe97888183284338784)。`WebSecurityConfigurerAdapter` 以外にも、同様の変更がされたクラスがいっぱいありますね。

これにより、5.1.xから5.2.0.RELEASEにライブラリをアップグレードすると、`WebSecurityConfigurerAdapter` のサブクラスでコンパイルエラーが発生します。オーバーライド元に `throws Exception` が無いからです。

```java:WebSecurityConfigurerAdapterサブクラスの例（変更前）
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // このメソッドでコンパイルエラーが発生
    @Override
    public configure(WebSecurity web) throws Exception {
        // ...
    }
}
```

> [2019/11/07追記] Spring Security 5.2.1.RELEASEで、削除された `throws Exception` が元に戻りました！ -> [コミット履歴](https://github.com/spring-projects/spring-security/commit/5f17032ffdd7969e7422880066938709e9023da1)

# 対策
`configure(WebSecurity)` メソッドから、 `throws Exception` を削除しましょう。

```java:WebSecurityConfigurerAdapterサブクラスの例（変更後）
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // これでコンパイルエラーは発生しない
    @Override
    public configure(WebSecurity web) {
        // ...
    }
}
```

前述の[コミットログ](https://github.com/spring-projects/spring-security/commit/34dd5fea30d4e3d862dfc675cb97cf967a6ad25b#diff-5b46e0ff6fdabbe97888183284338784)によると、他にも多数のメソッドから `throws Exception` が削除されているようです。

これらのメソッドを利用している場合は、すべて同様の作業が必要になります。

> [2019/11/07追記] 5.2.0でこの対策をされた方は、5.2.1にアップグレードされた際、 `throws Exception` を追加する必要は無いはずです。

# しかし・・・
こーゆーことはしないでほしいですねえ。。。

[Spring SecurityのIssue](https://github.com/spring-projects/spring-security/issues/7541)に上げてあります。
ビルド設定で読み込むfirebaseのinfo.plistを変える

毎回どうするんだっけなと過去のプロジェクト開くのがめんどいから

```MyFirebase.swift
import Firebase

//コード内にマクロ入れるとごちゃつくのでここで定数化しておく
#if DEBUG
let IS_DEBUG = true
#else
let IS_DEBUG = false
#endif

import UIKit
import Firebase

class MyAppFirebase:NSObject{
  static let shared = MyAppFirebase()
  static var FIREBASE_PLIST_NAME:String{
    return IS_DEBUG ? "d_GoogleService-Info" : "GoogleService-Info"
  }

  private override init() {
    super.init()
    guard let path = Bundle.main.path(forResource: MyAppFirebase.FIREBASE_PLIST_NAME, ofType: "plist") else {
      print("invalid firebase plist file : \(MyAppFirebase.FIREBASE_PLIST_NAME)")
      return
    }
    guard let firbaseOptions = FirebaseOptions(contentsOfFile: path) else {
      print("not make firbaseOptions : \(MyAppFirebase.FIREBASE_PLIST_NAME)")
      return
    }
    FirebaseApp.configure(options: firbaseOptions)
  }

}

```

使う時はこんな感じ

```AppDelegate.swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
   //初期化だけするよ
    _ = MyFirebase.shared
  }
```
python 学習を始める経理マン

初めまして、４０才目前のこてつです。
この度、ちょっとプログラミングの勉強を始めることにしました。

経理の仕事をして２０年弱、地味ながら色々と難しくも成長していく実感もあり
楽しい経験もさせて頂きました。
税理士事務所半年、会計士事務所１年、製造業１３年・・・（←イマココ）。

しかし、面白いと感じる場面が減ってチャレンジしている感がない、
提案してもちっとも前向きに対応しようとしない周りのマインド。

そんな中、色々なサービスが世の中には次々提供されてきて、
自分の世界がとてもレガシー化していっているのがヒシヒシ感じる。

焦る・・・なぜか・・・何かに・・・どうしよ・・・どうにかしたい・・・。

そこでYouTubeなどで目に留まったプログラミング。
試しにpythonを触ってみる・・・・。

毎日にらめっこしているExcelと似ている。（←個人差があります）
た、楽しい・・・何かできそう感が良い。
一人でも最小限のサービスを形にできる（可能性）のが経理と違うしやりがいありそう。
（しかも、副業なんてサイドストーリーもありえーる、なお良し！）

そんなこんなで、流行りのプログラミングを勉強します。
まだまだ情弱ながらに調べた範囲からpythonをチョイス。（Excelとも似てるし（個人的感想））
（最近やっとQiitaにたどり着く程度の情弱度）

早くアウトプットまでたどり着くように楽しみながら進めたいと思います。

ではまたの機会に