OmniAICreator/Qiita-1.07M huggingface dataset:
body+で計った体重をWithings APIで取得する

Withings body+ を買ったので、APIで体重を取得してみる

APIドキュメント
http://developer.withings.com/

## 1. withingsアカウントの登録
https://healthmate.withings.com
※ body+ 設定時に登録済みのはず

## 2. アプリ登録をする
https://account.withings.com/partner/add_oauth2

- 各項目を入力し、アプリ登録
 - コールバックURIは自分の管理下のURLを入れておく
- 登録後の画面で表示される下記をメモしておく
  - クライアントID
  - コンシューマーシークレット

## 3. authentication codeの取得
- URL: https://account.withings.com/oauth2_user/authorize2
- Parameters :
  - client_id: 2.で取得したクライアントID
  - state: 必要あれば
  - scope: アクセスデータ範囲。今回は user.metrics
  - redirect_uri: 2.で登録したコールバックURI

ブラウザで下記にアクセス

```
https://account.withings.com/oauth2_user/authorize2?response_type=code&client_id=[クライアントID]&state=[state]&scope=user.metrics&redirect_uri=[callbacl URL]
```

リダイレクトされたURLからauthentication codeを取得

```
http://(callbacl URL)/?code=(authentication code)
```


## 4. access tokenを取得
- URL: https://account.withings.com/oauth2/token
- Parameters :
  - grant_type: authorization_code
  - client_id: 2.で取得したクライアントID
  - client_secret: 2.で取得したコンシューマーシークレット
  - code: 3.で取得した authentication code
  - redirect_uri: 2.で登録したコールバックURI

※ authentication code 取得後、30秒以内にtokenを取得する必要があるそう。

curl でPOSTする

```
curl --data "grant_type=authorization_code&client_id=[クライアントID]&client_secret=[コンシューマーシークレット]&code=[authentication code]&redirect_uri=[callbacl URL]" 'https://account.withings.com/oauth2/token'
```

```json:戻り値
{
    "access_token": "xxxxxxx",
    "expires_in": "10800",
    "token_type": "Bearer",
    "scope": "user.metrics",
    "refresh_token": "xxxxxxxxxxx",
    "userid": "xxxxxx"
}
```

## 5. 体重を取得する
- URL: https://wbsapi.withings.net/measure
- Parameters :
  - action: getmeas
  - meastype: 体重の場合は1
  - category: 今回は1
  - startdate: 取得範囲 timestamp
  - enddate: 取得範囲 timestamp

curlでGETする

```
curl 'https://wbsapi.withings.net/measure?action=getmeas&access_token=[access token]&meastype=1&category=1&startdate=1543382553&enddate=1545974553'
```

```json:戻り値
{
	"status": 0,
	"body": {
		"updatetime": 1545974112,
		"timezone": "Asia/Tokyo",
		"measuregrps": [
			{
				"grpid": xxxxxxxxxx,
				"attrib": 0,
				"date": 1545918646,
				"created": 1545918680,
				"category": 1,
				"deviceid": "xxxxxxxxxxx",
				"measures": [
					{
						"value": xxxxxx,
						"type": 1,
						"unit": -3,
						"algo": xxxxxx,
						"fw": xxxxxx,
						"fm": xxxxxx
					}
				],
				"comment": null
			},
			{
				"grpid": xxxxxxxxxx,
				"attrib": 0,
				"date": 1545829628,
				"created": 1545829666,
				"category": 1,
				"deviceid": "xxxxxxxxxx",
				"measures": [
					{
						"value": xxxxxx,
						"type": 1,
						"unit": -3,
						"algo": xxxxxx,
						"fw": xxxxxx,
						"fm": xxxxxx
					}
				],
				"comment": null
			}
		]
	}
}
```

取得できた！

返り値の measures.algo, fw, fm あたりは ドキュメントになくて謎。
Azure DevOps と GitHub の連携について

開発環境を検討している話があったので、その際の検証結果まとめ

### そもそもAzureDevOpsとは
2018年9月に開発者向けクラウドベースのソリューション「Visual Studio Team Services（VSTS）」をリブランドしたもので、現行VSTSユーザーは自動的にAzure DevOpsにアップグレードされる
ダッシュボードでチームの情報管理やPipelineでCI/CDを回したりなど便利なツール

