OmniAICreator/Qiita-1.07M huggingface dataset:
GUIアプリのバージョニングについてとりとめもなく考える

#はじめに
バージョニングといえば[セマンティックバージョニング](https://semver.org/lang/ja/)が有名ですが、ライブラリ向け（CLI）のため、GUIアプリケーションのバージョニングに関してはそぐわない部分もあります。そこでどうやって擦り合わせていくか、どのような課題があるかを整理、考察していきたいと思います。
また**[バージョンとエディションは違う](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3)**ものとして書きますのでご注意下さい。バージョンは垂直関係、エディションは並列関係として扱います。

#GUIアプリケーションならではの考慮事項
* **開発者だけでなく、（宣伝やユーザーサポートの都合上）ユーザーもある程度認識する** 
 * **このためコード（機能）ではなく、[UX](https://digitalidentity.co.jp/blog/ad/uiux-design.html)が基準となりやすい**
 * 特にゲームアプリではコード（機能）が増えなくてもUXが変化する余地が大きい（大規模なバランス調整／シナリオ、イラスト、音楽の追加等）ので、機能単位によるバージョニングに拘ると感覚と合わなくなる。
* **セマンティックバージョニングで重視されるAPIという概念が弱い（ない）**
 * 他のアプリから利用されることは前提としていないorサブの機能である

#方針
開発者の都合を優先するが、ある程度まではその他の立場にも配慮してバージョニングを行う。**ユーザーおよび（法人の場合）営業事務サイド-開発サイド間で混乱するため、双方で二重のバージョニングはできるだけ行わない。**
営業、宣伝の際はマイナーバージョン(2ケタ目),パッチバージョン（3ケタ目）の省略を許可する。あるいは大規模な場合はバージョンとは関係ない**サブタイトル**や**愛称**（開発コード名等／例：MacOS 10.14 "Mojave"）を用いたブランディングも検討する。
ただしこの場合も「～版」「～エディション」という表記は並列関係にある版（例：日本語版、英語版/iOS版,Android版等）を出した時に混乱するのでなるべく避ける。……まぁ実際には「スペシャルエディション」とかよく見ますし、おまけ付きレベルだと仰々しいサブタイトルつけられないんですが……。:sweat_smile: 
あと**開発者以外はセマンティックバージョニングも、バージョンとエディションの違いも詳しく知らない**ので、法人等の場合はざっくりでいいので周知するよう務める。

#メジャーバージョン
1. （ユーザー／プログラマー以外の視点）**ユーザーの体験（UX）が大きく変わる場合に上げる**
2. （プログラマー視点）コア機能の追加、もしくはサブ機能が複数追加され、UXが大きく変化する場合に上げる

GUIアプリはAPIの概念が弱いので、メジャーバージョンを上げるとするならばこういうケースが妥当かと思われます。特に大事なのが1.で、UIとUXの結びつきを考えれば大幅なUI変更でもメジャーバージョンを上げる理由になりうると考えます。
また有料GUIアプリの場合は**「メジャーバージョンが上がる＝別のアプリになった」として捉え独立させる**という手段が存在することに注意が必要です。「有料アプリ ver2」じゃなくて「有料アプリ2 ver1」みたいな感じですね。

#マイナーバージョン
1. （ユーザー／プログラマー以外の視点）**ユーザーの体験（UX）がそこそこ変わる場合に上げる**
2. （プログラマー視点）サブ機能を追加した場合に上げる

ここが擦り合わせの中心地であり、困難な場所ですね。特に人によって**「機能」の粒度と重要度（＝UXの変更具合）**が違うことが難しさの原因だと思います。
例えば「SNS連携機能」とか「クラウドバックアップ機能」を後付けで入れるとするじゃないですか。開発側からしたら機能が増えてるし工数もかかると思うので、マイナーバージョンを上げたくなりますが、ユーザーからすればアプリの本質にそれほど影響を及ぼさない、便利機能が増えたぐらいの扱いなので、マイナーバージョンを上げられると大仰に感じられる……みたいな感じですね。

#パッチバージョン
パッチバージョンに関してはセマンティックバージョニングの考え方をそのまま適用して構わないと思います。調整、修正レベルですね。

#課題点
## 開発者視点とユーザー視点で極端に食い違い、バージョニングをつけること自体が困難な場合 
例えば開発言語の変更とか大規模なリファクタリングを行い、機能はほぼそのまま（下手すりゃ劣化）なのに内部で走ってるコードは全然違う場合ですね。10年単位でやってるとこういうケースってあるんですよねぇ……。内部的にはver1.5→ver2なんだけどユーザー的にはver1.5→ver1.4みたいな:sob: 
この場合、開発サイドのバージョン管理上ではリファクタリング後のアプリを別に独立させる手もあります。しかし開発以外の営業事務やユーザーサイドからしたら当然同じアプリとして認識されるので、二重バージョニング待ったなしですね。

## メンテナンスで使用モジュールのメジャーバージョンアップした場合
これも迷いますね。アプリ自体は特に機能増えたりしてないけど、セキュリティとかバグを気にして使用モジュール／フレームワークのメジャーバージョンを上げた場合、パッチバージョンアップ扱いはおかしくない？みたいな感覚があります。個人的には大型モジュールやフレームワークならマイナーバージョンアップ扱いの方がいいのかな～という感じですね。感覚ベースは良くないと思うのですが、線引きが難しいです。

#後書き
約2年ぶりぐらいに書き直しました。前の時は本気でまとめきれてなかったんですが、多少はまとまったかな……。
アプリ開発をやってて自分自身この値でいいのかと迷うこともあり、また開発以外の層とのコミュニケーションコストが気になることもあって、何とかならんのかと考えてきました。しかし**関わる人数が多くなるにつれ、立場も知識も違いすぎて、誰もが納得いく統一したバージョンの数字を出すのが不可能になっていく**と今は考えています。そして二重バージョニングとかタイトル層に染み出す形で対処するのが現実的なんだろうなと思っています。
ただ**開発とそれ以外で呼称が違うと、コミュニケーションコストや事務ミスに繋がる**ことを、当事者全員が理解して擦り合わせる努力はした方がいいのではないか……と理想論を語って〆とさせていただきます。
Swift Extension UIDevice

```
extension UIDevice {
  var iPhoneX: Bool {
    return UIScreen.main.nativeBounds.height == 2436
  }
  
  var iPhone: Bool {
    return UIDevice.current.userInterfaceIdiom == .phone
  }
  
  enum ScreenType: String {
    case iPhone_4_4S = "iPhone 4 or iPhone 4S"
    case iPhone_5_5s_5c_SE = "iPhone 5, iPhone 5s, iPhone 5c or iPhone SE"
    case iPhone_6_6s_7_8 = "iPhone 6, iPhone 6s, iPhone 7 or iPhone 8"
    case iPhone_6Plus_6sPluss_7Plus_8Plus = "iPhone 6 Plus, iPhone 6s Plus, iPhone 7 Plus or iPhone 8 Plus"
    case iPhone_X_XS = "iPhone X or iPhone XS"
    case iPhone_XR = "iPhone XR"
    case iPhone_XSMax = "iPhone XS Max"
    case unknown
  }
  
  var screenType: ScreenType {
    switch UIScreen.main.nativeBounds.height {
    case 960:
      return .iPhone_4_4S
    case 1124:
      return .iPhone_5_5s_5c_SE
    case 1334:
      return .iPhone_6_6s_7_8
    case 1920, 2208:
      return .iPhone_6Plus_6sPluss_7Plus_8Plus
    case 1792:
      return .iPhone_XR
    case 2436:
      return .iPhone_X_XS
    case 2688:
      return .iPhone_XSMax
    default:
      return .unknown
    }
  }
}
```
月刊ギルドワークス （2019年3月）参加レポート

# あたらしい事業やプロダクトを立ち上げよう、でもどうやって？
<img width="736" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/65426/81743f9a-5c2d-49a7-8901-ee14e819dcbf.png">

2019/03/28（木）に開催された、
[月刊ギルドワークス （2019年3月）](https://guildworks.doorkeeper.jp/events/88201) 
に参加しました。
やっぱり<b>「チームビルディング」</b>は大事なんだな〜とつくづく感じました。
そして<b>「相手の仕事に関心を持つのは、チームメンバーの仕事」</b>感動しました。
参加してよかったです。

## 市谷 聡啓さん トーク
### 新規事業を立ち上げる
- メインはデジタルプロダクト
- 本、イベントもやる
- 仮設検証とアジャイル開発
- ０⇒１

### ギルドワークス
- 正しいものを正しく作る
- スタートアップ、事業会社の新規事業

### 仮説検証型アジャイル開発
- 「正しくないものをつくらない」戦略
- 正しいものを残し（仮設検証）、正しく作る（アジャイル開発）
- 何を作るのかを探すことと、正しく作ることをはっきり分ける。
- 安易に作らない。
- <b>人に刺さるのか、使ってくれるのか、は体験しないと分からない。</b>

### 基本はリーン製品開発
- セットベース
  - ベンチャーの場合、セットが広すぎる
- ポイントベース
  - 大企業の場合、セットが厳しすぎる
- <b>求められるのは、採用の失敗を抑えながら製品開発を行う手段</b>

### 仮説検証の精度と頻度のマネジメント
<img width="368" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/65426/a78f51d5-832d-ff76-63f5-e82fd6be2f22.png">

### 事例
- 仮説検証のコンセプトの叩き上げ   
<img width="368" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/65426/eeb0ed5e-f1c8-13e5-9d8d-dafed6934447.png">

### 仮設から形あるものへ変換する入り口をつくる

- 常にチームビルディング
  - 時間をともにするしかない。
  - 単純接触効果
      - 接触回数を増やす
  - ソフトウエア開発は演出
  - <b>ほぼゼロからPBL取り出しまで２〜３ヶ月</b>
- つくり、形にしながら共通理解を深める時間
  - スクラムベース（１週間スプリント）
  - 全員リモートワーク
  - <b>MVP開発に２ヶ月、仕上げに１ヶ月</b>

- 大企業の新規事業は２回戦う
  - 最初の関門はプロダクトの方向性を見定めること
  - コンセプトをまとめた後の、社内関係者の調整
  - チームで乗り越えるしかない。
  - <b>「ともにつくる」</b>にあるかぎり、<b>越境</b>できる 

## 岩切 晃子さん トーク
<img width="368" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/65426/b83ee730-5db6-b644-de01-afe4ae440d98.png">

- 著者のストーリーを最大化するのが出版社の仕事。
- 著者の言葉を最大化する為。
- 事業継続性の観点で、新規事業にトライすることが必然。
- 作る、売る、知らせる、全部やるのをおすすめする。
- <b>収益を上げるのは当然。新規事業にチャレンジし続ける。</b>

## Q&A
- 仮説キャンバスの作成からプロトタイプ検証までをどれくらいの期間で対応するのか、  
  各プロセスにどれくらいの時間をかけるのか、どんな要員で対応するのかを知りたいです
  - ２ヶ月で探す。
  - インタビューは時間がかかる。
- 正しいものを探すために、  
  「質の高い問い」をどうやって立てるかが難しいなと  
  壁に当たっているところです・・・
  - いつもと違うことをしてみる。
  - <b>新しいことをするために自分に投資をしてみる。</b>
  - <b>自分の中に勉強する仕組みをつくる。</b>
- 採算分岐を探すコツを教えて欲しいです。
  - 自分のサービスのログを取ってみる。
- 「この粒度以上だったら仮説検証が難しいわー」みたいな  
  規模/抽象度の限界みたいなものはありますか？
  - ない。
  - 分かりづらい、とはターゲットがはっきりしてないか、  
    マーケットがはっきりしていないか。
- 経験が浅いメンバーだけで新規事業に取り組むときに、  
  気をつけることやアドバイスはありますか？
  - 役員を味方にする。
  - 社内スポンサーを探していく。
- 「作る→売る→知らせる」全部やるにすごく共感します！
  - みんながしていることを分かると協力できる。
  - 相手をしる、みんなのことを知ることでやれることも増える。
  - <b>相手の仕事に関心を持つのは、チームメンバーの仕事。</b>
- ともに作るためになるべき垣根をなくす、ヒエラルキーをなくす事が重要と思う一方で、  
  プロダクトオーナーや経営者が完全にコントロールしないのも違う気がします。  
  いい塩梅ってどこにあるのでしょうか？


以上
IT業界の新人さんに向けて(導入)

#はじめに
この内容はIT関連の組織へ入ろうとしている方へ向けて、業務にかかわる広範な内容を簡素に浅くまとめた内容です。
本内容だけで業務が完結出来るような内容では到底ありませんが、新しくチャレンジされる方が最低限の知識を得るために記載したものになります。

本内容は2016年ごろに後輩へ向けて執筆した内容になります。
内容は、古かったり間違えていたりする場合があります。

もともとは長編のコンテンツですが、細かく分割し、公開できる範囲で公開していきます。

・導入
・インフラ関連
・開発関連
…を予定しています。
インフラ寄りの畑にいる人間なので、インフラ関連の内容が多いかと思います。
それぞれの概要と、私が心がけていることについて記載しています。

#IT経験者ではない方へ向けて
IT経験者ではない方にとって、わけがわからない箇所が頻出すると思います。
まずは細かい「わからない」をたくさん積み上げてください。
「わからない」に触れる度に、理解しようとしてください。
ITは難しく感じられるかもしれませんが、人間が考え出した技術です。
難しい部分は頭の良い人たちが組み上げてくれます。

大事なことは興味を持つことです。
自身にも理解できるかもしれない、という自身の可能性を捨てないことです。

非常に難しいですが、誰かに質問したり、自分で調べたり、あきらめずに続けることで、いつか「たくさんのわからないの点」が、線でつながる瞬間が訪れます。
その線はあっという間に面になり、一気に理解が進む瞬間が訪れます。

成長の頭打ち(スランプ)の先に、大きな成長があることはIT以外でも周知の事実です。

#IT業界を大別すると
前述したように「開発」「インフラ」などの言葉が出てきます。
IT業界は大きく、この2つにジャンル分けされます。
その大枠をざっくりと理解しておいてください。
IT業界は、お医者さんや「世の中のインフラ」に似通ったところが多くあります。
「開発」「インフラ」は「内科」「外科」のように全く別のものと理解頂いた方が良いです。
「科」の中にも「整形外科」「耳鼻咽喉科」等々、様々な科があるように、ITの「開発」「インフラ」の中にも様々な技術、ジャンルがあります。

「開発」と「インフラ」の違いを理解するには「世の中のインフラ」を例にするとわかりやすいと思います。
「世の中のインフラ」は公共設備や基盤を指す場合が多いです。
ITの「インフラ」、つまりITインフラは、パソコン、サーバー、ネットワーク、ストレージ、基盤となるソフトウェアなどを指します。
これらITインフラを「世の中のインフラ」に置き換えると、「道路」や「施設」などに近いイメージになります。
同様に開発を置き換えると、「車」や「施設で提供されるサービス」などに近いイメージになります。
お互いが無ければ全体として成り立ちませんが、「道路」を作っている人は「車」の作り方を知りません。その逆もまた然り。
「施設」でどのようなサービスを提供するかは技術、アイデア次第ですが、サービスを実現できる力があっても「施設」が無ければ実現できません。

このように「開発」と「インフラ」は皆さんが思っているより切り離された世界です。
全くの別物といっても過言ではありません。

経験上、「開発」と「インフラ」のコミュニケーションがうまくいき、お互いに尊重しあっているプロジェクトは成功します。
15日目：アプリをネットに公開したく、Herokuを使ってみた。

Rails製アプリをネットにあげるため、Herokuを使ってみた。
Herokuとは、PaaSお呼ばれるサービス。

#Paasとは
> [［用語］PaaS（Platform as a Service）@"富士通"より](http://jp.fujitsu.com/solutions/cloud/glossary/public-paas.html)
>>アプリケーションを開発・実行するために必要なハードウェア、OSなどの環境をネットワーク経由で利用する形態 。開発・実行環境が提供されるため、企業ごとに独自のサービスを構築できる。

>>従来、企業が業務システムを導入するためには、プラットフォームと呼ばれる開発・運用のための基盤を用意し、システム構築・運用する必要があった。PaaSはクラウド上にあらかじめ用意されているシステム導入のための環境を組み合わせて利用でき、開発や運用にかかる費用・工数、を削減できる。

要はネットアプリ作成の開発環境に必要なものを揃えてくれてるもの。

#使用環境
- ホストOS: Windows10 Home
- 仮想環境: Ubuntu Bento/Bionic
- Ruby：2.51
- Rails: 5.2.2
    - gem ：'devise'（ログイン等の機能用）、'kaminari' （ページネーション）
- DB: PostgreSQL

#Heroku実作業
##Heroku実装
1. Herokuサイトでアカウント作成
2. Herokuのインストール
[参照：Getting Started on Heroku with Ruby](https://devcenter.heroku.com/articles/getting-started-with-ruby?singlepage=true)

```:terminal
sudo snap install heroku --clasic
```
##Herokuにログイン

```:terminal
heroku login
# こんなのが出る。自動でブラウザが開かないときは、自分で開いてあげる必要がある。
heroku: Press any key to open up the browser to login or q to exit
 ›   Warning: If browser does not open, visit
 ›   https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com
```
ローカルのプロジェクトディレクトリに移動

#アプリをHerokuへデプロイ
##アプリのソースコードを受け取るHerokuを準備する

```:terminal
heroku create
# 出力例
Creating polar-inlet-4930... done, stack is cedar-14
http://polar-inlet-4930.herokuapp.com/ | https://git.heroku.com/polar-inlet-4930.git
Git remote heroku added
```
この時、herokuにより自動でgit remoteが生成され、local git repositoryと紐付けられる。

##コードをデプロイする。
```terminal:
git add .

git commit -m "init"

git push heroku master
```
##Herokuでマイグレーションを行う
```:terminal
heroku run rails db:migrate
```

#Herokuのその他コマンド
##Heroku上にデータを追加する
まず、git push heroku masterしてもローカルにあるデータはアップロードされない。
なので、Herokuと連携させたコンソールで入力しないといけない。

```:terminal
heroku run rails console
```
コンソールでのデータ入力は、ローカル環境用と同じ。

##操作ログを見る
```:terminal
heroku logs --tail
```
##Heroku上のファイルの詳細を見る
```:terminal
heroku "ls -l"
```
##Heroku上のアプリのURLとその他を確認
```:terminal
heroku info
```

授業のRubyonRails製のサイトをアップロードした。
データ入力はしたが、Bootstrapがまだまだなので、UI/UX的には全然見れたものじゃないが。
今週土日には、どうにかします。

データをつぎ足したり、カラム変更等で、nullデータが入り込んだりとしてるので、プロダクション側ではありますが、DB内のデータを削除しましたので、今はアクセスできません。ので。
[そのリンク]()
Mock、Mockitの用語備忘録

###　MOCKの用語の備忘録です
クオリティ重視ではないのでご了承のほど。
ちょろっとMOCKについて説明も書いておきます。（自分への戒めのため）

ここでは`Junit`向けの話になりますのでご了承ください。

###MOCKってなんぞや
・わかりやすくいうと**「はりぼて」**です。

例えば下記のようなクラスとメソッドがあったとします。

```
public class simple(){
  public sinplemethod(int testcolumn){
    if（int testcolumn=0）{
        　return id =123;
    }elseif(testcolumn=1){
          return id =1234;
    }else{
         return id=0
    }
}
```

上記の場合はtestcolumnの値によって結果が変わる簡易なsimpleメソッドです。
※実際にはこんな変数名付けたらだめですよ～。

この時、この機能を使用している別のメソッドをテストしたいと思ったとき、
一回一回値を設定するのは非常に手間です。
そこで**疑似的に出力される値を設定するために**使うのが**Mock**になります。

###Mockの利便性
先人がわかりやすく使用方法は伝えているため
私の記事ではMockの理解方法について。

上記の例で行くと、testcolumnが0の時にid=123と返されます。

あらかじめ@Mockedないしは@Mockと該当のクラスをMockに設定しておけば
返す値をテストコード側で設定できます。
というのが簡単な概要。
わかりやすく書くんならこう

```

package sample.jmockit;
import org.junit.Test;
import mockit.Mocked;

public class JMockitTest {

    @Mocked
    private Simple simple;

    @Test
    public void test() throws Exception {
        assertEquals(1234,simple(1));
    }
}

```
※引数に1を渡したら1234が帰ってくるかの確認のためのテスト
　中の1を0に変えたら123が帰ってくるか、等の確認も繰り返しできる。
　~~正直上のが動くかわかんない~~~

※あくまで使いかたの一例です。
　Mockがとらえにくい人向けに書いてるのですごいおおざっぱな説明です。

簡単な説明でしたが、先人たちがかなりわかりやすい記事を書いているので
参考にどうぞ。
**Mock　使い方　Java**とかでググったら
かなり出てくるんでJavaユーザの方はおすすめです。
（C#とかは知らん。でも結構出てくる）

####ここから備忘録なので興味ない方はスキップもしくはブラウザバックでどうぞ
`@Mocked`
　上記のアノテーションを指定して生成したインスタンスは、モックのメソッドやコンストラクタの実装は空になり、利用するメソッドに対してnew Expectations() {...}で動作を設定できる。
つまりExpectations（）｛...｝で中身を決めれば値が設定し放題。やったね。


`＠Test`
public void なメソッドに付与することでJUnitにテストメソッドであることを認識させるアノテーションらしい。
time out　を付けると「制限時間」が設けられる。　負荷テストとかに役立ちそう。


`@Ignore``@Disabled`
見たことないけど一時的にテストを無視できるらしい。
コメントアウトでよくね？

`@BeforeEach`
これがついているメソッドは各テスト実行前に毎回実施される。
つまり初期化とかをここに置けば毎回初期化されるから網羅テストするときとかに便利。

`@Beforeall`
これがついているメソッドはテスト実行前に必ず実施される。

'@AfterEach'
これがついているメソッドは各テスト実行後に毎回実施される。
つまり初期化とかをここに置けば毎回初期化され()


`@Injectable`
 特定のインスタンスのみモックする
`@Mocked`
 全てのインスタンスをモックする
injectableとMockedの違いはここがわかりやすいかも
>http://taka-2.hatenablog.jp/entry/20150504/p2


###基本的なJunitの書き方

1.インポート
2.テストクラス作成
3.InjectableもあればInjectable
4.Before処理があればBefore処理
5.testクラスかいてMockにしたメソッドを書いて、期待できる動作を書く。
6.実際にメソッド呼び出す。
7.assertで結果と一致してるか確認

実際の例は下記を参照すると良し。
>JMockit使い方メモ
>https://qiita.com/opengl-8080/items/a49d4dae9067413ccdd6


リフレクションとかも書きたいのだけどこのへんで。
先人の皆様ありがとうございます。
STM32マイコンのSLEEPモードをデバッグする方法

# 確認環境
- STM32マイコン
- Keil μVision 及び TrueSTUDIO
- ST-Link/V2
- STM32Cube (HALライブラリ)

# SLEEPモードの実装
まず、SLEEPモードの実装は概ね以下となります。

```
/* 
　不要な割り込みを止める
*/
HAL_SuspendTick();
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
/* 
　割り込みを再開 
*/
```

## 不要な割り込みを止める
SLEEP状態で割り込みが入るとSLEEP状態が解除されてしまいますので、
タイマーなどの不要な割り込みを停止させておきます。

## SysTickタイマーを止める
SysTickの割り込みも停止させます。
CubeMXのHALライブラリでは以下を呼びます。
```HAL_SuspendTick();
```
復帰。
```HAL_ResumeTick();
```

## SLEEPモードにする
以下呼び出しでSLEEPモードになります。
``` HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
```
SLEEPモードが解除されるまで上記呼び出しから帰ってきません。

## SLEEPモードからの復帰
外部割込みやタイマーなどの割り込みが入るとSLEEPモードが解除されます。
その割り込みから抜けると、前項のHAL_PWR_EnterSLEEPMode()の続きから処理が再開します。

# デバッガを落とさない方法
Keil μVisionやTrueSTUDIOでデバッグ中にSLEEPモードにすると、
リンクが切れてデバッグ状態から抜けてしまいます。

あらかじめ以下を呼んでおくことで、SLEEPモード中の割り込みをブレークポイントで捕まえたり、SLEEPモードからの復帰もトレースすることが出来ます。
``` HAL_DBGMCU_EnableDBGSleepMode(); 
```

ただ、これによりクロックが供給されて、電力を消費してしまいますので、
プロジェクト設定でマクロを定義し、デバッグ時のみ呼ぶようにしておきます。

# SLEEP状態でデバッガを接続する方法
Keil μVisionのデフォルト設定では、マイコンがSLEEP状態にある時はデバッガで接続出来ません。
optionから以下のように「Connect: under Reset」を設定しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/1f273f31-e440-8fa6-6f37-057898c84e9e.png)

# まとめ
```
/* 
　不要な割り込みを止める
*/
HAL_SuspendTick();
#if DEBUG
HAL_DBGMCU_EnableDBGSleepMode();
#endif
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
/* 
　割り込みを再開 
*/
```
PgAdminⅢの使い方

# データベースの作成
①オブジェクトブラウザ → サーバグループ → サーバ → PostgreSQL → データベースを右クリック。新しいデータベースを選択します。
![00000.png](https://qiita-image-store.s3.amazonaws.com/0/250215/327b9b23-fd48-4e24-89e6-1b97e6df1087.png)
②ダイアログが開くのでプロパティ→名前を入力しOKを押下する。
![00001.png](https://qiita-image-store.s3.amazonaws.com/0/250215/ae8af11a-5821-c158-d595-cf535cf2dd85.png)
→ データベースが作成されます。
![00002.png](https://qiita-image-store.s3.amazonaws.com/0/250215/b5fc52e5-3bf1-75c3-6beb-a2ee8ee2f668.png)

# テーブルの作成方法
①作成されたデータベースを開き、スキーマ→public→テーブルを右クリックし、新しいテーブルを選択します。
![00003.png](https://qiita-image-store.s3.amazonaws.com/0/250215/992f425c-b3a5-3c62-4290-1acd8c615fe7.png)

②プロパティタブ→名前を入力します。
![00004.png](https://qiita-image-store.s3.amazonaws.com/0/250215/639e22f6-0163-7186-b0d1-d22eeb5775c3.png)


③列タブ→追加を押下します。
![00005.png](https://qiita-image-store.s3.amazonaws.com/0/250215/71eaf952-cd3e-1176-7a7c-cd0bd0b5be4f.png)

④新しい列ウィザードに任意の列の設定をします。
![00006.png](https://qiita-image-store.s3.amazonaws.com/0/250215/cd825c13-02cc-c8cb-4021-3bd235f7e833.png)

# Primary_keyを設定する
①テーブルを作成後、テーブルを右クリックし制約タブを選択し追加をクリックします。
![00007.png](https://qiita-image-store.s3.amazonaws.com/0/250215/854d1c4a-95d5-cd9c-f6d2-3390ca2788b9.png)

②プロパティ→名前を入力します。
![00008.png](https://qiita-image-store.s3.amazonaws.com/0/250215/70205d20-9d36-e639-4e38-e3904bf6ccb6.png)

②列タブを選択し、列を指定し追加を押下します。
![00009.png](https://qiita-image-store.s3.amazonaws.com/0/250215/b8757ae5-ad9d-1cd0-0f19-1a241c865d52.png)

③OKを押下します。
④OKを押下します。

# データを入力する
①作成したテーブルを選択します。
②選択オブジェクトでデータをビューをクリックします。
![00010.png](https://qiita-image-store.s3.amazonaws.com/0/250215/d9b8c12b-458d-a06c-b765-b6d90be7f0d8.png)

③データを入力します。
送信メールが正しくDKIM,SPF設定されているか簡単に確認する方法

# 目的

一般人は気にしたことはないでしょうが、我々サーバ開発者は外部にメール送信をする際に、最近はDKIMやSPFなどのドメイン認証を考慮する必要があります。これらは送信元ドメインのDNSレコードに設定が必要なので、DNSの知識が必要ですし、もし遠方のDNS管理者に依頼しないといけないとなったら、手続きや調整で一苦労します。

それはさておき、DNS設定が無事終わったら今度は動作確認をしたいところですが、やみくもにメールをとばしまくるわけにもいきません。そこで、DKIMやSPFがきちんと設定されているか簡単に確認する方法があります。

# 方法

任意のGmailの宛先に送信元ドメイン側からメール送信をします。

Gmail側で受信を確認します。GmailはSPFやDKIMをPassしなくても受信可能です（設定によります）。ただしメールが迷惑メールに振り分けられる場合がありますのでもし届かないと思ったらそちらも確認してみてください。

Gmail側で受信できたら、メッセージのソースを表示します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/a91d9f0d-9d0e-c2b2-70ae-13d79432a557.png)

すると、次のようにSPFとDKIMをパスしたかどうかがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241424/124cd1bf-2c8e-46c1-b5d9-bd033adec4fa.png)

簡単ですね。さすがGoogleは開発者の気持ちをわかっておられる。
Pulumi+VSCodeの書き心地が抜群な件


## Pulumiとは
ちょっと前にバズってたIaCツール。Terraformと比較されてる。個人的には、Terraform一強の状況がなんだかぁだったので、こうゆうのが出るとちょっとわくわく。

## Terraformに対して
TerraformがHCLによる設定記述を行うのに対し、Pulumiは好きな言語でプログラミングする。"Config" VS "Code"といったところ。

## パブリッククラウドへの対応状況
AWS,GCP,Azureは抑えている模様。

## Docker,Kubernetesにも対応

## Visual Studio Codeを使ってTypeScriptで書く=>良い
- 型定義のおかげで、補完がヌルヌル効く。
- 補完がヌルヌル効くので、リソース間の関係が定義しやすい。また、タイプミスが激減する。
- 型安全なため、実行時のエラーがかなり減らせる。
- プログラミングとは言っても、さほど複雑ではない。

## 現状のつらみ
- Terraformのように、多様なバックエンド(S3,GCSなど)に対応していない。現状では、PulumiのWebサービスかローカルに状態を持たせる。
  - ただし、gcsfuseやs3fsを使って自前で実現するのはさほど難しくはない。

## まとめ
Visual Studio Codeを使ってPulumiを試してみることだ。Terraformもよいが、Pulumiもかなりよいぞ。
Macでエレコムのトラックボールが動かないときに見るやつ

## tl;dr
公式のFAQを読みましょう。
[【マウスアシスタント】【Mac】マウスアシスタントで「画面アプリが正常に起動できません」とエラーが出る](http://qa.elecom.co.jp/faq_detail.html?id=4855&category=262&page=1) 

## 経緯
Macを新調したら普段使ってるトラックボールの便利ボタンたちが効かなくなり、解決に1時間以上使ってしまったのでメモ。
というかMac買い換えるたびにこの問題にハマってる（何年かに一回の買い替えだと忘れてる）し、
毎回最悪の気分でドライバに悪態つきながら時間を浪費してるので、次の新調のときに同じ轍を踏まないように。

## 症状
トラックボールの便利ボタンが効かない。
エレコムマウスアシスタントを開くと

> 設定可能なマウスが接続されていません

とか言われる。接続してるのに。
ググっても同じ症例が出なかったり、出ても未解決だったりする。

## 環境
- macOS Mojave
- [M-HT1URBK](https://www.elecom.co.jp/products/M-HT1URBK.html)
Node.js＆GraphQL part2 ~ Mutation / Subscription / お絵描き ~

MutationsとSubscriptionについてまとめようと思ったけどQiitaのプラットフォームでは自分には不可能だったので、自分のためだけにお絵描きと簡単なメモを残します。

・Query: Read
・Mutation: Create / Update / Delete
・Subscription: WebSocketでRealtimeに読み取り

・https://github.com/hugo-ishikawa/GraphQL-Mutation-Subscription

#お絵描き
```javascript:index.js
import { GraphQLServer, PubSub } from 'graphql-yoga'
import db from './db'
import Query from './resolvers/Query'
import Mutation from './resolvers/Mutation'
import Subscription from './resolvers/Subscription'
import User from './resolvers/User'
import Post from './resolvers/Post'
import Comment from './resolvers/Comment'

const pubsub = new PubSub()

const server = new GraphQLServer({
    typeDefs: './src/schema.graphql',
    resolvers: {
        Query,
        Mutation,
        Subscription,
        User,
        Post,
        Comment
    },
    context: {
        db,
        pubsub
    }
})

server.start(() => {
    console.log('server is up');
})
```
![イラスト.jpg](https://qiita-image-store.s3.amazonaws.com/0/385539/1e11f73b-f2cd-7ba0-e565-d41b1b06766b.jpeg)
PowerShellでファイル名を一括置換する簡単な例

# PowerShellでファイル名を一括置換する簡単な例

## 前提

* 概要
   * PowerShellでファイル名の簡単な置換をやりたい人向け
   * とりあえずこれだけでも素早くできれば、業務で楽ができるという内容
   * もっと色々やりたい人は、[こちら](https://qiita.com/acuo/items/a4f83d886c4b8a7fcf52)がよい。

* 注意事項
   * PowerShellスクリプトの文字エンコーディングは `Shift JIS` にする。
   * ※ PowerShellで日本語を含むスクリプトを書く場合は、UTF8のBOMあり、もしくはShift JISになる。

* 実施環境
   * 以下のスクリプトは、変更対象のファイルが存在するフォルダで起動するものとする。

## ファイル名の単純な変更

* シチュエーション
   * フォルダ内に `〇〇_test_reslut.log ` というファイルがたくさんあるとする。
   * これを一括で `〇〇_unit_test_reslut.log ` というファイル名に変更したいとする。

* コード

   ```PowerShell
   # ファイル名の最後が .log で終わるファイルを取得する。
   $File = Get-ChildItem ./ -Name | Where-Object {$_ -match '.log$'}
   foreach ($OldName in $File) {
      # _test の部分を _unit_test に変更する。
      $NewName = $OldName.Replace('_test', '_unit_test')
      # ファイル名を変更する。
      Rename-Item -Path $OldName -NewName $NewName
   }
   ```

## 日付のフォーマットを変更したい

* シチュエーション
   * フォルダ内に `〇〇_test_20190303.log ` のような形式で日付の入ったファイルがたくさんある。
   * これを一括で `〇〇_test_2019-03-03.log ` という形式のファイル名に変更したいとする。

* コード

   ```PowerShell
   # ファイル名の最後が ._<数字８桁>_log で終わるファイルを取得する。
   $File = Get-ChildItem ./ -Name | Where-Object {$_ -match '_\d{8}.log$'}
   foreach ($OldName in $File) {
      # <数字８桁>の部分の形式を変える。
      $NewName = $OldName -replace '_test_(\d{4})(\d{2})(\d{2})', '_test_$1-$2-$3'
      # ファイル名を変更する。
      Rename-Item -Path $OldName -NewName $NewName
   }
   ```
Prefixに渡す引数とは（Rails 初学者向き）

Railsでパスを指定する方法としてPrefixを用いるとき、引数を渡す必要がある場合をご存知ですか？


そもそもPrefixって？という方にちょっと解説を
Railsフレームワークにてアプリケーションのルーティングを設定する際に登場します。

# Prefix

例えば**tweetsを表示する**、**tweetを編集する**という２つのルーティングを設定するとしましょう！

ターミナルからアプリケーションのディレクトリにて以下を実行すると

```
$ rake routes
```
次のような表に示した内容が表示されると思います。

|Prefix|Verb|URI Pattern|Controller#Action|
|-----:|----|-----------|-----------------|
|tweets|GET|/tweets|tweets#index|
|edit_tweet|GET|/tweets/:id/edit|tweets#edit|

この時のパスの指定方法の一つが**Prefix**と言います。


##PrefixとURI Patternの違い

リンク先のルート指定には**Prefix**、**URI Pattern**のどちらかを記述しますがこの時に注意すべき点があります。
それは

***パスにparamsを含むかどうか***です

tweets#indexを指定するパスは
**/tweet**

tweet#editを指定するパスは
**/tweet/:id/edit**
こちらのパスはどのツイートか特定するためidが必要です。

しかし、Prefixパスには、表記だけではidの情報を持ちません。

例えば、Prefixパスで指定したlinkタグを作ってみると

```
link_to tweet_path do 　　  #問題なくtweet#indexへ
link_to edit_tweet_path    #RoutingError 
```

となります。

そこで**変数を引数に渡す**必要が出てきます

上記のパスを正しく書き直すと以下のように

```
link_to edit_tweet_path(@tweet)
```
ツイートのidを持った変数を引数に渡すことで、正しいパスとなります。


以上で、変数を持つ理由が理解できたと思います。


ここまで読んでいただきありがとうございます。
おかしな部分があればご指摘いただければ幸いです。
Windows10でSSDを追加するときに躓いたこと

#概要
　この記事は、SSDを買ったのでノートPCに追加しようとしたら躓いた話をまとめたものです。

#環境
OS：Windows10 Pro
SSD：WD Blue M.2 2280 SATA3 250GB

#結論から言うと
　OSをインストールするときは不要なものを外そう！（HDD含む）

#SSDを買った
　ノートPCの動作が重く、HDDの容量も残り少なかった。ノートPCの裏を見てみると丁度M.2のスロットがあったのでSSDを買うことにした。
　
　事前にインストールメディアを用意し、HDDのバックアップも取り、いざインストールしようとした。

#起動しない
　BIOS設定からUSBブートにし、無事インストールメディアが起動した。不具合が起こってはいけないと思い、HDDのCドライブを初期化した。これで安心してSSDを選択してOSをインストールした。

　SSDのせいか、やけにインストールが短く感じた。さすがSSDと感心し、再起動するパソコンを眺めていた。しかし、再起動後の画面には見慣れないものが表示されていた。

#「起動に必要なファイルが見つかりません」（そんな感じの文）
　青い背景に白い文字でそんなことが書かれていた。画面の下には各操作が書かれており一通り試してみたが、何も立ち上がらずこの画面に戻ってしまった。

　しかたがないので再びインストールメディアからインストールしてみたが、同じ結果になるだけだった。

#解決
　もしやHDDが悪さをしているのではと思い、HDDをはずしてインストールしてみたところ無事ログイン画面が表示された。

#原因
　おそらく、HDDにあった、回復パーティション等が悪さをしていたのではないかと思う。
　インストールを繰り返す際、インターネットで調べた様々な方法をやってみた。その中で、OSをインストールするドライブを選択し、「新規」を実行する方法を試してみた。その時、生成されたのは、プライマリパーティションと回復パーティションの二つだけだっただった。
　しかし、HDDを外した状態でSSDを「新規」実行してみると四つのパーティションができた。
　おそらく、すでにあるパーティションは除いて生成されると思われる。そのため、HDDにあった二つのパーティションはSSDには生成されたかったと思われる。

#結論
　OSをインストールする際は、HDDを含め不要なものを外す、または、ストレージはすべて初期化されたものしか認識させないようにする必要がある。
非同期通信の流れ２

非同期通信のについて詳細部に学習が及んできたため、もう一度流れについておさらい。
ここではメッセージの非同期通信を想定

１.jsファイル
入力された値をFormDataとして受け取り、Ajaxを記述。

２.controller
アクションを通じてデータの保存ができたら、format.jsonもしくはformt.htmlの場合に分けるコードを記載。

３.jbuilder
JSON形式のデータを作成。

４.jsファイル
JSON形式のデータを取得。ビューとして表示するコードの記載。
[メモ]JJUGナイトセミナー

## JJUGナイトセミナーの個人的なメモ

### きしださんの話
- 基本的にはQiitaの話
- 言語とAPIの話
- JEP8つAPI2つ
- プログラムを書くことに影響はない
- switch文はまだpreviewなのでプロダクトには使わない方がいい
- 12に入るものと13の可能性高いやつの紹介

####switchのはなし
- ステートメントから式へ
- javacなどで enable previewしないと使えない
- 多分仕様が変わるので今は積極的に使うなと
- 複数caseできる
	- case句に複数値をもてる
- arrow構文
	-   ラムダ式使える
	-   break不要
	-   見やすい、書きやすい
	-   ブロック書くときは複数処理を持つとき
- switchが式になるよ
- 全てに対応するケースが必要（数値化・文字列はdefault必須） 

##### 注意事項
- javacなどで enable previewしないと使えない
- breakで値が返すところが怪しい(break-withになりそう)
- javaの言語仕様として-の入ってるキーワードが増えそう
	- break-with
	- package-private(明示的に宣言するようになるなら)	

#### JVM Constant API
- Java言語仕様の内部にシンボルリファレンスてのがあって、シンボルリファレンスをAPIから使えるようにする
- クラスファイルつくるときにリフレクションをがちゃがちゃやるときに使うらしい
- あんまりプログラミングしてて意識することはない

#### CDS Archives
- システムに関するクラス情報をまとめていい感じにしてくれる
- 起動がちょっとはやくなる

#### Shennandoah
- G1GCとzgcの間埋めてくれるのかと
- シェナンドって読むらしい

#### Microbenchmark Suite
- 普通の人はつかわない（さくらばさん）
- JDKのパフォーマンス見るやつなんで、JDK開発者以外は用ない

#### その他API変更
##### Collectors.teeing
- ２つのCollectorsの値を使いたいとき
- countingとjoiningとか
- teeing(Collectors, Collectors), (c, s) -> ....)
- teeingの中でネストすれば3つでも4つでもいける

##### String.transform()
- mapからgetしてさらにその戻り値でmapからgetするとき
- str.transform(Class:get).transform(Class:get)みたいな

##### String.indent()
- str.indent(3)みたいな感じ
- インデントついてかえってくる
- マイナス値もいける
- ホワイトスペースなければ無視される

##### NumberFormat.getCompactNumberInstance()
- .formatに数値渡せば変換される
- 兆まで対応

##### FileMismatch
- ふたつのファイルのうち、最初に異なった位置を返す
- どこが違うかも教えてくれる

##### skipNBytes
- きしださんのQiitaみたら書いてある

#### Java13あるかも
- switchの正式化
- Jpackage
- NullPointerExceptionの仕様変更

##### switch
- preview外れそう
- break-with
- default-withはない
- package-privateはあるかも

##### JPackage
- JavaFXpackagerと中身おなじ
- [きしださんのブログ](http://nowokay.hatenablog.com/entry/2019/03/07/085905)みて
- JDKを含んだファイルツリーを作ってパッケージングしてみたいなことができるらしい

##### NullPointerExceptionの仕様変更
- どこでぬるぽが起きたかわかりやすくなるかも

#### RawStringLiteralsの復活
- 元々は開業などを含んだ文字列をバッククオートで囲む
- でも安易じゃねってなったらしい
- ダブルクオート3つ？
- 13でpreviewも間に合わないかもしれん

### David Buckさんの話
- JVMエンジニアさん
- weblogicについては何もわからん

#### デモ
- Shenandoahを使います
- Oracle JDKには入ってない
- RedHatのプロジェクトなので
- 自分からは話せないｗｗｗ
- 終わりますｗｗｗ

#### ZGCの話
##### ZGCとは
- zとはなにか
- zfs（zettabyte file system）てのがあった
- zettabyteは1000の７乗＝10億テラバイト
- zebibyteは1024の7乗
- zfsとzgcは関係あんまりない
- JDK11以降のGC
- Scalable Low-Latency なGC
- 複数TBまでヒープ対応可能
- 10ms以下の停止(実際はもっと早い)
- チューニングは基本いらん（ヒープサイズのみ指定すればOk）
- 15%以下のオーバーヘッド
- current : Region式
- tracing : NUMA対応
- Compactiong : Load barriers
- Single Generetion : Colored pointers

##### ZGCの特徴
- どんなにでかいヒープを使ってもレスポンスは変わらん
- ルート参照には影響食らう
- Javaの実行スレッドの数を抑える
- スレッドスキャニング以外はコンカレントでGCできる
- めっちゃ画期的らしい
- アドレス空間が4TB予約される
- チューニングでGCのワーカスレッドもいじれるけど実行スレッドが減るよ

### 参考になりそうなリンク
- [Java12新機能まとめ by きしださん](https://qiita.com/nowokay/items/0e860819b6ffb1aca90a)
- [きしださんのブログ](http://nowokay.hatenablog.com/entry/2019/03/07/085905)
- [さくらばさんのブログ](http://www.javainthebox.com/2019/03/jepjava-se-12.html)
- [サイボウズさんのGCに関するブログ](https://blog.cybozu.io/entry/2018/05/29/080000)
【IBM Watson】気象観測データをPandasでデータ操作する

#概要

[前回の記事](https://qiita.com/yut-nagase/items/4c9a6334a617184bc9b7)の続きです。
今回はPandasでもう少し行列データを操作したいと思います。

#Pandasでデータ操作
- まず、Pandasでよく使う用語について記載しておきます。
	- Series:1次元配列のことです。
	- Data Frame:2次元配列(行列)データのことです。
	- Panel:3次元配列データのことです。
	- index:行ラベルのことです。
	- columns:列のことです。Programingをやられる方にとってはおなじみの用語ですね。

- 用語について、軽く抑えたところで、進めていきたいと思います。
- [前回](https://qiita.com/yut-nagase/items/4c9a6334a617184bc9b7)は、気象庁観測データCSVを読み込んだところまで行きました。その続きでデータ操作を行います。

- shapeで行列の数を求めることが出来ます。
- columnsで列名を求めることが出来ます。

```py
print('shape:', df_data_1.shape)
print('columns:', df_data_1.columns)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/d464c504-7da2-c60b-be76-f01240a46596.png)

- 上記で求めたcolumns を指定してデータを出力してみます。

```py
df_data_1[['都道府県', '現在時刻(日)','現在時刻(時)', '現在時刻(分)', '現在値(mm)']]
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/871a4f13-846c-7a5b-50a2-25fe8b3a0c07.png)

- 出力する条件を絞ってみましょう。都道府県が東京都のデータに絞ってみます。
- 加工する前に、列名は日本語だと何かと難しいです。しかも、気象庁の天気データCSVは列名に半角括弧なども含まれているので、本格的にデータ操作するのであれば、英語に加工したり、半角括弧は変換するなりした方が良いですね。とりあえず、都道府県列で絞ってみました。

```py
df_data_1[['都道府県', '現在時刻(日)','現在時刻(時)', '現在時刻(分)', '現在値(mm)']].query("都道府県=='東京都'")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/9a75d27c-7c1c-c477-4e4e-2f3bdfe8ca18.png)

- Index（行番号）を指定して検索してみましょう

```py
df_data_1[['都道府県', '現在時刻(日)','現在時刻(時)', '現在時刻(分)', '現在値(mm)']].loc[100:110]
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/7955a019-2dac-922e-ed22-d0ec31831e16.png)

- 都道府県でgroup byして平均を求めてみます。group by した後にmean()で平均を求めています。ちなみにmaxを指定すると、最大値、minを指定すると最小値を求めることが出来ます。

```py
df_data_1[['都道府県', '現在値(mm)']].groupby(['都道府県']).mean()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/af8f33ac-1645-0516-4dfa-ee5ca4e7dd13.png)

- 要約統計量を取得（全カラム）

```py
df_data_1.describe()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/8bcb5b97-cd2f-da31-280a-5e70d545ef0e.png)

- 都道府県、現在値(mm) で要約統計量を取得してみます。

```py
df_data_1[['都道府県', '現在値(mm)']].describe()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/fae1aa6c-0610-00a5-7653-67296c15b645.png)


 - ユニークの値とその出現回数をカウントしてみます。
 
```py
df_data_1['都道府県'].value_counts()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/756159da-c5a6-a8e7-8175-ce4d48e3c767.png)


- 必要なカラムを絞って、'現在値(mm)'を降順でソートしてみましょう。sort_valuesでカラムを指定して、ascendingで昇順(True)、降順(False)を指定します。

```py
df_data_1[['都道府県', '現在時刻(日)','現在時刻(時)', '現在時刻(分)', '現在値(mm)']].sort_values("現在値(mm)",ascending=False)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/b3c5e51a-fd6f-16e9-2622-1edf04ea607c.png)

- データ操作が簡単に行えて、面白いですね。きりが無いので紹介はこの辺りまでとしますが、興味がありましたら、[この辺り](https://pandas.pydata.org/pandas-docs/stable/reference/frame.html)を読んで色々と試してみてください。
Kotlin の拡張関数を Mock する

`Kotlin` には `Java` には無い便利な機能として `拡張関数` があります。
ただ、困った事に `拡張関数はをモック化できるのか？` という問題にぶち当たりました。

まず、`Java` 製のモックライブラリでは当然の事ながらそんな事できないですし、有名どころの `mockito-kotlin` でも出来なかった（当時は、、、今どうなのかは調べてないです）ので、もうこれは無理かなと諦め書けていた所にさっそうと現れた救世主が [mockk](https://github.com/mockk/mockk) でした。

## Mock化サンプル

以前、ORMに Kotlin製 の `Exposed` というライブラリを使ったのですが、これで書かれたDB操作に `拡張関数` が使われていたのでこれを例にします。


まず拡張関数が書かれているファイルの `パッケージ` と `ファイル名` を確認します。
`Exposed` の拡張関数はこんな感じでした。

```Queries.kt
package org.jetbrains.exposed.sql

fun <T:Table> T.update(where: SqlExpressionBuilder.()->Op<Boolean>, limit: Int? = null, body: T.(UpdateStatement)->Unit): Int 

```

これに対して、モックを仕掛けるコードは、以下のようになります。

```hogetest.kt
func test() {
    // モックを仕掛けます
    mockkStatic("org.jetbrains.exposed.sql.QueriesKt")
    // 何をモックするかを書きます。
    every { HogeTable.update(any(), body = {}) } returns 1

    {対象のテスト}

    // モックを解除します。
    unmockkStatic("org.jetbrains.exposed.sql.QueriesKt")
}
```

こんな感じで、先に見た対象のパッケージとファイル名を文字列で指定してやることで、そのファイルに対してモックを仕掛けることができます。

```
mockkStatic("{package}.{file name}Kt")
```

なお、 `unmockkStatic ` をやらないと、モックが解除されないので、他のテストに影響がでますので気をつけてください。

## 最後に

この `mockk` ですが、拡張関数以外もちゃんとモック化できるので、 `Kotlin` でモックライブラリを捜している場合にはオススメです。
Javaで掲示板を作成してみる

【目的】
web開発の一連の流れがわかるようにするため掲示板を作成する

【仕様】
①名前と内容を入力して投稿すると履歴がたまっていく
②投稿日付順にソートすることができる
③投稿毎に削除ボタンを設け削除することができる
④投稿内容にパスワードを設け投稿者だけが削除出来る様にする
⑤ログイン機能を設け上記投稿者の判別を簡便にする
⑥スレッドを作ってみよう

【環境】
開発環境：docker
仮想マシン：centOS
言語：Java
フレームワーク：spring
データベース：mysql


※仕様はどんどん追加や変更していきます
これは何だ？誰でもプログラムが書けるやり方が発見される

#これは何だ？誰でもプログラムが書けるやり方が発見される

***眼鏡のフレーム端を耳の横に掛けたらなぜか書けるようになった。なんだこれは？***
このやり方をやれば誰でもプログラムが書けるようになると思います。頭も良くなった！と思う

***プログラムを挫折した経験がある方一度お試しあれ！***
![15.png](https://qiita-image-store.s3.amazonaws.com/0/386424/007718b5-7d14-84ca-4ca4-e20a87096477.png)
***このように耳の横にフレーム端を掛けてやる***

***自己責任で***
メガネのフレームを少し曲げる必要があります。破損しても自己責任で
個人差があると思います。人によってできない人もいると思います。
以上自己責任で試してみてください。

***用意するもの***
***必須***
***メガネ***　(耳の横にかけれるもの フレームの横幅が広いものがいいです)
***紫外線防止コーティング***　(眼鏡屋さんで３千円くらいでやってもらえます)

***お好み***
片方は非球体の方がいい　(目が疲れない)
黒縁じゃないほうがいい。（縁が太いと視野が狭くなる）

***やり方***
フレームの端を耳の横に掛ける
***目をつぶり、頭の周りに衛星が回転するイメージ***をする

メガネをかけていない時 20回ぐらいの回転が限度　疲れてしまう
メガネをかけている時　10回ぐらいの回転が限度 スムーズに回らない　うまく回らない
***メガネの端を耳の横にかけている時　スムーズに回る　無限に回ることを確認する***　

***メガネを耳の横にかけてイメージの衛星が無限に回ったら、プログラムが書けるようになっていると思います。***

個人差があるため、できない人もいるかもしれません。またある程度この掛け方で生活していく必要があります。普段からイメージトレーニングをやってください。
####読者からの質問
***Q　プログラムが分からないのですが、このやり方で分かるようになるのでしょうか？　***
A　個人差はあると思いますが、この眼鏡の掛け方するとなぜかプログラムが分かるようになります。お試しあれ！

***Q　プログラムに挫折した経験があるが、それでも大丈夫なのか？***
A　一度このやり方を体験をしてみて書いてみることをお勧めします。

***Q　プログラムは才能だと思っているのですが違うのですか？***
A　才能ではないと思います。このやり方をやればおそらく誰でもできると思います。

***Q　英語ができないのですが、プログラムはできるでしょうか？***
A　まずはコピペすることから始めてみましょう。このやり方をすればプログラムの理解は自然にできると思います。

***Q　プログラムが向いていないと思うのですが・・・***
A　このやり方をしてからはプログラムは嘘みたいにわかるようになりました。

***Q　プログラムを理解するのにどのくらいかかりましたか？***
A　このやり方をしたら大体一か月くらいでスラスラ書けるようになりました。プログラムの理解はすぐです。

***Q　文系ですができるようなりますか？***
A　私も文系ですが、このやり方をしたらできるようになりました。

***Q　プログラムが楽しくないです。どうすれば楽しくなりますか？***
A　試しにこのやり方をして、理解できるようになったら楽しくなりますよ

#####プログラムが書けるようになったかを確かめてみる。

メガネのこの掛け方をしてプログラムの学習サイトで授業を受けてみましょう
初心者はJavaScriptをお勧めします。

https://dotinstall.com/lessons

途中、掛け方を元に戻してみる。反応を比べてみる

プログラム書けるようになりましたか？理解できるようになりましたか？
プログラムが書けるようになっていた、理解できるようになっていたら、
あなたは今日からプログラマーです。

***おめでとう！***

***近眼じゃない人は？メガネがないとできないの？***

近眼じゃなくてもできると思います。近眼になる必要はないです。
今はメガネは必須だと思いますが、近い将来メガネがなくてもできる発明品が出てくるかもしれません。

眼鏡屋さんでメガネのフレームを買う。横幅の広いフレームを選ぶこと
最初についているプラスチックの度の入ってないレンズ
このレンズの上に紫外線防止コーティングを追加してもらう。
３千円くらいでやってもらえます。

これでできると思いますが。個人差もあるので自己責任で
眼鏡を買う前に、眼鏡屋さんで耳の横に掛けて衛星が無限に回るイメージになるか試してみましょう。***無限に回るイメージができたらプログラムは書けている***と思います。
まずは安いメガネで試すとよいでしょう。

***初心者はどのプログラム言語から始めたらいいのか？***

C# .NetCore WindowsFormをお勧めします。（画像参照)
GUIなのでわかりやすい。書籍もたくさん出ています。(Visual C# 2018逆引き大全 555の極意はお勧めです)

C#は動画学習サイトUdemyで学習できます
https://www.udemy.com/jp/

(iOSやアンドロイドをやりたい人はその言語を最初に初めてもいいと思います)

そのあと

ゲーム Unity C#
Web Asp.net MVC C#
機械学習 Tensorflow for C#
Iot Windows 10 IoT Core C#
iOS SwiftかObjective-C
Android KotlinかJava

をやるとよいでしょう
![csforms02.png](https://qiita-image-store.s3.amazonaws.com/0/386424/e433a57a-a936-af70-7557-1e164b8557db.png)

便利ツール

タスク管理ソフト
https://trello.com/ja

オンラインチャット Slack
https://slack.com/intl/ja/

Sketch
https://www.sketch.com

parallels deskTop
https://www.parallels.com/

####注意
使い始めたらお酒は控えること。能力が劣化するので
IBM PuredataでなんちゃってVARCHAR判定処理を行う

# 概要
ここではIBM Puredataのデータクレンジング手法について扱っています。
今回はNVARCHAR文字列からVARCHAR文字列に変換可能なレコードを見つけ出す方法です。

# 動作環境
`IBM Puredata 7.0.4`

# 背景
IBM PuredataはDWHのため、様々な形式のデータソースの受け皿に使われがちです。
今回は実際にあったデータクレンジング要件の中から比較的簡単に実現できる例を紹介します。

### ざっくり言いたいこと

NVARCHARカラムからVARCHARに置き換えられるレコードを見つける
それによって。。

1. 不要レコードが削減できる（テーブル容量の節約）
1. 型が小さくなることでクエリコストも削減できる

# 要件
あるNVARCHARで定義されたカラムがありました。
それには全角半角問わず、様々な文字列が入っていたのですが、それによって文字化けおよびバッチ処理等に不具合を起こしていました。
そこで、処理上必要なものはVARCHARで表現できる文字列（半角英数および記号）だけだったため、それらだけに絞るような処理を考えました。
ちなみにIBM Puredataはデフォルトのエンコード形式がUTF-8です。

また、IBM Puredataの場合NVARCHARですと1文字あたり4byte消費とコストが高く
それに対しVARCHARは1byte計算となるため、単純計算で同じ集計処理に4倍もの差が生まれることが予想されます。（細かい演算結果については触れません）
そのため、型変換を行うことで集計処理等のコストをグッと下げる効果もあります。（DWHとしてここ大事）

＊予想される入力値に対して最適な型を選定するのはどのDBも変わりませんが。。

# 解決方法について
3つ考えました。

1. 既存の関数でどうにかする
1. 正規表現を使用する
1. SQLで工夫する

### 1.既存の関数でどうにかする
IBM Puredataには文字列を評価する関数がありませんでした。。

### 2.正規表現を使用する
実はIBM Puredataには正規表現関数がいくつか用意されているのですが、なぜか
デフォルトではサポートされておらず、別途`SQL Extensions Kit`をDBにインストールする必要があります。
環境によっては導入できない場合もあるかと思うので今回は無視します。

### 3.SQLで工夫する
今回はSQLだけでゴリ押すことにしました。

以下のようなテーブルがあったとします。

```sql 
CREATE TABLE TABLE_A (
    TEXT NVARCHAR(100) NOT NULL
) DISTRIBUTE ON (TEXT)
;
```

例えばこんなデータがあったとして、2番目のデータを不要なものとして扱いたいとします。

|No|NVARCHAR値|VARCHARに値をそのまま入れた場合|評価|ポイント|
|:-:|:-:|:-:|:-:|:-:|
|1|example@sample.com|example@sample.com|OK|全て半角英数記号で構成されているためVARCHAR変換できる・変換すればバイト数も節約できるので一石二鳥|
|2|あいうえお@sample.com|?????@sample.com|NG|正しく変換できない、そもそもこんなデータは扱いたくない|

やり方は簡単です。
NVARCHAR版の文字列とVARCHAR版の文字列を用意し
WHERE句で比較結果がTRUEのものに絞るだけです。

```sql
SELECT
    VARCHAR_TEXT
FROM (
    SELECT 
        TEXT AS NVARCHAR_TEXT
        ,CAST(TEXT AS VARCHAR(100)) AS VARCHAR_TEXT
    FROM
        TABLE_A
    WHERE
        NVARCHAR_TEXT = VARCHAR_TEXT /* 無変換の文字列とCASTした文字列が一致 */
) AS GET_VARCHAR_TEXT
;
```

# 余談
CASTの方法はIBM Puredataの場合

```sql
CAST(COLUMN_A AS VARCHAR(100))
```

または

```sql
COLUMN_A::VARCHAR(100)
```
と2パターンできます。お好みでどうぞ。
プログラミング学習記録40〜Bootstrap4を導入するとCSSが反映されない問題〜

##今日やったこと
- Progate Railsのレッスンで作ったアプリにBootstrapを導入しようと試みる

いろいろなサイトを見て試したのですが、うまく導入できませんでした。

できるにはできてもCSSが反映されなくなります。

別の方法を探してみる必要があるそうです。

公式のread.me手順通りにやると、application.cssをscssに変えることになります。

scssがわかってないのもうまくいかない原因の１つかもしれません。

Bootstrapを使うとレスポンシブ化が簡単にできるので、なんとか導入したいです。

意外とこの問題に関する情報がないので、解決できたら解決方法をまとめて書きたいと思います。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
golang time / date まわりのメモ

自分用メモ

## iso-8601 形式の日時のパース

https://play.golang.org/p/ttaY9IRr0lI

```golang
t, err := time.Parse(time.RFC3339Nano, "2013-06-05T14:10:43+09:00")
fmt.Println(t)
// => 2013-06-05 14:10:43 +0900 +0900
```

## 指定した日時の1日、前月の1日

```golang
now := time.Now()

// 当月1日
a := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, now.Location())

// 前月1日
b := a.AddDate(0, -1, 0)

fmt.Println(a)
fmt.Println(b)
```
適性を確認するために

適正を見るためにやってもらっていること。

プログラミングをしたことがないという人に、最初にやってもらうことの一覧。

計算機を道具に仕事をしてもらう人で、適性を確認するためにしてもらうこと。

# webの構築
昨年から、docker上にWebを構築し、debianつながりで、Raspberry PIにも同じシステムが構築できるか試してもらい、dockerとraspberry PIの違いがあれば体感してもらう。

DBも一緒に導入しておいてもらうかどうかは、本人がどういうWEBを構築したいかによる。必須にはしない。

# C/C++コンパイラのコンパイル, 改良

GCCのクロスコンパイラか、LLVM/Clang++のソースコードをコンパイルしてもらうか、
より小さいコンパイラ本のソースをコンパイルしてもらう。

C/C++のソースの半分くらいは、Cコンパイラを書くのに必要な機能だったりする。
特定のCPUの機能をひきだすのに必要な仕様を理解するのに、C/C++コンパイルするのが一番。

# ゲームプログラムの入力
WEB、C/C++に興味のない人は、ゲームを勧める。

Python系、C#系, C/C++系のいずれかか、新しい言語かは本人まかせ。

#音楽系アプリの構築

python系, C/C++系、新しい言語かは本人まかせ。

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
ACMのSSL証明書期限が切れたので対応する

# 概要

* AWS Certificate Managerの期限が切れてサービスに影響がでた
* 自動更新のはずだったが
* 一度切れたSSL/TLS証明書を更新したい
* 更新ができなかった為新規作成で対応
* 自動更新の設定を入れる

# 詳細

* 以下のようなメールが届く
* すでに証明書が失効してしまったという内容
* 自動更新するにはDNS登録が必要とある
* ワイルドカードドメインには自動更新は対応してないらしい★
* 3日以内にメール再送信して認証しなければ証明書は失効して再作成が必要となるらしい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/b0df1b39-ba77-d4e5-afda-a24706b5c7b6.png)

* ACMの画面に遷移
* 本来であれば対象証明書を選択し、アクションから検証Eメールの再送信を押し、Eメールのリンクからの認証で済む
* しかし検証Eメールの再送信ができない

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/a64a164a-34fc-204d-fd8c-6ba266f0cbfa.png)

* ACMの仕様なのだろうが調査している余裕もなくサービス復旧のため新規作成したほうが早いと判断
* 対象ドメインを展開し、Route53でのレコード作成を選択
* 失効した古い方の証明書はすぐに消さなくても新しい証明書は作成可能


![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/bc72c0cb-4a77-6984-a854-09214a95fd8f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/d8263cac-c698-290c-0560-98e3cb7cb065.png)

* 検証保留中状態となる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/9280aad0-ef48-b52a-3980-654634277788.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/e4fde279-9bd1-a59d-ba31-f4467f449319.png)

* Route53のゾーン上には以下のように登録される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/e311e6e2-954a-8d75-d974-1a4cf049b1f7.png)

* しばらく経つと「検証保留中」から「発行済状態」となる
* 結構かかるので気長に待つ（10分以上かかった）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/8091b3fd-e187-8f0e-a5d9-8de3576f2a10.png)

* ELBにSSL証明書を追加する
* 同じドメインの証明書が2つある状態
* 古い方はあとで削除
* 削除する場合は



1. ロードバランサのリスナーからデフォルトの証明書を新しい方の証明書に変更
2. ACMで古い方の証明書を削除


* これでサービスへアクセス可能となる
* 以上、証明書更新について緊急対応完了
市場調査

年に１度は、いろいろな雑誌の１年分を読み、
取りこぼしがないかを確認する。

# 1.IoT
I/O 2018/8

1,1 無線
さ
W-Fi
LTE
bluetooth
5G
LPWA
 I/O 2018/7
 https://www.optex.co.jp/iot-sensor/dcc
http://www.optex.co.jp/iot/download/owu-101s_manual.pdf
https://www.youtube.com/user/Optexgroup/videos

1.2クラウドサービス
 I/O 2018/7
 ソフトウェアのインストールが不要、楽
　処理能力の拡充容易
　回線依存
　データ盗難リスク
https://mermadjs.github.io
http://cacoo.com

SaaS
PaaS
IaaS

1.3 OS
EEE 2050™-2018 specifies a real-time operating system (OS) for 16- and 32-bit microprocessors deployed throughout the IoT ecosystem
https://standards.ieee.org/standard/2050-2018.html

1.4 応用
CPS(cyber physical system), Industry 4.0, connected car

# 2.給電・充電
I/O 2018/4

2.1 無線給電

2.1.1 放射型

2.1.2 非放射型

磁力とコイル

電磁誘導方式
Qi(チー)

磁気共鳴方式
　周波数自動調整、最適化、
　性y後複雑、機器大型化

日本無線　https://goo.gl/GcxpCZ

2.2. 規格
qi 
AirFuel http://airfuel.or.org
Wattup http://energous.com
PoWi-Fi https://goo.gl/Zh8EEWj

Pi Charger https://www.picharging.com

# 3.CPU脆弱性
DOS/V Power Report 2018/5

Spectre
Meltdown

Windowsn 10 2018/1/4 patch

最新UEFI マザーボードメーカー

# 4. Mac mobile
Tunnelblick
https://tunnelblick.net

筑波大学　VVPNゲート

# 5. mesh Wi-Fi

Google Wifi

GP-link deco M5

ASUS Lyra Mini

日本で入手できるメッシュWi-Fiシステム12種+1の比較【2019年2月】
https://24wireless.info/mesh-wifi-compare

IEEE 802.11k/v
(無線情報の計測/AP切替)

IEEE 802.11r
(AP間の切替高速化)

IEEE 802.11s
(メッシュ標準規格)

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Expoでreact-native linkが認識されない

# 【原因】
React-Native　LinkはReact-Nativeのプロジェクトにしか使用できないからです。

# 【結論】
Expoのプロジェクトではこのコマンドは使えません。
Expoでreact-native linkが必要なモジュールは特別なことをしないと使えないようです。
<a href="https://docs.expo.io/versions/latest/introduction/faq/" target="_blank">参照</a>

detachingってやつとExpoKitなしでは使用できないらしいです。

#【私がハマった経緯】
　当たり前と言えば当たり前なんですが、気づかずに時間を無駄にしたので、私と同じくハマった人の参考になればと思い、記事にしました。
　最近、React-Nativeの勉強を始めて、Node.jsやらyarnやらインストールしてExpoで開発を始めたのですが、その際に「react-native-background-timer」というNative moduleを使おうとしました。プロジェクトに追加するときにインストールとreact-native linkのコマンドが必要だよと公式に書いてあったので、実行したんですけどうまく実行されない。
　私はそもそもreact-native linkってなんやって感じでした。
　調べてもこういう動作しているよって記事しかありません。英語の質問版に、ExpoではNative module使えないよみたいな投稿があって、
「あっ、react-native linkって、react-nativeのプロジェクトで使うコマンドなんだ」ってなりました。
つまり、Expo startとかと同系統ってことですね。
単位ベクトルを求める

単位ベクトル [ unit vector ] ･･･ 長さが1のベクトル

---
### 数学公式
- **ベクトルの大きさ（長さ）**
    - 平面上のベクトル(2D)
$$ \mid \vec{a} \mid = \sqrt{a_1^2 +a_2^2} $$
    - 空間のベクトル(3D)
$$ \mid \vec{a} \mid = \sqrt{a_1^2 +a_2^2 +a_3^2} $$
- **単位ベクトル**
$$ \vec{e} = \frac{1}{\mid \vec{a} \mid}\vec{a} =  \frac{\vec{a}}{\mid \vec{a} \mid}$$
$$ \vec{a} = (a_1, a_2, a_3) $$
の単位ベクトルは、
$$ \left( \frac{a_1}{\sqrt{a_1^2 +a_2^2 +a_3^2}}, \frac{a_2}{\sqrt{a_1^2 +a_2^2 +a_3^2}}, \frac{a_3}{\sqrt{a_1^2 +a_2^2 +a_3^2}} \right) $$

---
### AutoLISPで求める
```scheme
;; ベクトル -> 単位ベクトル
(defun vector:ToUnit (v)                 
    (   (lambda (n)
			(if (equal 0.0 n 1e-10)
				nil
			    (mapcar '/ v (list n n n))
		    )
	    )
        (distance '(0. 0. 0.) v)
    )
)
;; < Example >
(vector:ToUnit '(3 4))
;; -> (0.6 0.8)
(vector:ToUnit '(2 -1 3))
;; -> (0.534522 -0.267261 0.801784)
```

---
### AutoCAD .NET(C#)で求める
``` Vector2d, Vector3d ``` 構造体を使う。

```csharp
// < Example >
// 2D
var v2d = new Vector2d(3, 4);
new Vector2d(v2d.X / v2d.Length, v2d.Y / v2d.Length);
// -> (0.6,0.8)

// 3D
var v3d = new Vector3d(2, -1, 3);
new Vector3d(v3d.X / v3d.Length, v3d.Y / v3d.Length, v3d.Z / v3d.Length);
// -> (0.534522483824849,-0.267261241912424,0.801783725737273)
```

##### 拡張メソッドを定義
```csharp
using Autodesk.AutoCAD.Geometry;
// 2D
public static class Vector2dExtensions {
    public static Vector2d ToUnit(this Vector2d v) {
        return new Vector2d(v.X / v.Length, v.Y / v.Length);
    }
}
// 3D
public static class Vector3dExtensions {
    public static Vector3d ToUnit(this Vector3d v) {
        return new Vector3d(v.X / v.Length, v.Y / v.Length, v.Z / v.Length);
    }
}
```

---
### ObjectARX(C++)で求める
``` AcGeVector2d, AcGeVector3d ``` クラスを使う。

```cpp
// < Example >
// 2D
AcGeVector2d v2d(3, 4);
AcGeVector2d uv2d(v2d.x / v2d.length(), v2d.y / v2d.length());
// uv2d == (0.600000, 0.800000)

// 3D
AcGeVector3d v3d(2, -1, 3);
AcGeVector3d uv3d(v3d.x / v3d.length(), v3d.y / v3d.length(), v3d.z / v3d.length());
// uv3d == (0.534522, -0.267261, 0.801784)

```
ちいさな計算 python: docker(120)

python使って２進数計算などしてみた。

<この項は書きかけです。順次追記します。>


```
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import math
print("2^8=2*2*2*2*2*2*2*2")
print(2*2*2*2*2*2*2*2)
print("2^16=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2")
print(2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2)
print("2^32=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2")
print(2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2)
print("2^64=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2")
print(2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2)
print("MAC address:2^48=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2")
print(2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2)
print("private address class A = 254*254*254")
print(254*254*254)
print("private address class B = 16*254*254")
print(16*254*254)
print("private address class C = 16*254*254")
print(254*254)
print("Private address class A * B * C= 1254*254*254*16*254*254*254*254")
print(254*254*254*16*254*254*254*254)
```

実行する

```
# ./cal.py
2^8=2*2*2*2*2*2*2*2
256
2^16=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2
65536
2^32=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2
4294967296
2^64=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2
18446744073709551616
MAC address:2^48=2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2
281474976710656
private address class A = 254*254*254
16387064
private address class B = 16*254*254
1032256
private address class C = 16*254*254
64516
Private address class A * B * C= 1254*254*254*16*254*254*254*254
1091329761618950144
```
log計算してみる。


```
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import math
print("math.log10(1.64)")
print(math.log10(1.64))
print("10*math.log10(1.64)")
print(10* math.log10(1.64))
```

実行する

```
# ./log.py
math.log10(1.64)
0.21484384804769785
10*math.log10(1.64)
2.1484384804769787
```


```
docker run -it kaizen_japan/wireless /bin/bash
```

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
新人プログラマ用練習問題「i18nやk8sを作ってみよう」

## はじめに

* 新人プログラマ用の練習問題を思いついたので載せます
* 新人の方は是非解いてみてください
* ベテランの方は新人教育などに使ってください

## numeronym（ヌメロニム）とは

i18nやk8sのような数略語のこと
[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8C%E3%83%A1%E3%83%AD%E3%83%8B%E3%83%A0)
[numeronym (数略語)のまとめ -- I18n、L10n、M17n、etc.](https://qiita.com/himagurashi/items/48cfe8b990bc19cc3195)

## 問題

「internationalization」を渡したら「i18n」を返す
「kubernetes」を渡したら「k8s」を返す
ような`get_numeronym`関数を作成してください
言語は自由です
※なお、文字列以外が来るケースや1文字が来るケースなどは考慮しなくて良いものとする

## 回答例

```js:js版
function get_numeronym(word){
  return word[0]+(word.length-2)+word[word.length-1];
}
or
function get_numeronym(word){
  return word.slice(0,1)+(word.length-2)+word.slice(-1)
}
```

```ruby:ruby版
def get_numeronym word
  word.slice(0) + (word.size-2).to_s + word.slice(-1)
end
```

```php:php版
<?php
function get_numeronym(string $word){
    return substr($word, 0, 1) . (strlen($word)-2) . substr($word, -1);
}
```

```python:python版
def get_numeronym(word):
    return word[0] + str(len(word)-2) + word[-1]
```

## おわりに

基本的に文字列操作しかしないのでプログラム入門の問題としては非常に取り組みやすそうだなと思って紹介しました
是非色んな解き方を試してみてください:smile:
一からはじめるFactoryBot

# FactoryBotの導入

## 実装する
### FactoryBotのモデルを生成する

```text:Terminal
$ rails g factory_bot:model HogeTransaction
     create  test/factories/hoge_transactions.rb
```

フィールドを指定する場合

```text:Terminal
$ rails g factory_bot:model HogeTransaction transaction_id:long dpoint:integer finish_at:timestamp
     create  test/factories/hoge_transactions.rb
```

### トラブルシューティング

* Factory not registered: entry (ArgumentError)
  * [Factory not registered: entry (ArgumentError)](https://qiita.com/norobust/items/354a5d2b97f552b927de)

* [WARNING] Could not load generator "generators/factory_bot/model/model_generator". Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2).
  * DBに接続出来ない環境ではFactoryBotのgenerateが出来ない為、接続可能な状態とする


### FactoryBotのフィールドを定義する

```ruby:hoge_transactions.rb
FactoryBot.define do
  factory :hoge_transaction do
    hoge_id 0
    before_hoges []
    after_hoges []
    transaction_id 0
    dpoint 0
    hoges []
    finish_at { Time.current }
  end
end
```