OmniAICreator/Qiita-1.07M huggingface dataset:
メニューバーやアイコンが変更！？　Azureポータルプレビュー版公開！

![2019-10-11--menu-bar-and-icons-have-changed-in-azure-portal-000.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174954/02cea914-9e8a-3da5-a9ff-d0cb0a6e3f94.png)

# はじめに
Azureポータルのメニューバーやアイコンが変更されたプレビュー版が公開されました。
現在のデザインは[こちらのURL](https://portal.azure.com/#home)、プレビュー版は[こちらのURL](https://preview.portal.azure.com/#home)で見ることができます。
この記事では大きく変更された部分を紹介していきたいと思います。

# メニューバーの変更
今まで、最小化していても左側に見えていたメニューバーがハンバーガーメニューになりました。  
![2019-10-11--menu-bar-and-icons-have-changed-in-azure-portal-001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174954/d04c89d5-57e4-9af9-93d5-3fe16092f5cc.png)

これによって、ポータルでの作業スペースがより広くなります。  
一方で、最近話題の[こちらの記事](https://medium.com/google-design/the-obvious-ui-is-often-the-best-ui-7a25597d79fd)では「ナビゲーションメニューはハンバーガーメニューよりもボタンアイコンを明示しておくメニューの方がユーザの反応が良い」といったことが発表されていました。  
上の記事は主にスマートフォンアプリに関することであるため、一概に今回の変更の良し悪しを判断できる材料ではないのですが、今回の変更によってユーザの行動にどんな変化があるのか楽しみですね。  
# リソースウィンドウ展開の表示の変化
現在はリソースを開いていくと、左側にどんどん列が追加されていき、作業スペースが圧迫されることがままありました。
![2019-10-11--menu-bar-and-icons-have-changed-in-azure-portal-002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174954/a3f28b26-c702-fc01-1371-9fbcdc18c96e.png)
プレビュー版では左上に階層構造が表示されるだけなので、作業スペースが圧迫されません。  
上と下の画像で全く同じリソースを開いているのですが、作業スペースに差があることが分かります。
![2019-10-11--menu-bar-and-icons-have-changed-in-azure-portal-003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174954/3116e44a-8a31-18c5-74a3-be6ff7d84baa.png)

# アイコンの変更
アイコンが一部変更され始め、薄い水色のデザインがより濃い色になりました。  
![2019-10-11--menu-bar-and-icons-have-changed-in-azure-portal-004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174954/898b6750-851e-910a-f2bd-4e782fa5f04e.png)
# ホーム画面の変化
ホーム画面の一番上にAzureサービスのアイコン列があるのですが、このアイコン列に「リソースの作成」・「すべてのリソース」・「すべてのサービス」が追加されました。  
この追加はおそらく右のメニューバーがハンバーガーメニューに変更された影響だと思われます。
![2019-10-11--menu-bar-and-icons-have-changed-in-azure-portal-005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174954/7ef0848f-cd61-22f5-96e0-8e144991a31a.png)
# おわりに
ますます便利にアップデートされていくAzure PortalのGAが楽しみですね！
.NET Core2.2 で、IFormFileをモデルと一緒にリストにするとPostが終わらない

## 初めに
画像アップロードで、同じモデルの項目を一括で複数Postしようとした際に、Post処理が終わらないことがあったので原因を調査しました。


## 環境
- .NET Core2.2 ※ここ重要
- Visual Studio 2019

## 症状
submitでPostを実行すると、Postが完了せずに処理が終わらない。
![くるくる.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337557/ccad252f-3769-6bc5-5959-812b2cfeda48.png)
また、メモリ使用量がどんどん上がっていく。
![使用量.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337557/dc7b7217-3584-77ef-9b5a-3da8e437beb4.png)

## 原因
・モデルと一緒にIFormFileをリストにすると起きます。
（View内にIFormFile用のタグを記載しなくても、コードがそうなっているだけで症状が出ます。）

↓↓　.NET Core2.2のバグらしいです。（GitHubのissueに載ってました）
[IFormFile bind error when using in sub collection](https://github.com/aspnet/AspNetCore/issues/4802)



## 対応
・ .NET Coreのバージョンを 2.1.7に戻すか、3.0にあげる。
・ モデルと一緒にせずに、IFormFileだけでListにする（IFormFileCollection使ってもいい）

## 再現方法
1.　.NET Core2.2を使用する。
2.　適当にモデルを作成

```ruby:Movie.cs
    public class Movie
    {
        [Display(Name = "タイトル")]
        public string Title { get; set; }

        [Display(Name = "詳細")]
        public string Detail { get; set; }

        [Display(Name = "画像")]
        public string Img { get; set; }
    }
```

3.　上記のモデルと「IFormFile 」のプロパティを含むモデルを作成

```ruby:Movie.cs
    public class MovieWithPost
    {
        public Movie Movie{ get; set; }
     
        //　↓ファイル受信用のプロパティを追加
        public IFormFile FormFile { get; set; }
    }
```

4.　上記で作成したモデルをリストにする

```ruby:Movie.cs
    
    public class MoviesViewModel
    {
        public List<MovieWithPost> MovieList { get; set; }
    }
```

5.　viewでsubmitでpostを行う（コードは割愛）
6.　Postが完了しない

##### 日本語の記事がもっと増えてくれたらうれしいですね。
JavaScript（関数）

#関数
「いくつかの処理をまとめたもの」

##関数の定義
以下のように関数の用意をすることを「関数を定義する」と呼ぶ

```js
//関数の書き方
const 定数名 = function(){
	まとめたい処理
} 

//例
const introduce = function(){
	console.log(“こんにちは”);
	console.log(“私は山田太郎です”);
} ;
```

##関数の呼び出し
関数を定義しただけでは**処理は実行されない**

`「定数名()」`で関数の処理を実行できる

```js

//例
const introduce = function(){
	console.log(“こんにちは”);
	console.log(“私は山田太郎です”);
} ;
introduce();
```

##アロー関数
「function()」の部分を`「() =>」`と書く
この書き方のことを**アロー関数**と呼ぶ

```js

//例
const introduce = function(){
	console.log(“こんにちは”);
	console.log(“私は山田太郎です”);
} ;

↓↓↓

const introduce = ()=>{
	console.log(“こんにちは”);
	console.log(“私は山田太郎です”);
} ;
```

##引数
関数に与える**追加情報**のようなもの

```js

const 定数名 = (引数名)=>{
	・
}

//例
const introduce  = (name)=>{
	・
}
```

##引数（追加情報）を受け取る、関数（処理）の呼び出し
`「定数名(値)」`
と書いて呼び出す
関数は指定した値を受け取り、その値は引数に代入される
><img width="2065" alt="スクリーンショット 2019-10-11 16.57.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/284c3b5d-0f03-2d72-7a42-67abb31c89c4.png">
><img width="2064" alt="スクリーンショット 2019-10-11 16.59.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/4983542f-1cf0-3c6c-64e7-0cae56b228e9.png">
（後から情報を設定できるってこと！）


##複数の引数を、受け取る
（追加情報が増える）

```js
const 定数名 = (第1引数 , 第2引数 , ・・・) => {
	処理
}
定数名(値);

//例
const introduce = (name, age) => {
	console.log(`私は${name}です。`)
	console.log(`私は${age}歳です。`)
}
introduce(“山田太郎” , 22);

//コンソール
私は山田太郎です。
私は22際です。
```

###戻り値
呼び出し元で受けとる処理結果を戻り値と呼ぶ
関数が戻り値を返すと言う

呼び出し元
「定数名(2 ,5);」
引数
「const add = (number1,number2) =>」
戻り値
「7」


##戻り値のある関数
関数の中で **return** を使うと、呼び出し元で値を受け取れるようになる
`「return 値」`と書くことで、関数はその値を戻り値として返す
関数の呼び出し部分を定数に代入することができる
><img width="2065" alt="スクリーンショット 2019-10-11 17.23.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/8dc1563d-f2ba-9905-c7ed-5a3852bff294.png">

:point_up:returnは関数の処理を終了させる性質を持っている
returnをした後に処理を入れても実行されないので注意！

```js

//例
const add = (a,b) => {
	return a + b ;
	console.log(“計算しました”);
} 
add(1,3);
//コンソール
4

//下線部分は表示されない！
```

##スコープ
関数の引数や変数は、その関数内でしか使うことができない
それぞれの定数や変数の使用できる範囲のことを **スコープ** と呼ぶ

```js

//関数内で定数を定義した場合

const introduce = () => {
	const name = “山田太郎”;
	・
	・
	//定数name使える（スコープ)
}
//定数nameが使えない

//関数外で定数を定義した場合
const name = “山田太郎”;
const introduce = () => {
	・
	・
	//定数name使える（スコープ)
}
//定数name使える（スコープ)
```
Railsチュートリアル 第８章＜復習＞

第８章の復習メモです。
個人的に重要と思ったことを書きます。

前回と同様、以下３つの視点で書きます。

- 分かったこと
- 分からなかったこと
- 今回はスルーしたこと


#分かったこと

##セッションについて
今回は、ログイン、ログアウトの機能を実装した。

- ユーザがログインし、ログアウトするまでの間、接続情報（ユーザID等）を保持する必要がある。
- 接続情報は、ブラウザとサーバ間に**セッション**を確立することで保持される。
- 情報が保持される場所は、**ブラウザ上**（HTTPプロトコルは状態を保持できないため、この方法を使う）。
- 保持する形式は、**cookies**を用いる。これは、小さなテキストデータ形式である。
- 本章では、**一時cookie**を使う。この場合、ブラウザを閉じたら接続が破棄される。永続クッキーは９章で扱う。
- **一時cookies**に保存された情報は、**sessionメソッド**を用いて、Railsアプリケーションから参照できる（今回は、ログイン中のユーザIDを保存した）。

##ルーティングの確認
`rails routes`コマンドで、ルーティングの一覧が表示される。

```
$ rails routes
   Prefix Verb   URI Pattern               Controller#Action
     root GET    /                         static_pages#home
     help GET    /help(.:format)           static_pages#help
    about GET    /about(.:format)          static_pages#about
  contact GET    /contact(.:format)        static_pages#contact
   signup GET    /signup(.:format)         users#new
    login GET    /login(.:format)          sessions#new
          POST   /login(.:format)          sessions#create
   logout DELETE /logout(.:format)         sessions#destroy
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
```

##flash.now
７章で学習したflash変数は、次のリクエストが終了するまでの間、表示される変数である。
しかし、今回は**renderメソッド**を用いたので、flashが必要以上に残ってしまった（renderはリクエストが発生しない）。
この場合、**flash.now**を使うと解決する。flash.nowは、現在のリクエストが終了するまでの間、表示される。

```
flash.now[:danger] = 'Invalid email/password combination'  # ← ここで使用
render 'new'
```

以下を参考にさせていただきました。
https://qiita.com/shi-ma-da/items/ea433c337d2a691ff1bc
https://kossy-web-engineer.hatenablog.com/entry/2018/10/05/063957

##sessionメソッドの使い方
###session情報の追加

```app/helpers/sessions_helper.rb
module SessionsHelper

  # 渡されたユーザーでログインする
  def log_in(user)
    session[:user_id] = user.id  # ← session情報にユーザIDを追加
  end
end
```

###session情報の削除
deleteメソッドを使う。

```
session.delete(:user_id)
```


#分からなかったこと、今回はスルーしたこと

- テスト全般
- アプリケーションの仕様の詳細
propsで受け取った値を、チェックしてdataに格納する。


#受け取ったpropsの値をチェックしてからdataに格納したい。

親から子に値を渡す時は、子はpropsで受け取れます。
受け取った値を子コンポーネント側でチェックするにはどうしたらいいの？
...迷ったので忘備録です。

###子コンポーネント
```vue
    props: {
      'oyaValue': {
        'type': [Array, Boolean, String],
        'default': false
      }
    },

    data: function(){
      const me = this;
      let checkVal = false;
      if(me.oyaValue) {
        checkVal = true;
      }
      return {
        'val': checkVal,
      };
    },
```

propsで受け取ったデータ（今回はoyaValue）を
チェックをしてdata内に入れる際は、
一旦ifでバリデーションをかけてから格納する。

今回は'oyaValue'から'val'にしてdata内に入れた。

ちなみにpropsの値を直接ゴニョゴニョ変更しようとすると怒られます。
※そうりゃそうやな、そもそもいじったらあかん。

簡単な記事だけど、とりあえず忘備録。
Javascriptで既存のオブジェクトにプロパティを足したオブジェクトを作る

以前は

``` javascript
const newObject = Object.assign({newProp:'hoge'},oldObject);
```
とObject.assignを使って書いていたのですが、

``` javascript

const newObject2 = {newProp:'hoge',...oldObject};
````

とした方がスマートな気がしてこちらを最近は使っています。
スプレッド構文を使うと、

``` javascript

const newObject3 = {...oldObject,newProp:'hoge'};
````
とすることで、newPropがすでにoldObjectにあっても、oldObjectを汚さずに上書きできるのも良い感じです。
(Object.assignは第一引数のObjectを書き換えてしまう)
VuexでIndexedDBのコネクション管理


HTML5の勉強してたら出てきた"Indexed DataBase API"を使ってみたかったんです


```store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    db: null, 
  },

  mutations: {
    DB_CONNECTION: (state, payload) => (state.db = payload),
  },

  actions: {
   createDatabase({ commit }) {

      // ブラウザにより異なるらしい
      const indexedDB = window.indexedDB || window.mozIndexedDB || window.msIndexedDB

      if (indexedDB) {
        var dbOpen = indexedDB.open(`${YOUR_DATABASE_NAME}`, 1.0) // 第2引数はversion

        // データベースがない場合、既存のversionよりも大きい引数でopenした場合
        dbOpen.onupgradeneeded = function(event) {
          const dbConnection = event.target.result
          // スキーマを作成する
          const store = dbConnection.createObjectStore(`${YOUR_STORE_NAME}`, { // store = テーブルのようなもの
            keyPath: `id`,         // 主キー用
            autoIncrement: true    // オートインクリメントを有効にしておかないとレコード挿入時に指定必須
          })
          store.createIndex('contentIndex', `${YOUR_INDEX}`) // index = カラムのようなもの
          commit('DB_CONNECTION', dbConnection)
        }

        // 接続成功の場合
        dbOpen.onsuccess = function(event) {
          commit('DB_CONNECTION', event.target.result)
        }
      } else {
        // IndexedDB使用不可
      }
    },
  },
})
```

あとはVueのインスタンス作成した時にdispatchで呼んで、以後はstateのdbを参照すればOK
dbpediaの研究 その18

#概要

dbpediaが難解なので、手出してみる。
sparqlをやってみた。

#ja.dbpediaで、わかった事。

以下は、デフォで定義されている。

```
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia-ja: <http://ja.dbpedia.org/resource/>
PREFIX prop-ja: <http://ja.dbpedia.org/property/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
```

以上。
[正規表現Tips] Pythonで文字列内のドットをカンマに置換する(末尾2つが数字なら置換しない)

正規表現って普段書かなくなると、すぐ忘れちゃいますよね:sweat:？ 
めちゃめちゃTipsですが、備忘録も兼ねて投稿します。

## やりたいこと

- 掲題の通りですが、金額等の文字列の修正を想定しています。
- 例： 金額欄に`1,000.000`と入力されたときに、`1,000,000`に修正したい。
    - ただし、`1,000.000.00`と入力されたときは`1,000,000.00`にしたい。
- 「そんなケースに遭遇する？」と思われるかもしれませんが、例えばOCRシステム等ではあり得るかと思います。（私の場合、まさにこれ）

## コード

```python
import re

target_text = '1,000.000.00'
replace_rule = re.compile('\.(?!\d{2}$)')

text = replace_rule.sub(',', target_text)
```

これでいけました。
なお、このままだと例えば `1,000.0`は`1,000,0`となってしまうので、ちゃんと3つ区切りのドットだけを置換したい場合は（そもそもそんなケースが有るかは不明ですが）

```python
import re

target_text = '1.000.00.00'
replace_rule = re.compile('\.(\d{3})')

text = replace_rule.sub(r',\1', target_text)
```

でいけました。

以上です。この記事が世界の誰かの役に立てば幸いです:innocent:
オセロをＶＢＡで作成　＃１盤面作成

# オセロをＶＢＡで作成　＃１ゲームスタートボタンと盤面作成
VBAの課題としてオセロ作成を始めたのでまだ序盤の段階ですが投稿してみました。
まずスタートボタンを配置してスタートボタンを押したらセル方眼紙を作ってオセロの盤面と初期配置の石を入力する所まで作ってみました。

![2019-10-11 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/8dc6eb58-f199-3deb-5dd4-7ff404ac3585.png)
![2019-10-11 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/6209dab1-fe8b-830f-acf0-1deb55f834c6.png)

    Dim px As Integer
Integer型のpxを宣言する。数値しか入れられない。

    Cells.ColumnWidth = px * 0.118
    Cells.RowHeight = px * 0.75
Cells.ColumnWidthは全体の列のサイズ変更、Cells.RowHeightは全体の行のサイズ変更
0.118と0.75はピクセル単位で指定した数値を入れた変数pxの値と掛けてピクセル数値を
ポイント単位に変換する為の値。

    Range("C3:J10").Borders.LineStyle = xlContinuous
C3からJ10までの範囲のセルに罫線を引く。

    Range("C3:J10").Borders.LineStyle = xlContinuous
    Range("C3:J10").Interior.ColorIndex = 4
C3からJ10の範囲のセルに罫線を引いて色番号４で塗りつぶす。

    Range("C3:J10").HorizontalAlignment = xlCenter
    Range("C3:J10").VerticalAlignment = xlCenter
C3からJ10の範囲に水平方向・垂直方向に中央揃え。

    Range("F6,G7") = "◯"
    Range("F7,G6") = "●"
オセロ初期配置の◯と●を入力。

# 次の課題
次は黒の番ですと表示するのと仮のパスボタンを配置してセルクリックで石を置く所まで行こうかと思います。
余裕があれば石をひっくり返す処理まで行けたら理想です。
中間テーブルが更新されない

解決方法
##optional: trueをつける！
参考：　http://soccer1356abc.hatenablog.com/entry/2018/09/22/210221

```user.rb
  has_many :talent_users
  has_many :talents, through: :talent_users
```

```talent.rb

  has_many :talent_users
  has_many :users, dependent: :destroy, through: :talent_users
```

```talent_users.rb
  belongs_to :user
  belongs_to :talent
  belongs_to :shop, optional: true
```


user登録時にtalentも紐づけてcreateしたかった
この時shopは関係ないから`optional: true`をつける

ネストさせる

```route.rb

    resources :users do
      resource :talent_users, only: [:create]
    end
```

パラメーターに登録したいタレントのidが入るようにしておけばOK!

```users_controller.rb

  def user_params
    params.require(:user).permit(
      :email, :password, :tel ,:sex,
      :first_name, :last_name, :first_name_kana, :last_name_kana, { :talent_ids=> [] })
  end
```
最低限の労力でLaravelのタスクスケジュール ( Task Scheduling ) + AWS ECS

# 最低限の労力でLaravelのタスクスケジュール ( Task Scheduling ) + AWS ECS

※ ある程度LaravelのCommandやECSを利用している人向けの記事です
※ イメージには`php:7.3-fpm-alpine`ベースで、他にミドルウェアを色々入れたものを利用
※ Laravelは6.0を利用

EC2 + cron + Laravelで動いていた定期処理実行サーバを、ECSに移すことになりました。
以前から、WebはECS + Laravel (+ Nginx)で動かしてました
まあ、インフラ管理方法が２種類あるのは負担でしかないですよね。。。

それで、方法を考えると、ECSの"タスクのスケジューリング"だろうとは思ったのですが

- たくさんECSのスケジュールタスクを作るのは面倒...
- CloudFormationを書くには、このプロジェクトは遅すぎた。cloudformationの運用も面倒...

そんなわけで、Laravelのタスクスケジュールと、ECSの”タスクのスケジューリング”を組み合わせてみました。
両方似たような名前で頭がオカシクなりそうです。

## 注意事項

これから紹介する方法は、以下を許容できる処理に限定した方が良いと思います

- スケジュールが多少いい加減で良い
    - イメージの内容によるが、コンテナ(タスク)が立ち上がるまでに数十秒かかる
- 時間に対応したスケジュールが一個ずつ実行されるため、全ての処理が完了するまでに時間がかかる
    - ちなみに`runInBackground()`を利用したら処理完了前にコンテナが終了すると思います(戒め)
- 時間がかかる処理では、同じコマンドが並列実行されるリスクがある
    - つまり、コンテナが多重起動している状態もあるということ
    - 多重でScheduleを実行させないための実装がLaravelにあり
        - `onOneServer()`, `withoutOverlapping()`
        - `onOneServer()`の方が良さそう(小並感)
    - コンテナ(ECSタスク)の多重起動をECS側で禁止する方法もあるが、大事なタイミングでコマンドが実行されない危険性があるので、おすすめしない



重要な処理は、個別にECSタスク定義とECSスケジュールタスクを作った方が良いかと思います。
(同じタスク定義を利用しても設定でCMDを上書きできます。しかし、タスクの設定でタスク定義のリビジョンを上げるたびに再度指定することになります。おすすめしません。)

## 全体像

### Laravelのタスクスケジュールで、定期実行の設定を記述

以下を参考に、淡々と記述すればOK。
https://readouble.com/laravel/6.0/ja/scheduling.html

EC2なんかでcronですでに設定されていれば、`cron()`使えば楽にスケジュールを指定可能。

### ECSのスケジュールタスクを設定
- ECSでLaravelが動くDockerイメージが作成できていれば、それを利用してバッチ処理用のタスク定義を作成
    - タスク定義では、コンテナ設定でCMDを `php artisan schedule:run` に変更
        - すでにLaravelがPHP-FPMとかで動くイメージを利用する場合、起動時の動作(CMD)を上書きできる状態に変更
            - ENTRYPOINTが指定されていた場合、ENTRYPOINTは実行時に上書きできないし、CMDはENTRYPOINTの引数扱いとなり、実行時の挙動を上書きできない
            - ベースがphp-fpmのイメージなら、DockerfileでENTRYPOINTを `[]` に上書き(無効化)して、CMDを["docker-entry-point","php-fpm"]とかに変えればいいと思います


### ECSで"タスクのスケジューリング"を設定

上記のタスクを毎分起動するように設定。


## (おまけ) エラー通知
例外発生時には、通知はもちろんスタックトレースとかも確認できるようにしたい。
LaravelのScheduleには、before, after, onFailuereといったフックがあるんですが、出力を参照できないっぽいから、こいつらは大した事はできないです。これはすごい悩んだ。

いやまあ、杞憂でしたけどorz。

エラー時には、普通にHandlerに引っかかります。
つまり、`app/Exceptions/Handler.php`内の処理。
既にSlack通知なりが設定されてれば、ECSスケジュールタスクでの例外発生時にも、同様にSlack通知されます。
定期処理だけ特別な処理をしたいなら、タスク定義に定期処理フラグ的な環境変数でも適当に設定して、その環境変数の値をもってHandlerの処理を分岐させれば良いと思われます。
[Mac] Catalinaへのアップデート後 bits/stdc++.h が使えなくなった

# 競プロしてて bits/stdc++.h を使うとコンパイル時に「ファイルがないですよー」って怒られたので
```bash
brew uninstall gcc
brew install gcc
```
# したら治ったよ

```bash

brew install gcc
```
がなかなか終わらないときは
```
xcode-select --install
```
でCLTのインストールを確認してね♡

## 考察
途中でcatalina.patchを適用していたので多分Catalinaが悪いです（適当）
[初学者]rootメソッド

#目的
学習の備忘録と初学者の参考資料として投稿

#ルートの設定
ルートへアクセスした場合に特定のアクションを実行させたい時に設定。

#設定方法

```ruby:config/routes.rb

 root to: コントローラー名＃アクション名

ブラウザで

　http://localhost:3000/と記入

```

結果、設定したアクションのviewが表示されます。


#まとめ
最初に表示したいトップページがあるならば、ルート設定すればいい。


今後も学習で気づきや参考になるものがあれば、アップしていきます。
もし参考になったらいいね！！よろしくお願いします:bow_tone1:
msvc で 32bit を超える enum 型が定義できない（バグ?）

# MSVC のバグ?

MSVC で定義できる enum 型 T は `sizeof(T) == 4` までのようです。（Visual Studio 2019 16.3.1 で確認）

```cpp
#include <iostream>
#include <limits>

enum T {
	A = std::numeric_limits<unsigned long long>::max(),
};

int main(int argc, char** argv) {
	std::cout << "A: " << A << '\n';
	std::cout << "sizeof(T): "  << sizeof(T) << '\n';
}
```

```console:実行結果
A: -1
sizeof(T): 4
```

もちろん、g++ と clang は期待通りの結果 `sizeof(T) == 8` になります。
【Laravel】テスト内にメールとSMSのテストを両立させたい

# 問題定義
「メール通知のテストをしたい」「SMS通知(自作Notifier)のテストをしたい」といったとき、
[モック](https://readouble.com/laravel/5.4/ja/mocking.html)を使用すると安全に実行ができ、実行結果の取得も容易にすることができます。

```php
\Illuminate\Support\Facades\Mail::fake();
\Illuminate\Support\Facades\Notification::fake();
```

ところが、下記のように両方を使用してしまうと、
想定したようにはテストが動きません。

```php:Customer.php
class Customer {
    use \Illuminate\Notifications\Notifiable；

    public function notify()
    {
        $this->notify(new MyNotifyInstance($this->notifier));
    }
}
```

```php:CustomerTest.php
class CustomerTest extends TestCase
{
    protected function setUp()
    {
        parent::setUp();
        Mail::fake();
        Notification::fake();
    }

    public function testMailNotification()
    {
        $customer = factory(Customer::class)->create([
            'notifier' => 'mail'
        ]);

        $customer->notify();

        Mail::assertSent(MyCustomerMail::class, 1);  //-> エラー。0件となる
    }

    public function testSMSNotification()
    {
        $customer = factory(Customer::class)->create([
            'notifier' => 'sms'
        ]);

        $customer->notify();

        Notification::assertSentTo(  //->OK
            [$customerForSMS ], MySMSNotification::class
        );
    }
}
```

# 解決策

```php:CustomerTest.php
class CustomerTest extends TestCase
{
    protected function setUp()
    {
        parent::setUp();
    }

    public function testMailNotification()
    {
        Mail::fake();  //個別に設定するよう変更

        $customer = factory(Customer::class)->create([
            'notifier' => 'mail'
        ]);
        $customer->notify();
        Mail::assertSent(MyCustomerMail::class, 1);
    }

    public function testSMSNotification()
    {
        Notification::fake();  //個別に設定するよう変更

        $customer = factory(Customer::class)->create([
            'notifier' => 'sms'
        ]);
        $customer->notify();
        Notification::assertSentTo(
            [$customer], MySMSNotification::class
        );
    }
}
```

## 原因

Notification::fake()　が　Mail::fake()　を上から潰しているようです。

メール送信処理が発火されず、実行件数が0件となるため、
Mail::fake()を使用する際にはNotification::fake()が実行されないようにします。
今日学んだ基本情報の勉強内容(7)

#基本ソフトウェア
ここは少し量が多いので図や説明はわからなそうなものだけ書く。
##基本ソフトウェアとは
基本ソフトウェアは以下のように分けることができる

 - 制御プログラム　・・・　ハードウェアを管理してワープロなどの応用ソフトウェアからコンピュータが効率的に利用できるように働くソフトウェア。このプログラムのことを<font color="Red">カーネル</font>と呼ぶ。カーネルにはメモリ管理やプロセス管理など機能を制限した<font color="Red">マイクロカーネル</font>と多機能の<font color="Red">モノリシックカーネル</font>がある

 - 言語処理プログラム　・・・　プログラミング言語を機械語に翻訳する
 - サービスプログラム　・・・　ファイル圧縮プログラムなど、コンピュータの機能を補うプログラム

##ジョブ管理
利用者がコンピュータに一連の命令を出すときに、そのまとまりを<font color="Red">ジョブ</font>という。
カーネルはこのジョブを管理する。ジョブを<font color="Red">マスタスケジューラ</font>と呼ばれるプログラムに渡すことによって管理され、<font color="Red">ジョブスケジューラ</font>によって以下のように実行される。

①リーダ　→　②イニシエータ　→　実行　→　③ターミネータ　→　④ライタ

①　リーダ : 複数のジョブが実行されている場合、ジョブを待ち行列に並べる
②　イニシエータ : 優先順位が高いジョブをもってきて<font color="Red">ジョブステップ</font>という単位に分解する。
③　ターミネータ : 実行されたジョブに割り当てられたハードウェア資源を解放し、結果を待ち行列に加える。
④　ライタ : 優先順位が高いものから出力する。



##タスク管理
ジョブ管理においてジョブステップに分解された後に実行されるが、これら<font color="Red">タスク</font>または<font color="Red">プロセス</font>と呼ばれ、タスク管理によって実行される。

このタスクを実行するにはタスクにCPUの使用権を与えなければならず、それを与えるのが<font color="Red">ディスパッチャ</font>というプログラム。


##実記憶管理
プログラムを主記憶にロードするときに、主記憶の空間内にプログラムを収めなければならない。その方法の一つとして<font color="Red">オーバーレイ</font>方式がある。
これは5MBのプログラムを主記憶にロードしたいが、主記憶に3MBの空きしかないときにプログラムを<font color="Red">セグメント</font>という単位に分割して、必要な時に必要なセグメントだけをロードする方法である。
以下の例だと実行するときはセグメント1、セグメント2、セグメント3というかたまりか、セグメント1、セグメント4というかたまりでロードされる。


![1570782356326.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/e2b3f3e9-95b1-9284-44eb-aee11242ccdd.jpeg)




##参考文献
- [キタミ式イラストIT塾　基本情報技術者　平成28年度]
Web Components 入門

## 背景
マークアップを行う際に、決まった要素のまとまりを使い回したいと思った時に、JSのフレームワークのReactやVue.jsを利用するとコンポーネントとして再利用可能な部品を作る事ができるのですが、学習コストがかかってしまったり、案件のサイズによって採用することができないが、再利用可能な部品を作成したい場合に、WebComponentsを利用するとライブラリやフレームワークに依存せず作ることができることを知ったので試してみました。


## Web Componentsとは
ライブラリを利用せず、HTML/CSS/JavaScriptだけで再利用可能なカプセル化されたHTMLタグを作成できる仕組みで、主に3つの要素(**Custom element**,**Shadow Dom**,**HTML templates**） で構成されいます。
※ **HTML Imports** も仕様として策定されているようなのですが、まだドラフト版のようなので、一旦入れていないです。
https://w3c.github.io/webcomponents/spec/imports/

## 構成要素
構成要素を一つ一つみていきます。

### Custom element
独自の要素を生成する事ができる機能。
今まで独自のデザインを定義して再利用する場合は、classを作りその有無で設定していましたが、スタイルを含んだ独自要素を再利用可能になります。
作り方は、 HTMLElementを継承したクラスを作成して、customElements.defineのAPIを利用して以下のように定義します。


```js

class MyBoldParagraph extends HTMLElement {
    constructor() {
      super();
      this.innerHTML = `
        <style>
          p {
            font-weight :bold;
          }
        </style>
        <p>${this.innerHTML}</p>
      `;
    }
  }
// 定義される独自タグの名前は**ハイフン**をつける必要が有ります。
customElements.define("bold-p",MyBoldParagraph); 
```
また、HTMLElementにはライフサイクルがあり、documentに追加されたタイミングでコールバック関数を発火させることなどが可能です。
詳しくは[こちら](https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_custom_elements#Using_the_lifecycle_callbacks)


### Shadow Dom
コンポーネント内で独自にスコープを持つことができる機能。
スタイルを定義した時は、基本的に名前空間を持つことができないので、複数のcssファイルを読み込んだ際に、セレクタが重複した場合上書きが行われて、影響範囲を把握しにくく管理しにくい状態でしたが、 Shadow Domを利用すれば、コンポーネント内に影響範囲を抑えることができます。
先ほどの、Custom elementの例では、 **p**タグに再度スタイルを追加すると上書きされてしまうのですが、Shadow Domを利用する事で上書きされない状態を作ることができます。

使い方は、attachShadow APIを利用して以下のように定義します。

```js
class MyBoldParagraph extends HTMLElement {
    constructor() {
      super();
      this.attachShadow({ mode: "open" });
      this.shadowRoot.innerHTML = `
        <style>
          p {
            font-weight :bold;
          }
        </style>
        <p>${this.innerHTML}</p>
      `;
    }
  }
  
customElements.define("bold-p",MyBoldParagraph);
```

### HTML templates
再利用したいテンプレートをdocument上に配置し、使いまわすことができる機能。
templeteタグを利用して、document上に配置された要素は、Domにレンダリングされないが、javascriptから参照は可能になります。
利用方法は、templeteタグを以下のように定義します。

```html
<template id="my-paragraph"> 
  <p>My paragraph</p>
</template>

```
その後、以下のコードのようにJavaScript を用いて参照を取り DOM に追加するとページ上に表示できます。


```js
let template = document.getElementById('my-paragraph');
let templateContent = template.content;
document.body.appendChild(templateContent);

```
Custom elementを利用する際に、HTMLタグやスタイルをjavascript側に記述する必要があるのですが、それをtempleteタグを利用することで、HTML側に記述して責務を分ける事が可能になると思うのですが、まだあまり有効な使い方が思いついていないです、、、

### 参考サイト

https://developer.mozilla.org/ja/docs/Web/Web_Components



## まとめ
WebComponentsの利用方法について学んでみて、今まで悩まされてきた名前空間の問題を解決するような方法が、ライブラリなしで実装可能になっていることがわかり素直に感動しました。
また、実際まだ公式にサポートされていないブラウザはあるものの、社内で使うようなブラウザ環境がある程度限定できる場合は、利用していく事でよりマークアップ側もより整理された状態にしていく事が可能になると感じたので、今後の動向も注目していきたいです。
RubymineのdebuggerがRubygems 3.0以上で使えない問題

## 問題
- Rubymineでdebuggerを使おうとしたところ、関連gemのインストールを求められる
- インストールしようとしたところ、失敗する

### エラーログ

```
Error running 'Api::V1::AccountsController... (1)'
Failed to Install Gems. Following gems were not installed:
/Applications/RubyMine.app/Contents/rb/gems/debase-0.3.0.beta8.gem:  While executing gem ... (OptionParser::InvalidOption)
invalid option: --no-rdoc
/Applications/RubyMine.app/Contents/rb/gems/ruby-debug-ide-0.8.0.beta8.gem:  While executing gem ... (OptionParser::InvalidOption)
invalid option: --no-rdoc
```

### 原因
- Rubymineがdeprecateなオプション`--no-rdoc`を渡している

## 対応
- `-​-no-document`を渡すようにする
- だけど、関連gemのRubymine指定バージョンはホスティングされていないので、いつもどおり叩いてもダメ

```shell
$ gem install --no-document ruby-debug-ide -v 0.8.0.beta8
#=> ERROR:  Could not find a valid gem 'ruby-debug-ide' (= 0.8.0.beta8) in any repository
#=> ERROR:  Possible alternatives: ruby-debug-ide
```

- エラーログを見ると、ローカルにgemの指定バージョンを持っているので、それをインストールする
- gemのpathはエラーログからコピペする

```shell
$ gem install --no-document /Applications/RubyMine.app/Contents/rb/gems/ruby-debug-ide-0.8.0.beta8.gem
$ gem install --no-document /Applications/RubyMine.app/Contents/rb/gems/debase-0.3.0.beta8.gem
```

- これでdebugger使えるようになる

## 参考
- [Installing ruby-debug-ide gem fails when using Rubygems 3.0+](https://youtrack.jetbrains.com/issue/RUBY-23357)
【PDFminer】LTCharを理解する（+LTRect）


PDFminerを使うと色々な情報が抜き出せますが、それぞれがどこにあたる情報なのかいまいちよくわからない。
ということで、PDFminerで読める情報はなんなのか解読を試みようということです。

2019/10/11 
とりあえずわかっているところしか書いてません、、、詳しい方いたら教えて下さい！！
2019/10/25
~~別のPDFを読んでみたら前半の座標部分の計測基準が変わってしまいびっくりしています…
もしかすると決まった規則はないのかもしれません。あくまで一例としてご覧ください。~~
2020/03/26
久々に読み直してみたら読み込み結果として誤っている部分があることが判明しました。
②の指している箇所に変更があります。こちらでほぼあっていると思います。大変失礼しました…

##LTCharの出力
今回扱うのは1文字だけしか書いてないシンプルなPDF

<img width="687" alt="スクリーンショット 2019-10-11 16.56.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280605/57767e2b-0829-e2ca-e2ea-c17846ddb92c.png">

このPDFからLTCharを抜き出してきた結果がこちら


```

[<LTChar 117.921,110.896,182.079,223.044 matrix=[64.16,0.00,0.00,64.16, (117.92,132.65)] font='FQUXDR+KozGoPr6N-Regular' adv=1.0 text='ゼ'>] 

```
##分解してみた

LTChar
①117.921,②110.896,③182.079,④223.044
matrix=[⑤64.16,0.00,0.00,⑥64.16, (117.92,132.65)] 
font='FQUXDR+KozGoPr6N-Regular' adv=1.0 text='ゼ'>


画像はPDFをMacのビューアーで選択した状態。単位はppx（ピクセル）。
この状態での各ポイントへのX座標とY座標の様子。


<img width="498" alt="スクリーンショット 2020-03-26 16.18.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280605/ddba5aa7-811b-95ba-67da-c0f94e6bd2f8.png">


後半は、文字そのもののフォントサイズ

![ltcharpdf3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280605/52850671-5252-cd6c-cadc-89c6321205be.png)


5と6の間の数値は、斜体にすると3つ目の数値が変わるので傾きとかなのかもしれないです。

その他、フォントの前の文字列などは不明…
またわかったら追記します。


##おまけ：LTRect

<img width="542" alt="スクリーンショット 2020-03-26 16.30.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280605/09485d4e-00d1-c169-9c3d-b9e2fa962aaf.png">

Rectの場合は文字の時とは違って選択した状態で〜ではなく、素直にそのままの数値…
Rectに限らず、イラレでのPDF作成時点で裁ち落とし（周りの赤い線）が設定されている場合は、裁ち落としを含めた距離になる様子
nginxのconfで複数の条件を判定してリダイレクト

こんにちはガッシーです。
唐突に本題へ入るのが好きじゃないですが入り方に困っています。


前提としてnginxで下記のような運用でメンテナンスを行っているとします。
[Nginxでメンテナンスページに編集なしで即時切り替える方法](https://qiita.com/kotaroito/items/8b7d4b8ad6935edcdba8)

この例だと、**特定のファイルがある場合にメンテナンスをする**という条件になっています。

```
server {
  set $maintenance false;

  if (-e /var/tmp/nginx/maintenance) {
    set $maintenance true;
  }
}
```

自分が扱っているシステムの方もこのようになっているのですが、
さらに**ガラケーのアクセスの場合はリダイレクトしてほしい**という依頼がきたので対応しようとしたのですが、ここで初めて気づきました。
**nginxではif elseが書けないしifの入れ子も書けないということに。**

そこで調べていたところ [Nginxで複数条件のIF文を書く方法がすごいｗ](https://qiita.com/ukitazume/items/ab1c929783e87227e466) という記事を発見。
簡単に書いてみるとこんな感じ。

```
set $result N
if ($hoge = A) {
  set $result Y;
}
if ($fuga = B) {
  set $result "${result}Y";
}
if ($result = YY) {
  $hogeがAかつ$fugaがBのときの処理
}
```

こういう発想がすぐできるようになりたいです。
で、ちなみにガラケーの判定は下記のような感じでします。

```
#device 0 PC 1 スマホ 2 ガラ携帯
set $device 0;
if ($http_user_agent ~* "(iPhone|Android)") {
  set $device 1;
}
if ($http_user_agent ~* "(DoCoMo|UP\.Browser|SoftBank|Vodafone|J-PHONE|emobile|WILLCOM)") {
  set $device 2;
}
```

##そして全てを組み合わせる

```
server {
  set $maintenance false;
  set $maintenance_redirect N;
  if (-e /var/tmp/nginx/maintenance) {
    set $maintenance true;
    set $maintenance_redirect Y;
  }

  #device 0 PC 1 スマホ 2 ガラ携帯
  set $device 0;
  if ($http_user_agent ~* "(iPhone|Android)") {
    set $device 1;
  }
  if ($http_user_agent ~* "(DoCoMo|UP\.Browser|SoftBank|Vodafone|J-PHONE|emobile|WILLCOM)") {
    set $device 2;
    set $maintenance_redirect "${maintenance_redirect}Y";
  }

  if ($maintenance_redirect = YY) {
    rewrite ^(.*)$ http://hogehoge.com$1 permanent;
  }
  if ($maintenance = true) {
    error_page 503 /error/50x.html;
    return 503;
  }
}
```

ちょっと汚い＆省略していますがこんな感じですかね。
普段rubyしか書かないのでnginxとかシェルとかになるとつまづきます。

#参考
[Nginxでメンテナンスページに編集なしで即時切り替える方法](https://qiita.com/kotaroito/items/8b7d4b8ad6935edcdba8)
[Nginxで複数条件のIF文を書く方法がすごいｗ](https://qiita.com/ukitazume/items/ab1c929783e87227e466)
[初学者]ルーティングについて

#目的
学習の備忘録と初学者の参考資料として投稿

#ルーティング
ルーティングは、ブラウザから届いたリクエスト（HTTPメソッド＋URL）に対して、コントローラーで定義したアクションを結びつけるルールです。
<img width="1680" alt="884f611b6e8d4a5af88d3211daa4bc1b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499332/e8e7d297-25bd-cdd9-7ad2-e30abf36ad13.png">

上記は参考例です。

#ルーティングの確認

```
ターミナルで

$ rails routes

あるいは...ブラウザで

http://localhost:3000/rails/info/routes　と入力

```

どちらでも確認出来ます。

#HTTPメソッド
HTTPメソッドとは、「クライアントがサーバーにしてほしいことを依頼するための手段」のこと。
主に使うのは『GET』『POST』『PUT』『DELETE』の４つぐらいです。
それぞれの働きは

『GET』　　・・・データを取得するときに利用する。

『POST』　 ・・・サーバーにデータを送信する時に利用する。アカウント作成や投稿するなど新規作成で使われる。

『PUT』　　・・・サーバーにデータを送信する時に利用する。既存データの更新などで使われる。

『DELETE』・・・既存データを削除するときに利用する。

任意のアクションを呼び出したい時は

　http://(ホスト名)/コントロール名/アクション名 

で呼び出すことが可能です。

#まとめ
今回は簡単なさわりだけを書いています。今後さらに深掘りして書いていきます。






今後も学習で気づきや参考になるものがあれば、アップしていきます。
もし参考になったらいいね！！よろしくお願いします:bow_tone1:
Rails で CSRF トークンの検証を制御する

本記事は、以下ブログに投稿した記事のクロス投稿となります。
https://lanchester-tech-blog.hatenablog.com/entry/2019/10/15/135357

---

# 特定のコントローラで検証を無効化する
`skip_forgery_protection` を使います。
これは `skip_before_action :verify_authenticity_token` のラッパーなので `only: :create` 等のオプションを指定できます。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  skip_forgery_protection
end
```

大本のコントローラで指定して継承先のコントローラで重複して使用はできないので、その場合は `protect_from_forgery with: :exception` 等を明示的に指定します。

```ruby:app/controllers/article_controller.rb
class ArticleController < ApplicationController
  protect_from_forgery with: :exception, only: :create

  def create
    # ...
  end
end
```


# 検証を完全に無効化する
検証そのものを行わないようにします。

```ruby:config/application.rb
config.action_controller.allow_forgery_protection = false
```

# 警告だけを消す
検証は行って `WARN` のログは出さないようにします。

```ruby:config/application.rb
config.action_controller.log_warning_on_csrf_failure = false
```

# Rails 5.2 や 6 以降で `null_session`
rails 5.2 以降はデフォルトで `protect_from_forgery with: :exception` となるような変更（[https://github.com/rails/rails/commit/ec4a836919c021c0a5cf9ebeebb4db5e02104a55](https://github.com/rails/rails/commit/ec4a836919c021c0a5cf9ebeebb4db5e02104a55)）が入り、`ApplicationController` からは `protect_from_forgery` の記述が消されました。

`ApplicationController` に `protect_from_forgery null: :session` としても反映されないので以前のように `with: :null_session` を使いたい場合は以下のようにします。

```ruby:config/application.rb
config.action_controller.default_protect_from_forgery = false
```

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  # protect_from_forgery に with オプションを渡さない場合は with: :null_session と同等
  protect_from_forgery
end
```
VSCode で快適Jupyter Notebooksコーディング　前編

# はじめに
この記事は2019/10/8に発表された[Announcing Support for Native Editing of Jupyter Notebooks in VS Code](https://devblogs.microsoft.com/python/announcing-support-for-native-editing-of-jupyter-notebooks-in-vs-code/)の要約記事＆弄ってみたレポートをしたいと思います。  
今回は発表の要約のみ先に掲載させていただきます。


# [Announcing Support for Native Editing of Jupyter Notebooks in VS Code](https://devblogs.microsoft.com/python/announcing-support-for-native-editing-of-jupyter-notebooks-in-vs-code/)で発表された内容の要約
VScodeで.ipynbファイルを直接編集＆Jupyter Notebooksのインタラクティブな出力をそのまま見ることができるようになりました。
以下ではVSCodeが提供するJupyter Notebooksの新しい機能について紹介します。

## 導入方法
VScodeでJupyterを使い始める方法は以下の通りです。

- 既存のJupyter Notebooksがない場合：ショートカットCtrl+Shift+P(macの場合はCommand+Shift+P)でVSCodeコマンドパレットを開き、「Python: Create Blank New Jupyter Notebook」を選択します
- 既存のJupyter Notebooksがある場合：VSCodeでそのファイルを開くと、自動的にネイティブJupyterエディタが起動します

Jupyter Notebooksが開いたら、新しいセルの追加・セルへのコードの書き込み・セルの実行・その他のノートブックアクションを実行などができます。

追加された機能の一覧は以下の通りです。
- オートコンプリート：[Visual Studio IntelliCode](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode) をインストールすることでオートコンプリートが利用できます
- 変数エクスプローラー："Variables"ボタンをクリックするだけで、Jupyter Notebooksの変数の現在の状態をリアルタイムに視覚的に捉えることができます
- リモートJupyterサーバーへの接続：Jupyter Notebooksを開くと、デフォルトでローカルにJupyterサーバーが自動的に作成されますが、VSCodeコマンドパレットでJupyterサーバーURIを指定すると、リモートJupyterサーバーに接続できます
- Pythonコードとしてのエクスポート：“Convert and Save as Python File”ボタン一つでPythonコードとしてエクスポートすることができます
- Jupyter Notebooksのデバッグ：上の「Pythonコードとしてのエクスポート」機能を使用して、Jupyter Notebooksのデバッグをさぽーtpしています。Pythonインタラクティブウィンドウにコードを配置したら、VSCodeの統合デバッガーでコードをデバッグすることができます。今後、Jupyterエディターにセルデバッグできる機能が追加される予定です。

現在利用できる機能については[こちらのドキュメント](https://code.visualstudio.com/docs/python/jupyter-support)をご覧ください。
また、意見やバグを発見した場合は[GitHub](https://github.com/microsoft/vscode-python/issues)で報告してください。


# おわりに
今回は2019/10/8に発表された[Announcing Support for Native Editing of Jupyter Notebooks in VS Code](https://devblogs.microsoft.com/python/announcing-support-for-native-editing-of-jupyter-notebooks-in-vs-code/)の要約をさせていただきました。
これで、ますますVSCodeでのJupyter Notebooksコーディングが捗りそうですね！
実際に弄ってみたレポートは[こちら](https://qiita.com/ss_33_sss/items/7c628f66b69a42ec56ca)です。
ESLint 7.0.0 の開発が始まる

現在、実施される Breaking Changes について議論中です。Node.js 8.x が EOL になる頃にアルファ版が出始めると予想しています。

実施される可能性が高い Breaking Changes をちょっとだけ覗いてみましょう。

- **[RFC20](https://github.com/eslint/rfcs/pull/20)『設定ファイルによる追加の対象ファイル』** ディレクトリを指定してリントした場合、現在は`*.js`ファイルだけが対象になります。7.0.0 からは、`overrides`セクションのファイル指定にマッチするファイルも自動的に対象になります。TypeScript や Vue.js など、`.js` 以外のファイルを利用している場合に便利になります。
- **[RFC32](https://github.com/eslint/rfcs/pull/32)『個人設定ファイルを非推奨にする』** ESLint は、CWD 配下に ESLint の設定ファイルが存在しなかった場合、自動的にホームディレクトリの設定ファイルを探して利用します。 7.0.0 ではこの動作が非推奨になります。8.0.0 で削除されると思います。
- **[RFC33](https://github.com/eslint/rfcs/pull/33)『ディレクティブ コメントのコメント』** `/* eslint-disable no-undef -- typeofで調べたから */` のように、各ディレクティブ コメントに説明を付与できるようになります。反面、`--` が設定の中にあるとうまく動かなくなるかもしれません。
- **[RFC34](https://github.com/eslint/rfcs/pull/34)『単一行ディレクティブ コメント』** `/* eslint-disable */` のようなブロックコメントのみサポートしているディレクティブ コメントが、`// eslint-disable` のように行コメントでも利用可能になります。ディレクティブ コメントと同じ単語で始まる行コメントが誤動作するかもしれません。
- **[RFC37](https://github.com/eslint/rfcs/pull/37)『`overrides`/`ignorePatterns`の基準パスを変更』** `--config`/`--ignore-path` オプションで指定した設定ファイルの `overrides`/`ignorePatterns` プロパティの基準パスが CWD に変更されます。検証スクリプト自体をパッケージ化して再利用している場合などは、新しい振る舞いで便利になります。
- **[RFC39](https://github.com/eslint/rfcs/pull/39)『プラグインの読込元を変更』** ESLint 5.x までは ESLint がインストールされている場所を基準にプラグインを読み込んでいました。6.x では CWD を基準にプラグインを読み込んでいます。7.0.0 からはリント対象ファイルに最も近い設定ファイルを基準にプラグインを読み込むようになります。モノリポのように、node_modules が複数存在するようなリポジトリを利用している場合に便利になります。
- **[RFC40](https://github.com/eslint/rfcs/pull/40)『非同期 API に移行する』** ESLint を Node.js から利用する場合は `CLIEngine` 等のクラスを利用します。これらがすべて同期 API を使っているため、できないことがたくさんありました。例えば進捗表示、並列化、そして ES Modules の利用等です。7.0.0 では新たに非同期 API を提供し、今の同期 API は非推奨になります。
- **[RFC42](https://github.com/eslint/rfcs/pull/42)『並列化』** リント対象のファイル数に応じて、ファイルが多ければスレッドを作って並列処理するようになります。スレッドを使えない古い Node.js で実行されている場合は、代わりに子プロセスで並列化します。PoC では、20 秒程度かかっていた ESLint 自身のソースコードのリントが、7.5 秒程度で終わるようになりました。
- **[RFC44](https://github.com/eslint/rfcs/pull/44)『Node.js 8.x/11.x のサポート終了』** タイトル通り。新しいサポート範囲は `^10.12.0 || >=12.0.0` になりそう？

---

※ これらが本当に実施される保証はありません。
phalcon voltにオリジナルやphpのFuctionを追加する方法

# phalconのVoltを拡張

https://phalcon-docs-ja.readthedocs.io/ja/stable/reference/volt.html#id26

ここにあるのですが、
ズバリな回答じゃないので。。

config/services.php

```php:config/service.php
$compiler->addFunction(
    "widget",
    function ($resolvedArgs, $exprArgs) {
        return "MyLibrary\\Widgets::get(" . $resolvedArgs . ")";
    }
);
```

こんな記述があるんですが、
たぶん、Viewの拡張をするところで、voltの動作を定義しているところがあります。そこに追加する感じになると思います。

**:helmet_with_cross:注意点は、実行したいFunction名を文字列で返すというところ。ここ大事**

```php
$di->setShared('view', function() {
}
```

##シンプルにphpのdate_format関数を追加する場合

```php
$volt->getCompiler()->addFunction('date_format', 'date_format');
```


##以下、なんかちょっと処理を入れる場合、postされたデータをbase64_decodeを追加する方法


```php
$volt->getCompiler()->addFunction('base64_decode', function($args) {
          $str = str_replace(' ', '+', $args);
          return "base64_decode({$str})";
});
```

## 引数がたくさんある場合

```php
$volt->getCompiler()->addFunction('mb_strimwidth', function($args) {
          return "mb_strimwidth({$args})";
});
```

ここがちょっとおもしろいところで、addFunction のところの第２引数にfunction($args)としてますが、ここは複数引数指定されたらそれらの文字列が渡ってくるのです。

使うときはこんな感じだけど

```volt:
{{ mb_strimwidth(str,0,10,"...") }}
```

上記でいう
$args
には、

```
str,0,10,"..."
```

という文字列が入ってくるので、そのままセットすればよいです。
リリースされるプルリクエストは何だろう？ リリース一覧を自動生成するシェルスクリプト

リリースの記録を取りたいのですが、いちいちGithubに行って、今回リリースされるのは何かな？ と調べるのが面倒だったのでコマンドを作りました。
もっと良い方法がある気がするので、「うちではこうしているよ！」とか、コメントもらえると嬉しいです。

shell変数の`before_release_date`に前回のリリースをした時間を入れて以下のコマンドを実行すると、前回リリースからの差分のプルリクエスト一覧が取れます。
ブランチ名は各自の環境によって master だったり develop だったりすると思うので適時読み替えてください。

```shell

$ before_release_date=2019/10/1:14:00; 

$ git checkout develop
$ git pull upstream develop
$ git log --merges --since=${before_release_date} --first-parent --reverse --pretty=format:"* %b %s"
```

実行サンプルは以下の通り

```shell
$ git log --merges --since=2019/10/10 --first-parent --reverse --pretty=format:"* %b %s"
* プルリク１ Merge pull request #2355 from yamotuki/fix_hogehoge
* プルリク２ Merge pull request #2367 from yamotuki/fix_fugafuga
```


## 補足
git checkout じゃなくて git switch を使えや！ と怒る方もいるかもしれませんが、古い環境を使っている方もいるかと思って checkout にしてあります。適時読み替えてください。

## おまけ

リリース記録のために markdown 記法で残しておくために以下のようなシェル芸を使ってリスト作ってます。
いい感じにURLを自分たちのものを入れて使ってみてください。

```shell

$ git log --merges --since=${before_release_date} --first-parent --reverse --pretty=format:"* %b %s" | perl -ple 's/Merge.*#(\d*).*$/(https:\/\/github.com\/hogepiyo\/pull\/$1)/' | perl -ple 's/\*\s(.*)\(h/\* [$1]\(h/'
* [プルリク１ ](https://github.com/hogepiyo/pull/2311)
* [プルリク２ ](https://github.com/hogepiyo/pull/2296)
```
FBX SDK Pythonが対応しているファイル形式一覧

# FBX SDK Python 2019 が対応しているファイル形式一覧

公式サイトを見ると、C++版のFBX SDKは大量のファイルフォーマットをサポートしているようなのですが、どうやらPython版はすべて対応しているわけではないみたいでしたので、対応しているフォーマットを調査してみました。



# 書き込み可能なファイル形式一覧

以下が一覧です。`Index` と `Description`は、あくまで私の環境（後述）での値です。他の環境では異なる可能性がありますのでご注意ください。

|Index|Description|
| :-- | :-- |
| 0|FBX binary (*.fbx)         |
| 1|FBX ascii (*.fbx)          |
| 2|FBX encrypted (*.fbx)      |
| 3|FBX 6.0 binary (*.fbx)     |
| 4|FBX 6.0 ascii (*.fbx)      |
| 5|FBX 6.0 encrypted (*.fbx)  |
| 6|AutoCAD DXF (*.dxf)        |
| 7|Alias OBJ (*.obj)          |
| 8|Collada DAE (*.dae)        |
| 9|Biovision BVH (*.bvh)      |
|10|Motion Analysis HTR (*.htr)|
|11|Motion Analysis TRC (*.trc)|
|12|Acclaim ASF (*.asf)        |
|13|Acclaim AMC (*.amc)        |
|14|Vicon C3D (*.c3d)          |
|15|Adaptive Optics AOA (*.aoa)|
|16|Superfluo MCD (*.mcd)      |



# 読み込み可能なファイル形式一覧

以下が一覧です。`Index` と `Description`は、あくまで私の環境（後述）での値です。他の環境では異なる可能性がありますのでご注意ください。

|Index|Description|
| :-- | :-- |
| 0|FBX (*.fbx)                |
| 1|AutoCAD DXF (*.dxf)        |
| 2|Alias OBJ (*.obj)          |
| 3|3D Studio 3DS (*.3ds)      |
| 4|Collada DAE (*.dae)        |
| 5|Alembic ABC (*.abc)        |
| 6|Biovision BVH (*.bvh)      |
| 7|Motion Analysis HTR (*.htr)|
| 8|Motion Analysis TRC (*.trc)|
| 9|Acclaim ASF (*.asf)        |
|10|Acclaim AMC (*.amc)        |
|11|Vicon C3D (*.c3d)          |
|12|Adaptive Optics AOA (*.aoa)|
|13|Superfluo MCD (*.mcd)      |
|14|(*.zip)                    |



# 調査方法

`Index` と `Description` は以下のコードで確認しました。

```python
# 書き込み可能な形式一覧を出力
for formatIndex in range(manager.GetIOPluginRegistry().GetWriterFormatCount()):
    description = manager.GetIOPluginRegistry().GetWriterFormatDescription(formatIndex)
    print(formatIndex, description)

# 読み込み可能な形式一覧を出力
for formatIndex in range(manager.GetIOPluginRegistry().GetReaderFormatCount()):
    description = manager.GetIOPluginRegistry().GetReaderFormatDescription(formatIndex)
    print(formatIndex, description)
```

`manager` には `FbxManager.Create()` で生成したインスタンスを入力してください。

サンプルプロジェクトはこちらに置きます。
[GitHub/segurvita/fbx_sdk_python_sample/convert_fbx/list_format.py](https://github.com/segurvita/fbx_sdk_python_sample/blob/master/convert_fbx/list_format.py)


以下の２つの環境で試し、同じ値が出力さえることを確認しました。



### Windows環境

- Windows 10 64bit
- Python 2.7
- FBX SDK Python 2019.5

### Linux環境

- Alpine Linux v3.9
- Python 2.7
- FBX SDK Python 2019.2


# さいごに

読み込みと書き込みでIndexが変わるのがちょっとややこしいですね。。。

以下のサイトを参考にさせていただきました。ありがとうございます。

- [Autodesk FBX 2017 HELP / FbxIOPluginRegistry Class Reference](https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_i_o_plugin_registry_html)
手動で issue をクローズするとか面倒ですよね。GitHubのプルリクに close: #1234 って書いて勝手にクローズさせましょう

GitHub の Issue の管理めんどくさいですよね。
Issueベースでプルリクを作って、プルリクをマージして、Issueを手動で閉じて。

簡単な方法でIssueを勝手に閉じてくれるやり方があったので共有します。

![貼り付けた画像_2019_10_11_16_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/b2eea5dd-da88-5ba2-8cdc-226b34865739.png)

`close: #1234` のようにイシュー番号を書いておくと、プルリクをマージしたタイミングで勝手にIssueを閉じてくれます。

`#1234` のところは自分で書いても良いですし、IssueのページのURLをコピーして貼ってもOKです。

## 補足

`close` 以外の文言でもOKで、その単語一覧や詳細説明は以下のリンクを確認してください。

参考: https://help.github.com/ja/articles/closing-issues-using-keywords
Splunkに対してForwarderからのデータが届かない時のトラブルシューティングTIPS

はじめに
---
- ForwarderからSplunkへデータを飛ばす際に、ハマることはままあります。
- そんなときに私がよく確認する項目をまとめましたのでご参考ください
- ForwarderとSplunk間のNW疎通要件は[こちら](https://answers.splunk.com/answers/350229/what-ports-will-a-cluster-master-function-on-when.html)を参考に。


##Check0: 経路間の疎通確認
- 通信経路途中の9997番ポート宛の通信はblockされていないか？
- UFがインストールされたOSのFirewallポリシーで9997番ポート宛の通信はblockされていないか？

**YES**⇢　OK、通行許可を与えてあげてください。
**NO**⇢　次にいきましょう。

##Check1： Forwarderのsplunkdプロセスを再起動して、改善されるか確認
- Deployment ServerからAppが配布された後、あるいは手動でUF内のconfを編集した後、splunkdのサービス再起動が必要です。
- 念の為、splunkdサービス再起動しておきましょう。

```
/opt/splunkforwarder/bin/splunk restart
```

##Check2：SplunkサーバにForwarderから何かしらデータが届いていないか確認

- Splunk管理コンソールにてデータの取得状況をチェックする方法です。

####1. 監視対象データ（ログ）が届いているか？
取込対象のデータがindexのどこかに取り込まれていないか？

```
index=* host=（サーバ名）
```


**確認ポイント：**意図したindexではないがデータは届いてるか？
**Yes** ⇢　UF側のinputs.confの設定を見直し、意図したindexに保存するよう設定し直しましょう。
       
```:(例)dhcpログをwin_dhcpに取り込みたい場合
[monitor://C:\Windows\System32\dhcp]
sourcetype = DhcpSrvLog
index = win_dhcp
```

**No** ⇢　次に紹介するinternal logをチェックしましょう。

####2. UF自身が吐き出すinternal logが届いているか？
そもそもUFがちゃんとSplunkと疎通できていれば内部ログが届いています。

```
index=_internal host=(サーバ名) 
```
**YES** ⇢　このようにmetricsデータとかsplunkdログなどが届きます。
<img width="1200" alt="スクリーンショット 2019-10-11 14.45.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/5c7d5508-9709-faed-8d6d-3bad7ee8be4a.png">
    
**NO** ⇢　何も届いていない。次のチェックにいきます。

##Check3：UF内のsplunkdログをチェックして、ERRORまたはWARNメッセージが発生していないか確認

手っ取り早く調査に必要なデータを集める場合は、少なくとも以下の結果を集めると効率が良いです。

####①diagファイル
splunkdログを初めてとして、UF内のappもすべて内包されているので重要な情報源です。
取得手順は[こちら](https://answers.splunk.com/answers/371072/splunk%E3%81%AEdiag%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E4%B8%8B%E3%81%95%E3%81%84.html)です。集めたdiagを解凍して、splunkdファイルをtailやテキストエディタでチェックします。

**確認ポイント**
・**ERROR or WARNの内容をチェック**
以下によく見かけるメッセージを列挙しました。

[TcpOutputProc - Cooked connection to Forwarder IP:9997 timed out](
https://answers.splunk.com/answers/680604/tcpoutputproc-cooked-connection-to-forwarder-ip999.html)

[ThruputProcessor - Current data throughput (256 kb/s) has reached maxKBps. As a result, data forwarding may be throttled. Consider increasing the value of maxKBps in limits.conf.](
https://answers.splunk.com/answers/716291/universal-forwarder%E3%81%8B%E5%85%A8%E3%81%A6%E3%81%AEwindows-security-event-log%E3%82%92.html)



####②confの設定内容を確認するコマンドの結果
conf設定の不足がないか最低限以下の3つで確認しますが、まずは少なくとも**outputs.conf**だけでも集めます。

```
/opt/splunkforwarder/splunk btool outputs list --debug > outputs_debug.txt
/opt/splunkforwarder/splunk btool inputs list --debug > inputs_debug.txt
/opt/splunkforwarder/splunk btool props list --debug > props_debug.txt
```


**確認ポイント**
**・UFのデータ送付先が意図したsplunkサーバが設定されているか**
**・競合する設定がないか？**
**・typoしていないか？**

```:outputs.conf
（中略）
/opt/SplunkForwarder/etc/system/local/outputs.conf   [tcpout:default-autolb-group]
/opt/SplunkForwarder/etc/system/local/outputs.conf   server = 13.57.xxx.xxx:9997
```
Windows Update後にコマンドラインからpythonを実行するとストアアプリが立ち上がるのを解決する方法

#問題
大型のWindows Update後，コマンドラインで`python`を実行すると，すでにpython環境が構築されている場合でも対話型インタプリタではなく，MS Storeのpythonのページが開くようになった.
[詳しい記事][1]
[1]:https://forest.watch.impress.co.jp/docs/serial/yajiuma/1188376.html
#解決方法
アプリ実行エイリアスの欄のpythonをはずしてやればよい．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204520/23fc2b94-a2d5-67f4-ddd3-5e7030cd8505.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204520/416199f1-6c25-e125-604d-467e36ffb5b1.png)
Mastodon用irbコードメモ

自分用メモです。

`tootctl`を介さずにいろいろします。

**危険です。**

カッコ内は動作を確認したバージョンです。

# irbの起動のしかた

```bash
$ su - mastodon
$ cd ~/live
$ RAILS_ENV=production bundle exec rails console
irb(main):001:0>
```



# domain系

## 認知しているサーバに接続できるか調べる [v3.0.0]

サーバにHEADを投げてみて、何らかの異常があれば表示する

```ruby
Account.select(:domain).where.not(domain: nil).where(suspended_at: nil).distinct.order(:domain).each do |record|
    code = 0
    begin
        code = Request.new(:head, 'https://' + record.domain).perform(&:code)
    rescue => e
	    printf("%s\n", e)
    end; 0
    unless[0, 200].include?(code)
        printf("Server Returns HTTP %s on %s\n", code, record.domain)
    end; 0
end; 0
```

|エラー|説明|
|------|------|
|Connect timed out after 5 seconds| 一定時間内に接続が確立しなかった |
|failed to connect: Connection refused| サーバへの接続が拒否された |
|failed to connect: No address| ドメインに対するA/AAAAレコードがない |
|failed to connect: No route to host| 宛先ホストへの送信経路が存在しない。あるいはファイアウォールで弾かれた |
|Server Returns HTTP XXX| 200以外のHTTPステータスコードが返された |
|Mastodon::HostValidationError|サーバがプライベートIPアドレスを使っている。[このへん参照](https://github.com/tootsuite/mastodon/blob/master/app/lib/request.rb#L254)|
|Read timed out after 10 seconds| 一定時間内に応答が返ってこなかった |
|certificate verify failed (self signed certificate)| 自己署名証明書が使われている |
|certificate verify failed (unable to get local issuer certificate)| クライアント証明書のCA情報がサーバ側で確認できなかった |
|certificate verify failed (unspecified certificate verification error)| 証明書の検証時にエラーが発生した |
|state=SSLv3/TLS write client hello: tlsv1 alert internal error| 問い合わせ側の証明書に問題がある？ |
|SYSCALL returned=5 errno=0 state=SSLv3/TLS write client hello| 問い合わせ側のRubyに問題がある？ |

HTTP 4xxが返ってくるやつ、Aレコードが無いやつは閉じた可能性が高いと思われる

[Wikipedia - List of HTTP status codes](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes)




# あとがき

* 使用は自己責任でお願いします。何か不具合が起こっても責任取れません。
* こうしたほうがいいよ的なアドバイス、誤記や記載漏れ、動作の違い等の指摘を頂けると大変助かります。
* 連絡先： [Mastodon1](https://nagoyadon.jp/@kumasun), [Mastodon2](https://md.objektiv2.net/@kumasun)




以上