### で、実際に使ってみる
(1)Azure ポータルにログインし「リソースの作成」をクリック
![DevOps01.png](https://qiita-image-store.s3.amazonaws.com/0/313446/57d11c4d-365a-8880-0069-5e066ff41054.png)

(2)検索ボックスに「DevOps」プロジェクトと入力
![DevOps02.png](https://qiita-image-store.s3.amazonaws.com/0/313446/fa5f58fb-c9ce-2854-f3ec-92bf001a7fc9.png)

(3)「作成」をクリック
![DevOps03.png](https://qiita-image-store.s3.amazonaws.com/0/313446/5602af2a-9c5d-4a80-97ed-560f5805cd0a.png)

(4)今回は外部のGitHubと連携するので「Bring your own code」を選択し「Next」をクリック
　 (ここで開発言語を選択して先に進むと自動的にAzureDevOps内にリポジトリが作成される)
![DevOps04.png](https://qiita-image-store.s3.amazonaws.com/0/313446/785cf7cb-13b0-3e17-1566-7cb80d73869f.png)

(5)リポジトリに「GitHub」を選択し、自分のアカウントと認証を行うため「Authorize」をクリック
![DevOps05.png](https://qiita-image-store.s3.amazonaws.com/0/313446/1f7ce385-ffb9-46e7-da12-347d8d7ce6e3.png)

(6)GitHubのログイン画面が出るので、自分のGitHubアカウントを入力し「Sign In」をクリック
![DevOps06.png](https://qiita-image-store.s3.amazonaws.com/0/313446/2218dcaa-abf9-92e7-8d89-f9d38ca5b5dd.png)

(7)リポジトリやアカウント権限を確認し、問題なければ「Authorize Azure」をクリック
![DevOps07.png](https://qiita-image-store.s3.amazonaws.com/0/313446/fb6b6e63-a80f-89a8-bfd0-5351b75d5fa0.png)

(8)連携させるリポジトリとブランチの情報があっているのを確認し「Next」をクリック
![DevOps08.png](https://qiita-image-store.s3.amazonaws.com/0/313446/ad925efc-dda2-7ea3-04bf-37c5103a9a6d.png)

(9)後々のテストのために「is app Dockerized」を「Yes」にして「Next」をクリック
![DevOps09.png](https://qiita-image-store.s3.amazonaws.com/0/313446/93346ff2-1a70-c1e7-82b7-2da7b8d96ef2.png)

(10)Application Settings でDockerfile pathと Path to Chart folder を設定し、
　　後々のテストのために「kubernetes Service」を選択し「Next」をクリック
![DevOps10.png](https://qiita-image-store.s3.amazonaws.com/0/313446/b2d4ca61-4e33-f776-ec7f-66d29cd617fa.png)

(11)Project名やデプロイ先のリージョンなど必要事項を入力して「Done」Doneをクリック
![DevOps11.png](https://qiita-image-store.s3.amazonaws.com/0/313446/35e697fe-348f-eb69-9f1a-901728a03fd3.png)

(12)Deployが完了すれば完成！
![DevOps12.png](https://qiita-image-store.s3.amazonaws.com/0/313446/74bb6895-3b33-10c9-2e92-ae8593a86f7b.png)


簡単！！
次回はリポジトリからコンテナファイルをデプロイしたりするあたりを書きたいと思います
Site24x7でいろんなアラート方法試してみた。

はじめまして。
某IT企業にてインターンをしております、@tefu-tefu と申します。

『クラウドで使える統合監視ソフトウェア』ということでお世話になっている、
Site24x7のAdventCalendarとのことなので、私も記事を投稿してみたいと思います٩( ‘ω’ )و
因みに3つ目の記事です。

今回はSite24x7の通知方法についていろいろ試してみようかと思いますので、お付き合いいただければ。

それではいきましょうっ

##ユーザーとアラート##
通知方法っていうのも、「アラートが上がった時、ユーザーにどのように通知したいか？」ってことなんですが
・メール
・音声（電話）
・SMS
・インスタントメッセージ(IM)
・Twitter DM
上記5つは通常装備みたいで、設定して認証したら使えます！！
（[**ここ**](https://www.site24x7.jp/help/admin/user-management/users.html)を参考にしていただければ。）

##設定方法（音声・SMS）##
メールはなんだか普通なので・・音声とSMSを試してみましょう。
要は電話番号を使うんですね。

1. まず、Site24x7のWebクライアントにログイン。
2. 管理 -> ユーザーとアラートの管理 -> ユーザーとアラート
3. ユーザー画面で右上のユーザーの追加をクリック。

そうすると以下のようなページが出てきます。
![2018-12-28_14h11_47.png](https://qiita-image-store.s3.amazonaws.com/0/326030/61f53c57-fe23-9a5a-127d-68ab90e2fdc4.png)
赤い字のところは必須なのですが、今回は音声とSMSもやりたいので携帯電話番号も入れます。
その時は下のSMSプロバイダーと音声通知プロバイダーの設定も忘れずに。
※電話番号の横の「**Configure Providers**」をクリックすると出てきます。

はい、設定できましたら下の「アラート設定」に進みましょう。
![2018-12-28_15h24_46.png](https://qiita-image-store.s3.amazonaws.com/0/326030/d5b31342-b754-8258-1a03-98c8aeb638b9.png)
注目は「アラート期間」です。
これ、通知を許可する時間を指定できるんですけど、私は9:00-18:00という、
**定時以外はお仕事しないスタイルを取りました。**
また、「自分にアラートしない」※ちょっと日本語おかしいですね。
からは曜日ごとに通知しない日を指定できます。

設定が完了しましたら、「保存」をクリックしてください。

##認証確認##
「保存」をクリックすると同時にメールとSMSに認証確認の連絡が来ます。
メールはこんな感じ↓
![2018-12-28_14h15_16.png](https://qiita-image-store.s3.amazonaws.com/0/326030/8b38cf59-e29b-3530-7867-4ee7b4129ad6.png)
SMSはこんな感じ↓
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/326030/f1088f5a-cc0a-77a4-58c0-ac294f7e89c8.jpeg)
これを認証してあげます。
※下線が「～をクリックして」まで入っちゃっているので、コピペして余分なところを抜かないと認証完了しませんでした。。
![1 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/326030/5c9263c8-4a1c-439d-f9bd-03b7852f5b47.jpeg)
良かった・・。

##アラート受信##
設定が完了しましたら、ユーザーをアラートに適用します。
1. アラート に移動
2. アラートの「技術者」の「割り当てる」から、ユーザーを選択。

これで完了です！お疲れ様でした。
SMSでは先ほど設定した時間内でメッセージが届きます。
電話ですと、、英語で通知が来ます(笑)
英語のリスニング力が鍛えられますね。。

##終わりに##
通知方法が結構いろいろあって、用途に合わせた方法を選ぶというのが結構いいのでは？と感じました。
アラート通知したいけれど、なんだかんだ通知が多くて流れてしまいがち・・という時でも
**絶対に見逃しちゃいけないアラートだけは電話で！**とか、
ランク付けの方法としても有効活用できそうだなと感じました。

タイトルに「いろんな」って書いたんですが、、なんだか長くなってしまいましたので、今回はSMSと電話での通知方法にしました。

また機会があれば、他の通知方法とかも試してみたいですね。
それでは今回はこの辺で( ´Д｀)ﾉ
Ruby シングルクオートとダブルクオートの違い

Rubyでは、ほとんどの場合、シングルクオート(' ')とダブルクオート(" ")に大きな違いはない。

ただし、1つだけ重要な違いがある。**Rubyはシングルクォート文字列の中では式展開を行わない**。

```
>> '#{foo} bar'     # シングルクォート内の文字列では式展開ができない
=> "\#{foo} bar"
```
また、逆に言えば、ダブルクォート文字列を用いた文字列で#のような特殊な文字を使いたい場合は、この文字をバックスラッシュでエスケープ (escape) する必要がある。

シングルクォートは、入力した文字をエスケープせずに「そのまま」保持するときに便利だ。例えば「バックスラッシュ」の文字は、改行文字 \nと同様に多くのシステム上で特殊な文字として扱われる。しかし、シングルクォートで文字列を囲めば、簡単にバックスラッシュ文字のような特殊文字をそのまま変数に含めることができる。

```
>> '\n'       # 'バックスラッシュ n' をそのまま扱う
=> "\\n"
```


参考：[Railsチュートリアル](https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#cha-rails_flavored_ruby)
メモ：「３０日でできる！OS自作入門 」28日目

## ファイルと日本語表示

1) alloca(1)
- 素数生成のプログラム２つ追加 (1000と 10000まで）
- stack は　１００００ 個分 allocateできなかった
- もちろん malloc はできる

![スクリーンショット 2018-12-28 16.14.38.png](https://qiita-image-store.s3.amazonaws.com/0/109145/c2b9f79d-4523-0acc-9e2f-4b424d595480.png)


2) alloca(2)
- __alloca 関数を作成
    - スタックにEAXバイトの領域を確保
    - ECX,EDX,EBX,EBP,ESI,EDIの値を変更しないこと

![スクリーンショット 2018-12-28 16.15.21.png](https://qiita-image-store.s3.amazonaws.com/0/109145/441442ce-2487-4a11-8509-01c0b9b783e4.png)


3) ファイルAPI
- open,seek,read,write,close を実装
- ファイルを読み込んで表示するプログラム追加

4) コマンドラインAPI
- type という関数をプログラム化

5) 日本語表示１
- フォント追加
- 言語モードを追加 langmode
- 半角かな表示のプログラム追加

![スクリーンショット 2018-12-28 16.11.31.png](https://qiita-image-store.s3.amazonaws.com/0/109145/f54c3583-bcf7-fb42-657f-27e80fb9aa43.png)

6) 日本語表示２
- 全角対応
    - Shift-JIS
    - 文字を左半分と右半分分けて描画

![スクリーンショット 2018-12-28 16.21.26.png](https://qiita-image-store.s3.amazonaws.com/0/109145/29e46b42-431c-ad79-1d98-efebbab05840.png)

7) 日本語表示３
- EUC-JPも対応
- 現在の言語モードを取得するプログラムを追加　chklang

![スクリーンショット 2018-12-28 16.28.19.png](https://qiita-image-store.s3.amazonaws.com/0/109145/b461c1c4-4e64-3ee4-a2b2-e8a906c3a9d4.png)

![スクリーンショット 2018-12-28 16.28.33.png](https://qiita-image-store.s3.amazonaws.com/0/109145/c3b31e85-8ba2-3258-35a2-77e68d93743e.png)

ばっちりじゃないかなぁ
行末の'\'の意味

自分用のメモ書きとして記述しますが、誤りが見受けられるようでしたらご指摘いただければ幸いです…

'\'('￥')は改行をエスケープするためのもので、
論理行では1行で書くべきものを物理では復習行にして書くときに必要になります。

例えば、以下のようなデータベースからデータを取ってくるとします。

    テーブル名：健康診断テーブル

	番号	名前	身長 	体重	血液型
	1	たかし	147　	55  	A
	2	ひとし	132　	54  	B
	3	まゆ　	156　	65  	AB
	4	けい　	152　	88  	O
	5	かなこ	121　	60  	B

このとき、以下のようなSQLを発行するとします。

    SELECT '名前','身長','体重' FROM '健康診断テーブル' WHERE '血液型'='B'

しかし、ソースコードの可読性を高めるためには、複数行を使って記述したほうが望ましいことがあります。

具体的には以下のように記述したりします。

    SELECT '名前',
           '身長',
           '体重'
    FROM   '健康診断テーブル' 
    WHERE  '血液型'='B'

しかし、ステートメントに放り込んであげるには、SQL文を1行の状態にしなければいけません。

そこで　'\'　を使ってみると…
改行をエスケープしてくれるのデース！

    SELECT '名前', \
           '身長', \
           '体重' \
    FROM   '健康診断テーブル' \
    WHERE  '血液型'='B'

つまり、物理的には改行していても、'\'を使用することで論理では1行になっているのです!

いやー便利ですねー。
Sidekiqで実行予定のジョブの一覧をコンソールから取得したい


本番運用中のRedisの切替時に旧の方に残ったものを手作業でリカバリ実行したかった。
下記でそのままコンソールにコピペ実行できるフォーマットで出力できる

```rb
puts Sidekiq::ScheduledSet.new.map {|job| "#{job.jid} #{job.display_class}.perform_async(#{job.args})" }
```

sidekiq v5.2.3
AMP for WordPress プラグインで Paired （ペア）モードにした時、AMPページだけにソースコードを入れたい場合

テーマはTwenty Nineteenで動作確認。
今回は、AMPページにだけタグマネージャーを導入したい

プラグインについては以下を参照
[WordPressをAMP対応するプラグインの正式版 v1.0 が公開。統一されたデザインと機能のAMPページを実現(海外SEO情報ブログ)](https://www.suzukikenichi.com/blog/official-amp-plugin-for-wordpress-v-1-0-is-available-now/)

以下のページが参考になりました。
[Custom Shortcodes and Widgets](https://amp-wp.org/documentation/playbooks/custom-shortcodes-and-widgets/)

>You can also use is_amp_endpoint() to output different markup for AMP and non-AMP pages, such as when you are using the paired mode. For example, a social sharing widget or shortcode might output the amp-social-share component on the AMP page:


Google翻訳：is_amp_endpoint（）を使用して、ペアモードを使用している場合など、AMPページとそれ以外のページで異なるマークアップを出力することもできます。たとえば、ソーシャル共有ウィジェットまたはショートコードは、AMPページにamp-social-shareコンポーネントを出力します。

##1.いつも通り表示したい箇所に`functions.php`で`wp_head`と`wp_footer`のフックポイントを使用して、スクリプトを挿入。


```php
function amp_add_script_head(){
?>
<!-- AMP Analytics --><script async custom-element="amp-analytics" src="https://cdn.ampproject.org/v0/amp-analytics-0.1.js"></script>
<?php
}
add_action('wp_head', 'amp_add_script_head');

function amp_add_script_footer() {
?>
<!-- Google Tag Manager -->
<amp-analytics config="https://www.googletagmanager.com/amp.json?id=GTM-●●●●●&gtm.url=SOURCE_URL" data-credentials="include"></amp-analytics>
<?php
}
add_action('wp_footer', 'amp_add_script_footer');
```

##2.このままだと、AMPじゃない通常ページでも表示されてしまうので、`is_amp_endpoint`の条件分岐で挟む。

```php
if (function_exists('is_amp_endpoint') && is_amp_endpoint()) {
    function amp_add_script_head(){
    ?>
    <!-- AMP Analytics --><script async custom-element="amp-analytics" src="https://cdn.ampproject.org/v0/amp-analytics-0.1.js"></script>
    <?php
    }
    add_action('wp_head', 'amp_add_script_head');

    function amp_add_script_footer() {
    ?>
    <!-- Google Tag Manager -->
    <amp-analytics config="https://www.googletagmanager.com/amp.json?id=GTM-●●●●●&gtm.url=SOURCE_URL" data-credentials="include"></amp-analytics>
    <?php
    }
    add_action('wp_footer', 'amp_add_script_footer');
}
```

以上。
RefileをShrineにリプレイスするときのメモ

## これは何？
業務でRefileを使用しているプロダクトを触っているのですが、2018.12.28現在でRefileは１年近く更新が止まってしまっているので、Shrineに置き換えを行いました。その時のメモです。


## shrineとは
Rails向け画像アップローダ。refileの後継にあたり、ダイレクトアップロードもできる。

## README
https://github.com/shrinerb/shrine

## shrine for refile users
https://github.com/shrinerb/shrine/blob/master/doc/refile.md

## 作業手順
1. shrineを使用したいモデルに`include ImageUploader[:image]`を追加する（これによって仮想属性の`image`が使用できるようになる）

2. shrineに置き換えたいモデルのDBにimage_dataカラムを追加する
`add_column :hoge_images, :image_data, :text`
3. migationファイルにimage_dataカラムへ値を追加する処理を追加する。

```ruby
HogeImageModel.where(image_data: nil).each do |image|
  image.image = open(Rails.env.development? ? "https://local_path/#{image.src}" : image.src)
  image.image_attacher.finalize
  # finalizeメソッドがimage_dataの値をよしなに作成し、saveも行ってくれる
end
```
4. viewのフォームをshrine用に書き直す

```ruby
form_for @photo do |f|
  f.hidden_field :image, value: @photo.cached_image_data
  f.file_field :image
  f.submit
end
```
【学習記録③】チームラボオンラインスキルアップ課題「HTML、CSSについて」

##はじめに
第3回です。チームラボオンラインスキルアップ課題実践

「チームラボオンラインスキルアップ課題」
https://team-lab.github.io/skillup/

##今回やること
**HTML、CSSについて**
「STEP1-3.HTML,CSSについて／チームラボオンラインスキルアップ課題」
https://team-lab.github.io/skillup/step1/03-html-css.html

##学習したこと
## HTML
>HTMLはWebページを記述するための言語です。HTMLではタグを使って要素を記述します。<タグ名>を開始タグ、</タグ名>を終了タグといい、開始タグと終了タグの間に書いたものがそのタグの内容となります。(終了タグがないタグもあります。)

>最低限のHTMLファイルは以下のようなものになります。

```html
<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>Hello World</title>
 </head>
 <body>
  <h1>Hello World</h1>
  <p>HTMLのテストだよ</p>
 <body>
</html>
```

#各タグの概要
|タグ|役割|
|---|---|
|<!DOCTYPE html>|HTMLで作成されたファイルであることを示すタグです。最近はHTML5が主流になりました。|
|<head>～</head>|ページの情報を表します|
|<meta charset="～"/>|文字コードを指定します。|
|<title>～</title>|ブラウザのタイトルバーに表示するタイトルです。|
|<body>～</body>|このタグの中にページの内容を書いていきます。|
|<h1>～</h1>|見出しです。h6まであり、数字が大きくなるほど文字が小さくなります。|
|<p>～</p>|段落を表します。|

// markdownで「>」をつけるとテーブルの中身が表示されなくなる。
   （でもなぜか<!DOCTYPE html>は正常に表示されている）

## CSS
>CSSはHTMLの要素の見た目を指定するものです。
先ほどのhello.htmlを以下のように修正してください。

```html

<!DOCTYPE html>
<html>
 <head>
   <meta charset="UTF-8" />
   <title>HTMLのサンプル</title>
   <link rel="stylesheet" href="hello.css">
 </head>
 <body>
  <h1>HTMLのサンプル</h1>
  <p>こんにちは</p>
  <p id="red">赤いこんにちは</p>
  <p class="big">大きいこんにちは</p>
  <p class="blue">青いこんにちは</p>
  <p class="big blue">青くて大きいこんにちは</p>
 </body>
</html>
```

## 各要素の概要
|要素|役割|
|---|---|
|<link rel="stylesheet" href="～">|CSSを読み込む処理です。|
|id="～"|タグにIDを設定できます。同一ページ内に同じIDが存在してはいけません。|
|class="～"|タグにclassを設定できます。複数指定することもできます。idやclassはCSSで装飾する要素を指定するときに使用します。|

>さて、新たにhello.cssというファイルを以下のように作成します。

```hello.css
p {
  text-decoration: underline;
}

#red {
  color: #FF0000;
}

.big {
  font-size: 1.5em;
}

.blue {ｐｐ｛ｐ
  color: blue;
}
```

>CSSは先頭で指定した要素全てに対して{}で囲まれた内容を適用するという構文になっています。先頭に何も付けないとタグ名、先頭に#を付けるとid名、先頭に.を付けるとclass名を指定できます。どのようなことができるかについてはスタイルシートリファレンスに載っていますので試してみてください。

>また、Webブラウザには様々な種類があり、ブラウザごとにHTMLやCSSのレンダリングエンジンが異なるため、あるブラウザでしか使用できないタグや、あるブラウザでは崩れてしまうレイアウトなどがあるかもしれません。そのため様々なブラウザでチェックする必要があるでしょう。

##[課題]フォームを作ってみよう
>掲示板には発言を投稿するためのフォームが必要です。フォームの作り方を調べて、HTMLとCSSを書き込む部分と送信ボタンがあるフォームを作ってみましょう。


```index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>掲示板のフォーム</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>掲示板サンプル</h1>
    <form action="index.php" method="post">
        <p class="html"><label>HTML:<br><textarea name="comments" rows="10" cols="100"></textarea></label></p>
        <p class="css"><label>CSS:<br><textarea name="comments" rows="10" cols="100"></textarea></label></p>
        <p><input type="submit" value="送信"><input type="reset" value="リセット"></p>
    </form>
</body>
</html>
```

```style.css
h1 {
 text-decoration: underline;
}

.html{
    font-size:24px;
    color:red;
}

.css{
    font-size:24px;
    color:blue;
}
```
[Django] IPアドレスを使ったアクセス制限のかけ方

## この記事について

設定したIPアドレスからのみアクセスを許可するためのサンプルコードです。Webサーバの設定でも可能ですが、アプリケーション側でかけることもできます。

## サンプルコード

動くコードはこちら
https://github.com/okoppe8/django-ip-restrict-example

以下の方針で実装しましょう。

- アプリ全体に制限を掛けるならミドルウェアを使う
- 部分的に制限を掛けるならデコレータを使う

この例ではIPアドレスを設定ファイルに定義していますが、データベースから取得するようすると動的な管理も可能です。

- 事業所が増えたときにユーザー側で設定を追加する。
- [IPアドレスを確認するツール](https://www.cman.jp/network/support/go_access.cgi)を使って、管理者が個人のスマホに一時的にアクセス許可を与える。

という運用ができます。

### ミドルウェアでの実装方法

参考：[Qiita:DjangoのMiddlewareについて](https://qiita.com/shirakiya/items/1503eaffe81f91af5b9d)


```settings.py

MIDDLEWARE = [
    ....
    '<app_name>.middlewares.IpRestrictMiddleware',
]

ALLOWED_IP_BLOCKS = ['....', ]
```

```middlewares.py
from django.http import HttpResponse
from django.template.loader import get_template

from <project_name> import settings


class IpRestrictMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        ip = request.META['REMOTE_ADDR']

        if ip not in settings.ALLOWED_IP_BLOCKS:
            temp = get_template('not_allowed_ip.html')
            result = temp.render({'ip': ip})
            return HttpResponse(result)

        response = self.get_response(request)

        return response

```

### デコレータでの実装方法


参考資料：

- [Top 6 Django Decorators](https://www.bedjango.com/blog/top-6-django-decorators/)
- [DjangoにおけるDecoratorの使い方とその作り方](https://qiita.com/u_kan/items/bf492deeb063d3e11721)
- [DjangoでViewのデコレーターをurls.pyに書くと一覧性が高くなる](https://qiita.com/tag1216/items/6c6ef5801db3ad10916f)
- [Djangoでurls.pyのincludeにデコレーターを付ける方法](https://qiita.com/second_seal/items/250f88f7afca1ad53de4)


```settings.py
ALLOWED_IP_BLOCKS = ['....', ]
```

```decorators.py
from django.http import HttpResponse
from django.template.loader import get_template

from ip_restrict import settings


def ip_restriction(func):
    def check_ip(request, *args, **kwargs):

        ip = request.META['REMOTE_ADDR']
        if ip not in settings.ALLOWED_IP_BLOCKS:
            temp = get_template('not_allowed_ip.html')
            result = temp.render({'ip': ip})
            return HttpResponse(result)
        return func(request, *args, **kwargs)

    return check_ip

```


```urls.py
from django.urls import path
from django.views.generic import TemplateView
from .decorators import ip_restriction


urlpatterns = [
    path('', ip_restriction(TemplateView.as_view(template_name='index.html')), name='index')
]
```
Macのrbenvで新しいバージョンがリストされない

新しいバージョンのRubyを使わんと、`rbenv install --list`をす。
新しいバージョンの　Rubyがない！リストされない！ せっかくクリスマスに2.6も出たのに使えないではないか！

```shell-session
$ rbenv install --list
...(略)...
  2.4.0
  2.4.1
  2.5.0-dev
  jruby-1.5.6
  jruby-1.6.3
...(略)...
```

## 解決方法

rbenv を再インストール（`brew`でアンインストールしてインストール）しても変わらない。Google先生に聞いてもよい情報が探せなかった。
が、なんとかとあるフォーラムで似たような問題でのやりとりを見つけて実施した。

```shell-session
# ruby-buildノ更新ヲセヨ！
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
```

これでもう一度、インストール可能なリストをみてみると、最新版がちゃんとリストされていた！
よかったよたっか！

```shell-session
$ rbenv install --list
...(略)...
  2.4.0
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.5.0-dev
  2.5.0-preview1
  2.5.0-rc1
  2.5.0
  2.5.1
  2.5.2
  2.5.3
  2.6.0-dev
  2.6.0-preview1
  2.6.0-preview2
  2.6.0-preview3
  2.6.0-rc1
  2.6.0-rc2
  2.6.0
  2.7.0-dev
  jruby-1.5.6
  jruby-1.6.3
...(略)...
```
JsonUtilityでVector2, Vector3をシリアライズする

# はじめに

Unity標準のJsonパーサー `JsonUtility`は`Vector2`,`Vector3`に対応しています。素晴らしいですね！

どんな感じか見てみましょう。

# コード

```cs
// シリアライズ
var vec2 = new Vector2(33, 4);
var vec3 = new Vector3(11, 45, 14);
Debug.Log(JsonUtility.ToJson(vec2)); // 出力: {"x":33.0,"y":4.0}
Debug.Log(JsonUtility.ToJson(vec3)); // 出力: {"x":11.0,"y":45.0,"z":14.0}
// デシリアライズ
var vec2json = "{\"x\":33.0,\"y\":4.0}";
var vec3json = "{\"x\":11.0,\"y\":45.0,\"z\":14.0}";
Debug.Log(JsonUtility.FromJson<Vector2>(vec2json)); // 出力: (33.0, 4.0)
Debug.Log(JsonUtility.FromJson<Vector3>(vec3json)); // 出力: (11.0, 45.0, 14.0)
```
fastlaneメモ for android

# fastlane plugins
## version code を取得したい
https://github.com/Jems22/fastlane-plugin-get_version_code

### 追加方法
```shell

fastlane add_plugin get_version_code
```

### サンプル
```ruby
lane :test do
  get_version_code(
    #app_folder_name:"project"
    gradle_file_path:"project/build.gradle",
    ext_constant_name:"versionName"
  )
end
```

## version codeを自動で上げてほしい
https://github.com/Jems22/fastlane-plugin-increment_version_code

### 追加方法
```shell
fastlane add_plugin increment_version_code
```

### サンプル
```ruby
lane :test do
  increment_version_code(
    gradle_file_path: "project/build.gradle",
    #ext_constant_name: "test"
    #app_folder_name:"app"
  )
end
```


## bumpupのコミットをしたい
https://github.com/Jems22/fastlane-plugin-commit_android_version_bump

### 追加方法
```shell
fastlane add_plugin commit_android_version_bump
```

### サンプル

```ruby
lane :test do
  commit_android_version_bump(
    gradle_file_folder:"project"
  )
end
```

### 追加方法
```shell
fastlane add_plugin commit_android_version_bump
```
WindowsPCの具合が悪い場合にまず見る箇所

# 信頼性履歴の表示

コントロール パネル\システムとセキュリティ\セキュリティとメンテナンス\信頼性モニター

ここを開いて(x)の箇所を眺めていると、怪しげな場所は見つかります

![2018-12-28.png](https://qiita-image-store.s3.amazonaws.com/0/17098/20576f8f-77aa-5542-a4c5-6ff9ac353f78.png)
検索対象シャードのスキップ

# 検索対象シャードのスキップ

※　備忘録がわりなので、読みやすくはありません。あしからず。

## 最初に
Elasticsearch 5.6から（？）、検索結果の表示に`skipped`なる項目が。

こんな感じで普通に検索すると・・・

```json
GET filebeat-*/_search
{
  "size": 0,
  "query": {
    "range": {
      "@timestamp": {
        "gte": "2019-12-27"
      }
    }
  }
}
```

結果は、こんな感じ。

```json
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": 0,
    "hits": []
  }
}
```

## `skipped`って何だ？
じゃぁ、この`skipped`って何でしょう。
Forumでも[いろいろ](https://discuss.elastic.co/search?q=skipped)話が出てますが、よくわかりません。
ただ、参考になる記述はあります。`pre-filter`というキーワードが気になります。
実際に、コードの[このあたり](https://github.com/elastic/elasticsearch/blob/master/server/src/main/java/org/elasticsearch/action/search/SearchRequest.java#L445-L465)を見てみると、それっぽい記述があります。

関連するのは`pre_filter_shard_size`というパラメータ。
でも、このパラメータの記述はマニュアルにありません。[このへん](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html#_parameters_3)にあっても良さそうですが。

でも[別のところ](https://www.elastic.co/guide/en/elasticsearch/reference/6.6/_searching_a_frozen_index.html)には記述があります（6.6以降ですが・・・）。

Frozen Indexはデフォルトで検索対象とならないので、`ignore_throttled=false`をつけて検索対象にしますが、そうすると折角メモリから追い出したのに、メモリに乗っけなきゃいけない＝すんごい遅くなる、ので、なるべく検索対象になるシャードを減らす（読み込むファイルを減らす、かな？）ために、`pre_filter_shard_size=1`を設定しましょう、と。

## `pre_filter_shard_size`を使ってみる
とりあえず、このパラメータを使って見ましょう。

```json
GET filebeat-*/_search?pre_filter_shard_size=1
{
  "size": 0,
  "query": {
    "range": {
      "@timestamp": {
        "gte": "2019-12-27"
      }
    }
  }
}
```

すると、こんな感じに。

```json
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 4,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": 0,
    "hits": []
  }
}
```
お、`skipped`が出ますね。
この例だと、2018-12-27以降のデータのみ検索対象としたRangeクエりなわけですが、pre-filter phase（pre-flight search phase）でフィルタリングしてます。その時にスキップされたシャード数が4個だと。

6.6になって、Frozen IndexやIndex Lifecycle Management(ILM)が使えるようになると、徐々に認知されてくるんでしょうかねぇ・・・

## 注意点

てほどのことはないですが・・・
`pre_filter_shard_size`のデフォルトは128なので、このパラメータを指定しない場合は129個以上のシャードが検索対象にならない限りはpre-filter phaseは発生しません。
検索対象シャード数が`pre_filter_shard_size`の値を超える場合は必ずpre-filter phaseは発生しますが、時間指定のRangeクエリ以外ではスキップは行われないようなので、常に指定していても良いというわけではなさそうです。

通常は、query phaseがあって、そこで必要なシャードが絞られてから、fetch phaseで実際のデータが取得されます。
pre-filter phaseはquery phaseの前に実行されるので、都合3回のリクエストがcoordinator nodeからdata nodeに送られることになります。なので、時間指定のRangeクエリ以外に対してpre-filter　phaseが発生するのは、オーバーヘッドが少ないphaseとはいえ避けられるなら避けたほうが良いと。
Ruby「||=」とは何か？

「||=」(or equals) という代入演算子は、Rubyで広く使われているイディオム。

端的にいうと、「変数の値がnilなら変数に代入するが、nilでなければ代入しない (変数の値を変えない)」。

```example.rb
@current_user ||= User.find_by(id: session[:user_id])
```

上の例の場合、@current_user がnilなら　User.find_by(id: session[:user_id]) を実行して代入するが、もし nil でないならその値がそのまま @current_user となる。

参考：[Railsチュートリアル](https://railstutorial.jp/chapters/basic_login?version=5.1#cha-basic_login)
Photos Frameworkでアルバムのサムネイルを取得する

#はじめに
photosFrameworkでユーザーアルバムのサムネイル用の画像を取得した時の内容を雑にメモしていきます。
###主に使う変数

```swift:ViewController.swift
    var fetchResult: PHFetchResult<PHCollection>!
    var requestFetchResult: PHFetchResult<PHAsset>!
    var originalArray: Array! = [UIImage]()
    let imageManager = PHCachingImageManager()
    var thumbnailSize: CGSize!
```

#ViewControllerでの記述
まずはfetchResultでアルバムを取得

```swift:ViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()
        //fetchTopLevelUserCollectionsでユーザーアルバム取得
        fetchResult = PHCollectionList.fetchTopLevelUserCollections(with: nil)
        
        albumsTableView.dataSource = self
    }
```

###肝となる部分

```swift:ViewController.swift
 func getThumbnail(indexPathRow: Int) {
        let collection: PHCollection
        //どのアルバムかを指定
        collection = fetchResult.object(at: indexPathRow)
        //ここでPHCollectionからPHAssetCollectionにキャスト
        guard let assetCollection = collection as? PHAssetCollection else {
            return
        }
        
        requestFetchResult = PHAsset.fetchAssets(in: assetCollection, options: nil)
        //アルバム内の画像が一枚もない時は適当に配列に画像を突っ込んでおく
        //ここの記述がないとindexPathが何もないというエラーを吐く
        if requestFetchResult.firstObject == nil {
            print("何もない")
            self.originalArray.append(UIImage(named: "test")!)
        } else {
            let asset = requestFetchResult.object(at: 0)
            
            
            imageManager.requestImage(for: asset, targetSize: thumbnailSize, contentMode: .aspectFill, options: nil, resultHandler: { image, _ in
                if image == nil {
                    print("managerError")
                } else {
                    self.originalArray.append(image! as UIImage)
                }
            })
        }
    }
```

###次に
for文で配列にimageを入れていく。delegateメソッドで入れていく方が効率がいいのかわからないが、配列が空の時にcellが描画されたらめんどくさいのでviewWillAppearに記述していく。

```swift:ViewController.swift
override func viewWillAppear(_ animated: Bool) {
        
        let scale = UIScreen.main.scale
        let cellSize: CGFloat = (UIScreen.main.bounds.size.height / 12) - 4
        thumbnailSize = CGSize(width: cellSize * scale, height: cellSize * scale)
        for cell in 0..<fetchResult.count {
            getThumbnail(indexPathRow: cell)
            print("配列の数は\(originalArray.count)です")
        }
    }
```

デバックはこんな感じ

```
配列の数は1です
配列の数は2です
配列の数は3です
配列の数は4です
配列の数は5です
配列の数は6です
配列の数は7です
何もない
配列の数は8です
配列の数は9です
配列の数は10です
配列の数は11です
配列の数は12です
配列の数は13です
配列の数は14です
配列の数は15です
配列の数は16です
```

#最後に

```swift:ViewController.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "albumsCell", for: indexPath) as! AlbumsTableViewCell
        cell.bounds.size.width = self.albumsTableView.bounds.size.width
        //こんな感じでサムネが取得できる
        cell.albumsImage.image = originalArray[indexPath.row]
        
        return cell
    
    }
```
Ansibleのiniっぽいプレインテキストのinventoryを別の種類でシンタックスハイライトしてみる

少しだけ読みやすい気もした

代替えシンタックス

#Text

```
; ---------------------------------------------
; COMMENT
; ---------------------------------------------

[example]
server[1:30]

[example:vars]
dir=/some/dir
```

#Plain

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/90ecbb81-040d-fc1e-8103-639cd5d92d14.png)

#Ruby

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/da810bcb-ab72-e901-425d-75a5f1c7a361.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
メモ：「３０日でできる！OS自作入門 」27日目

## LDT と ライブラリ

1) まずはバグを直そう
- 終了処理させるために、寝ていたら起こす処理を追加

2) アプリ実行中でもコンソールを閉じたい
- コンソールだけを閉じる処理を追加
- 結構直感的になった

3) アプリケーションを守ろう１
- 別のアプリケーションがやられた

![スクリーンショット 2018-12-28 14.18.26.png](https://qiita-image-store.s3.amazonaws.com/0/109145/2c01b3d6-9a0e-650b-cd84-d64263beb506.png)

4) アプリケーションを守ろう２
- 他のアプリケーションのセグメントを触れないようにする
- LTD (Local Segment Descriptor)
- TASK の構造体の中に　LDT ２つ持つように変更 (コードとデータ用）
- TASK init LDTもセットするコード追加
- 🎉

![スクリーンショット 2018-12-28 14.43.33.png](https://qiita-image-store.s3.amazonaws.com/0/109145/6377d67e-e115-fde4-b8cd-ce6b5e7f6088.png)

5) アプリケーションのサイズ改善
- API を全部分けた (api001.nas ~ api020.nas)

6) ライブラリ
- APIをライブラリ化 (アプリは #include "apilib.h" すればよい)

7) make環境の整理
- アプリケーションをフォルダ分ける
- apilib も別フォルダ
- OS は haribote というフォルダに
- makeが速くなった気がする
will_paginateでナビゲーションを中央に表示する

#will_paginateのナビゲーションを中央に表示したい

つまるところ、これを
![スクリーンショット 2018-12-28 14.26.05.png](https://qiita-image-store.s3.amazonaws.com/0/282929/f1fb9369-e618-d9dc-c2de-4c3c42404d58.png)

こうしたいのです。
![スクリーンショット 2018-12-28 14.25.33.png](https://qiita-image-store.s3.amazonaws.com/0/282929/e212947b-81a4-4578-532d-4fb4ee949836.png)

#実装
>ページ送り（Pagination）
https://cccabinet.jpn.org/bootstrap4/components/pagination

こちらを参考にすると、classに"pagination justify-content-center"を指定することで中央揃えにできそうです。

will_paginateのデフォルトではclassに"pagination"が指定されます。
このデフォルト値をオーバーライドして好きなclassを設定することができます。

具体的にはこんな感じです。

```erb
<%= will_paginate(@posts, class: "pagination justify-content-center",
                          renderer: WillPaginate::ActionView::Bootstrap4LinkRenderer) %>
```

"pagination justify-content-end"で右寄せにもできます。
また、Bootstrap3では中央寄せ、右寄せはできないみたいなのでご注意ください。
Alfredでコードブロックを一瞬で入力してプログラミングコードを囲みたい @yumainaura #Markdown

[Mac — Alfred で スニペットの中にクリップボードのテキストを埋め込む - Qiita](https://qiita.com/YumaInaura/items/718935838ac3130346f1)

# 結論 Alfred Snippet plugin の Snippet項目に以下を記入

    ```
    {clipboard:0}
    ```

# 以下手順

# Alfred のSnipetを登録する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6f764e45-0255-1771-8122-7c466d15b410.png)

# Snippetに以下を記入

    ```
    {clipboard:0}
    ```



![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8b8ddfd3-0260-1300-b842-7b5f677218a6.png)

# 例

こんなんをコードブロックで囲みたい場合

Command+C などでクリップボードにテキストを入れておく

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/adabf36d-18c7-bb28-ef3f-e51af6f9b935.png)

# ショートカットでAlfredのSnippetダイアログを起動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/33150cd8-5bf7-b00b-41e7-ea0e777e5011.png)



# 選択すると？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1ae57ec8-edab-d300-bfd3-dead67584347.png)

# 貼り付け成功

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6b9449cc-1c4c-531c-fbec-cbd9cc230eec.png)

[alfred yumainaura - Google Search](https://www.google.com/search?q=alfred+yumainaura&oq=alfred+yumainaura&aqs=chrome.0.69i59j69i61j69i57j69i60.2131j0j7&sourceid=chrome&ie=UTF-8)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
.DS_Storeをファイルサーバに上げないようにする

#.DS_Storeを消し去るコマンド
````
sudo find $USER -name .DS_Store -print -exec rm {} ';'
````
cd ~/ を押したあとcd ../ で１回層潜ってから上記コマンドを実施
すると、 いろんなフォルダの .DS_Store が消えていく

.DS_Store自体を生成しないようにするコマンドもあるが、Finderやアプリケーションが起動しないなど不具合もあるようなので自己責任。

#Filezillaで.DS_Storeをフィルタリングする

1: 表示 > ディレクトリリストのフィルタリングを押す
2: フィルタルールの編集を押す
![スクリーンショット 2018-12-28 14.16.03.png](https://qiita-image-store.s3.amazonaws.com/0/207535/d42bccb6-d757-cb8b-066c-294a4a512d3f.png)

3: [新規]> 任意の名前(例:　.DS_Store)をつける > OK

4:設定をこんな感じにする > OK
![スクリーンショット 2018-12-28 14.20.04.png](https://qiita-image-store.s3.amazonaws.com/0/207535/760269e7-58e9-c6aa-2e97-de54a3e4d996.png)

5:左がローカル、右がリモートなので左側の .DS_Store にチェックを入れる > [適用] > OK
![スクリーンショット 2018-12-28 14.21.17.png](https://qiita-image-store.s3.amazonaws.com/0/207535/bf2b2f01-5ed6-3abd-120e-64363f8c95af.png)

これでかんぺき。
Sparkのファイル読み込みで正規表現を用いる

# 参考文献
https://stackoverflow.com/questions/31782763/how-to-use-regex-to-include-exclude-some-input-files-in-sc-textfile

# 動機

Sparkで特定のファイル名のファイルだけ読みたいとき、正規表現を用いてファイルを絞り込むことができる。

# 例

たとえば、ファイルが `path/to/dir/yyyy/mm/dd/hogehoge.zlib.orc`　の用になっていた場合、`2018/11/11~2018/11/18`のファイルを読み込みたいときは以下のようにする。

```python

spark.read.orc("path/to/dir/{2018/11/18,2018/11/17,2018/11/16,2018/11/15,2018/11/14,2018/11/13,2018/11/12,2018/11/11}/*.zlib.orc")
```

↑の参考文献によると、以下の構文が使えるらしい。（すべての記号を検証したわけではない）

```
* (match 0 or more character)
? (match single character)
[ab] (character class)
[^ab] (negated character class)
[a-b] (character range)
{a,b} (alternation)
\c (escape character)
```
【学習記録②】チームラボオンラインスキルアップ課題(WEBサーバについて)

#はじめに
第2回です。チームラボオンラインスキルアップ課題を実践します。

「STEP1-2.WEBサーバについて ／チームラボオンラインスキルアップ課題」
https://team-lab.github.io/skillup/step1/02-http.html

#今回学習すること
## WEBサーバについて
## 用語集

* クライアント（主にWEBブラウザ）
* WEBサーバ（クライアントとHTTPによる通信を行うプログラム及びコンピュータ）
* HTTP（プロトコル）
    * WebサーバはHTTPを用いてクライアントと通信する
    * HTTP通信は必ずクライアント側のリクエストから開始される
    * サーバはこれにレスポンスを返す
* HTTPリクエスト
    * リクエスト（クライアント⇒サーバ）
        * メソッド（GET／POST）
        * URI（/index.html）
        * ホスト名（example.com）
    * レスポンス（サーバ⇒クライアント）
        * ステータスコード（200、403、404）
        * Content-Type（送信したファイルの種類「text/html」）
        * 空行
* 「GETメソッド」…コンテンツを呼び出す際に用いられる
    * 1. クライアント(主にブラウザ)がWEBサーバにリクエストを送る
    * 2. リクエスト内容に応じて、サーバはレスポンスを返す
    * 3. クライアントはデータを受取り、ファイルの内容を表示する
* 「POSTメソッド」…掲示板など動的なコンテンツに書き込む際に用いられる
    * 1．クライアントがWEBサーバにリクエストを送る
    * 2．サーバでデータを処理するプログラムが起動
    * 3. 掲示板の更新処理などを行った後にレスポンスを返す
* クラウドコンピューティング(インターネットなどのコンピュータを経由して、コンピュータの資源をサービスの形で提供する利用形態)
    * Paas(Platform as a Service)
        * AWS(Amazon Web Service)
        * GCP(Google cloud Platform)
        * Heroku

## リクエストとレスポンス（例）

**リクエスト**

```
//クライアント(主にブラウザ)からWEBサーバにリクエストを送る
GET /index.html HTTP/1.1
Host: example.com

//これはexample.comというホスト名のサーバに対し、GETメソッドで
/index/htmlというURIを要求していることを表す。
```

**レスポンス**

```
HTTP/1.1 200 OK　　　　　　　//ステータスコード
Content-Type: text/html　　 //送信したファイルの種類
Content-Length: 25069
Date: Fri, 10 May 2013 06:17:55 GMT
　　　　　　　　　　　　　　　 //最後に1行の空行を挟む
(コンテンツ本体)
```

##実際の通信を見てみよう

**実践済み**
>GoogleChromeには「要素を検証」という機能があり、Webページの情報や通信の様子を見ることができます。右クリック→「検証」→「Network」タブでWebページの通信の様子が見れます。
タブを開いている状態でページを更新したり、別のページを開いて色々なWebページの通信の様子を見てみましょう。
nvmとdirenvを使ってディレクトリ毎にnodeのバージョンを指定する方法


いつも一回書くと`cp`で取ってきて、忘れてしまうので、残しておく。

##1 `.nvmrc`にnode versionを書く

```　.nvmrc
8.12.0
```

##2 `.envrc`にdirenvの設定を書く
`.nvmrc`と同じディレクトリーに`.envrc`を置く

```　.envrc
nvmrc=~/.nvm/nvm.sh
source $nvmrc
nvm use
```

これで２つを配置したディレクトリに`cd`するだけで、node versionが切り替わる。
メモ：「３０日でできる！OS自作入門 」26日目

## ウィンドウ移動の高速化

1) ウィンドウの移動を速く1
- マウスのウィンドウだけ透明部分があって、普通のウィンドウは透明な部分がない
    - なので if 分を外で書くことでCPU処理を減らす

2) ウィンドウの移動を速く２
- 1バイト単位書いてるところを int* に変更し、その分書き込む
- シート位置も4の倍数に
- うん、全然速い

3) ウィンドウの移動を速く３
- 移動以外の描画も4バイトずつ

4) ウィンドウ移動を速く4
- FIFO が空っぽのときに sleep 直接するのではなく、描画必要あるか見てあったら描画する方法

5) 最初のコンソールを１つに
- １個にもどした
- Shift+F2でもう一つのコンソールが作れるように変更

6) コンソールをもっとたくさん
- console という特別なシートの代わりに動的にシート作るように変更

![スクリーンショット 2018-12-28 13.46.47.png](https://qiita-image-store.s3.amazonaws.com/0/109145/3fb0a407-abdc-a720-7407-28dda8b04cd5.png)

7) コンソールを閉じる１
- 今までコンソールは閉じれなかったため
- メモリ/タスクFreeなど処理を追加
- exit というコマンドを追加

8) コンソールを閉じる２
- マウスで閉じれる用に変更

9) start コマンド
- 別コンソールでコマンドを実行

10) ncst コマンド
- コンソールをスタートせずに実行
- 画面はスッキリ
- マウスで閉じれなくなったが、とりあえずここまで
VBA、関数によって配列のインデックス最小値が異なる

# ストーリー

縦長のセル範囲に配列を貼り付けようとしたときに、Transpose関数の仕様で泣きそうになったので、`Option Base`の切替も含めて表にまとめた。「Transposeなんてもう使わない！」と心に決めたが縦に伸びる配列では`ReDim Preserve`が使えないことが分かり玉砕。いやいや、「メモリの書き換えが複雑にならないようにするため最後の次元以外は後から変更できない仕様です」なんて聞いてません、勘弁してください。というか（１次元目，２次元目）と（行数，列数）の対応関係がどうしてこうなった！と嘆いた結果たどり着いた境地。

# テストコード

<details><summary>サンプルコード</summary><div>

```vb:module1
Option Base 1 '「0,1」切替

Sub test()
    Dim mySheet1 As Worksheet
    Set mySheet1 = ThisWorkbook.Worksheets(1)
    myArrayA = Array(1, 2, 3, 4, 5)
    myArrayB = Split("a,b,c,d,e", ",")
    ReDim myArrayC(4)
    For i = 0 To (UBound(myArrayC) - LBound(myArrayC))
        myArrayC(LBound(myArrayC) + i) = Chr(Asc("A") + i)
    Next
    myArrayD = WorksheetFunction.Transpose(myArrayC)

    Debug.Print ">>>>>>>>>>start"
    Debug.Print "Array:(" + CStr(LBound(myArrayA)) + " To " + _
                            CStr(UBound(myArrayA)) + ")"
    Debug.Print "Split:(" + CStr(LBound(myArrayB)) + " To " + _
                            CStr(UBound(myArrayB)) + ")"
    Debug.Print "myArray:(" + CStr(LBound(myArrayC)) + " To " + _
                            CStr(UBound(myArrayC)) + ")"
    Debug.Print "Transpose:(" + CStr(LBound(myArrayD, 1)) + " To " + _
                            CStr(UBound(myArrayD, 1)) + "," + _
                            CStr(LBound(myArrayD, 2)) + " To " + _
                            CStr(UBound(myArrayD, 2)) + ")"
    Debug.Print ">>>>>>>>>>finish"

    With mySheet1
        .Range(.Cells(2, 1), .Cells(6, 1)) = myArrayA
        .Range(.Cells(2, 2), .Cells(6, 2)) = myArrayB
        .Range(.Cells(2, 3), .Cells(6, 3)) = myArrayC
        .Range(.Cells(2, 4), .Cells(6, 4)) = myArrayD
    End With
End Sub
```

</div></details>

`myArrayA`～`myArrayD`をセルに代入する部分があるが、思うように代入できるのは`myArrayD`のみ。
他は配列の最初の要素が全てのセルに代入される。

# 各要素の次元数

`Option Base 0`の場合

 Name |       １次元目の最小値 |   １次元目の最大値   | ２次元目の最小値 |   ２次元目の最大値
:-:|:-:|:-:|:-:|:-:
 Array|0| 4|-|-
 Split|0| 4|-|-
 myArray | 0 | 4|-|-
 Transpose |1 | 5|1 |1

`Option Base 1`の場合

Name|       １次元目の最小値 |   １次元目の最大値   | ２次元目の最小値 |   ２次元目の最大値
:-:|:-:|:-:|:-:|:-:
Array|1| 5|-|-
Split|0| 4|-|-
myArray| 1 | 4|-|-
Transpose|1 | 4|1 |1

# 結果

`Option Base 0` の場合

```:イミディエイトウィンドウ
>>>>>>>>>>start
Array:(0 To 4)
Split:(0 To 4)
myArray:(0 To 4)
Transpose:(1 To 5,1 To 1)
>>>>>>>>>>finish
```
`Option Base 1` の場合

```:イミディエイトウィンドウ
>>>>>>>>>>start
Array:(1 To 5)
Split:(0 To 4)
myArray:(1 To 4)
Transpose:(1 To 4,1 To 1)
>>>>>>>>>>finish
```

# セルへの代入結果

<details><summary>`Option Base 0` の場合</summary><div>

||A|B|C|D|
|:-:|:-:|:-:|:-:|:-:|
||myArrayA|myArrayB|myArrayC|myArrayD|
|1|1|	a|	A|	A|
|2|1|	a|	A|	B|
|3|1|	a|	A|	C|
|4|1|	a|	A|	D|
|5|1|	a|	A|	E|

</div></details>

<details><summary>`Option Base 1` の場合</summary><div>

||A|B|C|D|
|:-:|:-:|:-:|:-:|:-:|
||myArrayA|myArrayB|myArrayC|myArrayD|
|1|1|	a|	A|	A|
|2|1|	a|	A|	B|
|3|1|	a|	A|	C|
|4|1|	a|	A|	D|
|5|1|	a|	A|	#N/A|

</div></details>

**Excelsior!**
訳あってScientific Linux 6にPython3.7(+LibreSSL)を入れた話

# あらすじ
Scientific Linux 6.1の上にてPython3.7のスクリプトを動かしたく
インストールを行った際のメモです

# 下準備
curlでダウンロードする際、SSL関連が古く失敗するので予めNSS含めてupdateしておく
なお、pythonのSSLライブラリにはLibreSSLを利用するので、develは不要

```
sudo yum update openssl curl nss libffi-devel
```

# LibreSSL local install
2018/12/28時点でstableな2.8.3を採用

```
mkdir -p ~/src; cd ~/src
curl https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.8.3.tar.gz | tar zxvf -
cd libressl-2.8.3
mkdir build; cd build
../configure --prefix=$HOME/local
make -j
make install
```

# Python3.7 local install
2018/12/28時点でstableな3.7.2を採用

```
mkdir -p ~/src; cd ~/src
curl https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz | tar zxvf -
cd Python-3.7.2
mkdir build; cd build
../configure --enable-optimizations --prefix=$HOME/local --with-openssl=$HOME/local
```

`vi Modules/Setup`にて下記の場所をコメントアウト&SSLを$(HOME)/localに変更

```
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=$(HOME)/local
_ssl _ssl.c \
        -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        -L$(SSL)/lib -lssl -lcrypto
```

引き続きmakeに入る

```
LD_LIBRARY_PATH=$HOME/local/lib
export LD_LIBRARY_PATH
make -j
make install
```

これで$(HOME)/local配下にpython3.7が入るため、あとはPATHを通せばOK

---
## エラー例
Python3実行時に下記のようなエラーが出る
(ライブラリへのパスが通ってない場合)

```
/home/m10i/local/bin/python3: error while loading shared libraries: libssl.so.46: cannot open shared object file: No such file or directory
```

その場合はLD_LIBRARY_PATHを再設定する

```
$ export LD_LIBRARY_PATH=$HOME/local/lib
```

そして次回起動時に有効になるよう、.bash_profileにも追記しておくとよい
自分のページにアクセスしてきた企業を知る

::: note warn
注意
2020年2月4日からドメイン情報が保存されなくなったそうです。
（10万PVまではGoogleAnalyticsにプラグインを入れることで代替が可能とのこと）
詳しくは@takeC74さんのコメントにあるページから確認できます。
情報ありがとうございます！
:::

# 概要
Googleアナリティクスを使うとできるよ！というのが今回の投稿です。

自身が競合サービスの調査のためにサービスページにアクセスする時は、
アクセス解析していたらばれてるんだろうな〜と考えていました。
そして、そういった解析ができるツールがあるんだろうかと思い調べてみたところ色々とでてきたんですが、QiitaのデフォルトのツールであるGoogleアナリティクスにもそういう機能があったので試してみたところ、思いの他おもしろかったので紹介します。

# 方法
### Googleアナリティクスを設定する
設定方法は下記にあります。
[QiitaでGoogleアナリティクスを利用する手順](https://qiita.com/Qiita/items/c7f704e3786df3aa7a11)
### アクセスしてきた企業を知る
- 左のメニューから**集客->すべてのトラフィック->チャネル**を選択する
**行動->サイトコンテンツ**を選択して各URL毎のページに遷移すると、各投稿毎で見ることができます
<img width="367" alt="スクリーンショット 2018-12-28 13.40.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/41506/7bfa0943-0ea5-56e9-6ebf-771ecd3f4977.png">

- プライマリディメンションから**その他->ユーザーの環境->ネットワークドメイン**を選択する
<img width="476" alt="スクリーンショット 2018-12-28 13.40.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/41506/03c461c7-69b0-244b-ad5f-089c5cda2403.png">

- ドメインを「co.jp」だけに絞る
<img width="419" alt="スクリーンショット 2018-12-28 13.42.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/41506/bc859ea3-52f6-0a2f-35cf-abd8590913c6.png">

- 結果をみる
これは私のQiitaの投稿での結果です。
大きい企業さんは社員数も多いので上位にでやすいですが、情報価値としては下位の結果も有用ですね。
<img width="1403" alt="スクリーンショット 2018-12-28 13.32.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/41506/37862453-d562-6e14-72e5-ad0db6e2865e.png">

# まとめ
自分の記事に興味をもっているのがどんな業種の企業なのか
日付を変えてみて時期による変化はないか（その時期にあげていた記事内容に関係しているか）
などなど分析できると思うので色々と調べてみてください。
投稿のモチベーションにもなるかと思います。

ドメイン名を入力するだけで、自社のHPのどのページが閲覧されているかを見たりできると便利そうですね。
GoogleアナリティクスのAPI使えばできるのかな？
WWWサーバのアクセスログから勝手にしてくれても便利ですね・・・

以上！
SlackとJira連携と僕


![スクリーンショット 2018-12-28 13.04.54.png](https://qiita-image-store.s3.amazonaws.com/0/32839/75e09fd4-13ec-bd58-d569-997b0c47b580.png)
出落ち

# 前提
+ 自分が関わり始めてまだ日の浅いSlackチャンネルであること。
+ 大した話ではないが、同じようなことでググって困っている人の助けになれればと思って。

# はじまりの｢Add to issue Jira Cloud｣

![スクリーンショット 2018-12-28 13.05.33.png](https://qiita-image-store.s3.amazonaws.com/0/32839/f206ee0f-af98-2c9f-30ac-1d52572371e2.png)

お、もう連携されているのね!使ってみよう。

```
There are no Jira projects connected to this channel.
```

ん??繋がっていないようですね。

# 挑戦｢/jira connect｣

![スクリーンショット 2018-12-28 13.34.14.png](https://qiita-image-store.s3.amazonaws.com/0/32839/d0159de4-850f-4a1d-3f69-0597b8c7ccde.png)

ふむ connectコマンドがあるんだな?

カタカタカタ…

![スクリーンショット 2018-12-28 13.37.36.png](https://qiita-image-store.s3.amazonaws.com/0/32839/13b8e9f9-6f03-4089-8a9e-5e930463210f.png)

ターン!!

![スクリーンショット 2018-12-28 13.37.41.png](https://qiita-image-store.s3.amazonaws.com/0/32839/f1e54aad-078c-173d-8231-572590a5e6bd.png)

# 困惑｢自意識過剰｣
アレ?アレ?私としたことがSlackとJiraの連携ができないだとぉう??

スーハースーハー…。
よし最初に立ち戻ろう…。

# 葛藤｢マニュアルと出会い、そして別れ…｣
https://get.slack.help/hc/ja/articles/218475657-Jira-%E3%81%A8-Slack-%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B

特に大したことは書いていない…。

どうしたものか…。

エラーメッセージをググっても、それらしいものがでてこない…。

*〜そして1時間半が経過〜*

# 驚愕｢君の名は…｣
![スクリーンショット 2018-12-28 13.37.41.png](https://qiita-image-store.s3.amazonaws.com/0/32839/b851171b-4f6a-0846-6bda-e62db7a07d29.png)

**｢反応しているApp名が違う!!?｣**

# 原因
/jiraって打つとサジェストされるのが｢Jira Cloud｣側のコマンド
しかし、/jira で実行されるAppは｢Jira SLACK Connector App｣だった…。

# そして僕は諦めた
Jira SLACK Connector Appはなんだかよく使われている風なので、
Add to issueを使うのは諦めた。

# 教訓
+ エラーメッセージだけでなく誰が吐いているかを確認する。
+ 全体として連携されているものを把握する。
排他的論理和でマルウェアからNEMの秘密鍵を守る

タイトルは釣りです。必ず守れるというものではありません。
また、守り方を公開する必要もありません。
守る方は全ての穴を防ぐ必要があるのに対し、攻める方は1つだけ穴を見つければいいからです。

JavaScript言語はメモリのお掃除が任意のタイミングで実行できない言語となっており、
いったん秘密鍵で署名を行ったりすると、アプリを終了するまでは
その情報はメモリ上に残ったままとなっている可能性があります。
このメモリ上に残った秘密鍵は、万が一PCがマルウェアに感染していた場合、
メモリダンプという手法で取り出すことが出来てしまいます。


もちろん、マルチシグやハードウェアウォレットを使用していれば万全です。
ただし、どちらにしても送金先のアドレスは多要素で再確認するのが絶対です。

今回は、マルチシグやハードウォレットを使うにしても
署名を行うアプリなどで必須となる秘密鍵の扱についての提案です。

前回、秘密鍵を16進数表記ではなく、バイト配列という形でメモリ上に扱うべきという話をしました。
秘密鍵というのはとにかく目立つ形をしているのです。
悪いことを考えるやつなら、キーワード検索でぱっとひっかけることができるぐらいの手軽さです。
画面上に表示された情報をもとにツールを使って探索されることも多いので、
少し形を変えてやるだけでも、多少のハッキング防止効果は出てくると思います。

ここではさらに一歩すすめて、排他的論理和を用いて秘密鍵のバイト配列をそのままでは使用できないように変換する方法をご紹介します。
ビット演算の排他的論理和は２度繰り返すと元に戻るという性質があります。

[チート対策について考えてみる（メモリ改竄編）](https://qiita.com/Takezoh/items/991e431436d386b1347f)

もちろんそれを復元する鍵となるものが必要ですので、それはサービスプロバイダーがサーバに保管しておくなりなんなりする必要があります。
今回は公開鍵を用います。


```js:XOR検証

var privateKeyBytes = getChildKeyBytes(masterHash,networkId,"m/0");
var publicKeyBytes = hex2ua(account.publicKey.toString());

console.log(ua2hex(privateKeyBytes));

var masterSeed = Array();
for( var i = 0; i < privateKeyBytes.length; i++) {
  masterSeed.push(privateKeyBytes[i] ^ publicKeyBytes[i]);
}

let masterKeyBytes = Array();
for( var i = 0; i < masterSeed.length; i++) {

	masterKeyBytes.push(masterSeed[i] ^ publicKeyBytes[i]);
}


console.log(ua2hex(masterKeyBytes));

//16進数に変換
var ua2hex = function ua2hex(ua) {
    var s = '';
    for (var i = 0; i < ua.length; i++) {
        var code = ua[i];
        s += _hexEncodeArray[code >>> 4];
        s += _hexEncodeArray[code & 0x0F];
    }
    return s;
};

//バイト配列に変換
var hex2ua = function hex2ua(hexx) {
    var hex = hexx.toString(); //force conversion
    var ua = new Uint8Array(hex.length / 2);
    for (var i = 0; i < hex.length; i += 2) {
        ua[i / 2] = parseInt(hex.substr(i, 2), 16);
    }
    return ua;
};


```

まず、バイト配列化した秘密鍵と公開鍵を準備します。（privateKeyBytes , publicKeyBytes ）
マスターシードとして、それぞれの配列に対して排他的論理和をとり、それをマスターシードの配列に詰め込んでいきます。
これでマスターシードの完成です。簡単ですね。
同一セッション上の簡単な権限管理はこの値を持って認証するようにして、わざわざ秘密鍵を確認しないようにします。

再び秘密鍵を取り出したい場合は、さいどマスターシードのバイト配列に公開鍵の排他的論理和を取っていきます。
最後に16進数表示にすれば、同じ秘密鍵が復元できたことが確認できるでしょう。
一部分のCommitだけをMergeする（cherry-pick）

#初めに
「特定のコミットだけ反映したいな」と思って調べたのがきっかけです。

#cherry-pickとは？
他ブランチの特定コミットのみを反映されることができるコマンドです。

#使い方
まずはmergeしたいcommitをlogから探します。

```
$　git log

commit 84501365f61d8556c67faa0743b8012113b44d51
Merge: a3b2851 21e52cf
Author: 〜
Date:   Fri Dec 28 13:28:01 2018 +0900

    Merge color&size method

commit 21e52cfeb31d1522642db008ddedfed49aa88a5b
Author: 〜
Date:   Fri Dec 28 13:25:17 2018 +0900
```

その後、cherry-pickします。

```
$　git cherry-pick 84501365f61d8556c67faa0743b8012113b44d51
```

以上です。

また、私のメモ書きのようなものなので参考になるかわかりませんが、誰かの為になったら嬉しいです。
WordPress の管理画面にタグ絞り込み機能を追加する。

WordPress の管理画面の投稿や固定ページ一覧は日付で記事を絞り込む機能はありますがタグで絞り込む機能が無いので、記事の数が増えてくると探すだけでも苦労します。

ということでタグで絞り込むためのコードを探してみたところドンピシャで紹介してくれているサイトを見つけました。

【寝ログ】WordPress管理画面の投稿一覧に「タグ」と「投稿者」での絞り込み機能を追加するカスタマイズ方法
[https://nelog.jp/custmuize-restrict-manage-posts]

```
//投稿一覧リストの上にタグフィルターと管理者フィルターを追加する
function custmuize_restrict_manage_posts_exsample(){
  global $post_type, $tag;
  if ( is_object_in_taxonomy( $post_type, 'post_tag' ) ) {
    $dropdown_options = array(
      'show_option_all' => get_taxonomy( 'post_tag' )->labels->all_items,
      'hide_empty' => 0,
      'hierarchical' => 1,
      'show_count' => 0,
      'orderby' => 'name',
      'selected' => $tag,
      'name' => 'tag',
      'taxonomy' => 'post_tag',
      'value_field' => 'slug'
    );
    wp_dropdown_categories( $dropdown_options );
  }
 
  wp_dropdown_users(
    array(
      'show_option_all' => 'すべてのユーザー',
      'name' => 'author'
    )
  );
}
add_action('restrict_manage_posts', 'custmuize_restrict_manage_posts_exsample');
 
//投稿一覧で「全てのタグ」選択時は$_GET['tag']をセットしない
function custmuize_load_edit_php_exsample(){
  if (isset($_GET['tag']) && '0' === $_GET['tag']) {
    unset ($_GET['tag']);
  }
}
add_action('load-edit.php', 'custmuize_load_edit_php_exsample');
```

こちらのサンプルコードではユーザーでの絞り込みもできるようになっていますが、不要であれば19～24行目の

```
  wp_dropdown_users(
    array(
      'show_option_all' => 'すべてのユーザー',
      'name' => 'author'
    )
  );
```
のコードは削除してもかまいません。

ちなみにこちら、絞り込んだ後にまた別のタグを選んで絞り込みをするとエラーが発生します。

どうやら post_type のパラメータが正しくないようで、自分の場合は固定ページでだけこの機能を使うので

```
wp_dropdown_categories( $dropdown_options );
```

の次の行に

```
echo '<input type="hidden" name="post_type" value="page">';
```

を追加して post_type のパラメータを設定することで解決できます。value の値は固定ページの場合は `page`、投稿の場合は 'post'、カスタム投稿タイプの場合はそれに応じた名前を設定することで対応ができます。