OmniAICreator/Qiita-1.07M huggingface dataset:
PowerApps でPCでも使えるバーコード スキャナーを追加する

[PowerApps のアプリにバーコード読み取り機能を追加する](https://qiita.com/afujie/items/6d329662f559806b74ca) の番外編です。
スマートフォンで使えるバーコード スキャナーは読み取りが早く使い勝手も良いのですが、パソコンでは使えません。
パソコンのカメラを使いたい時は、Webバーコード スキャナーが利用できます。

# Web バーコード スキャナー
元々あったバーコード コントロールが Web バーコード スキャナーと名前変わったそうです。
(参考: [PowerApps でバーコードをスキャンする](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/scan-barcode))

# Web バーコード スキャナーの有効化
Web バーコード スキャナーは、実験的な機能として無効化されています。今後、**使えなくなる可能性もありますので自己責任で使用する**事になります。
以下の手順で、[挿入]-[メディア]メニューに[Web バーコード スキャナー]が追加されます。

## コントロールの有効化手順
1. アプリの編集画面を開く
2. [ファイル]-[アプリの設定]メニューを順にクリック
3. アプリの設定画面で[詳細設定]タブをクリック
4. 実験的な機能 セクションの [Web バーコード スキャナー]をオンにする

# バーコード読み取り画面を作る
バーコードを読み取ってその後の処理を実行する画面を作成します。ここでは座席情報を登録します。

<img width="321" alt="スクリーンショット 2019-02-24 17.52.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/184453/c6459941-f8fd-e297-3820-12a23a897529.png">

## 1. 新しい画面を作成
1. アプリの編集画面を開く
2. [挿入]メニューをクリック
3. [新しい画面]-[フォーム]の順にクリック
4. 画面ツリーでScreen1(数値は変わります)の名前を変更 (ここでは BarcodeScreen)
5. 画面ツリーでEditForm4(数値は変わります)を削除
6. 画面ツリーでLblAppName9（数値は変わります)のクリックしてプロパティのテキストを変更(ここでは座席バーコード スキャン)

## 2. Web バーコード スキャナーを追加
1. [メディア]-[Web バーコード スキャナー]をクリック
2. 追加されたコントロールの位置を調整
3. プロパティのバーコードのタイプを使用するバーコードに合わせる

## 3. テキスト ボックスを追加
1. [テキスト]-[テキスト入力]の順にクリック
2. 追加されたコントロールの位置を調整
3. 数式バーで[Default]にバーコードの値を参照する様に設定
    
```PowerApps:Default
Barcode1.Text
```
## 4. バーコード 読み取り後の処理を設定
1. 画面ツリーでIconAccept4(数値は変わります)をクリック
2. 数式バーで[OnSelect]に処理を設定
       
```PowerApps:OnSelect
If (IsMatch(TextInput1.Text, "DESK[1-2]-[A-B][1-4]"), 'PowerApp->複数の項目の取得'.Run(User().Email, TextInput1.Text);Navigate(BrowseScreenFloor, ScreenTransition.None);Refresh(Floor), Notify("NG: " & TextInput1.Text, NotificationType.Error))
```

## 5. キャンセル ボタンを設定
1. 画面ツリーでIconCancel4(数値は変わります)をクリック
2. 数式バーで[OnSelect]に初期画面への遷移を追加

```PowerApps:OnSelect
Navigate(BrowseScreenFloor, ScreenTransition.None)
```

## 6. 初期画面にバーコード 読み取り画面ボタンを追加
1. 画面ツリーで初期画面のBrowseScreenFloorをクリック
2. [アイコン]をクリックして適切なアイコンを選んでクリック
3. 追加されたアイコンの位置を調整
4. 数式バーで[OnSelect]にバーコード読み取り画面への遷移を追加

```PowerApps:OnSelect
Navigate(BarcodeScreen1, ScreenTransition.None)
```

# 今回わかったこと
* PowerApps
    * Web バーコード スキャナーを使う時は設定で有効化する必要がある。
    * スマートフォン用のバーコード スキャナーの使いやすさを実感した。

2in1 ノート パソコンを使っている人もいると思いますが、パソコンでバーコードを活用したい人は少ないのだろうか？
Laravelのmigrate:rollbackについて

過去ブログのQiitaへの移転シリーズ第３弾、今回は[この記事](https://yk0807.com/larablog/posts/1)を移転しようと思うのですが、記事を書いたのが2年５ヶ月も前のことで、当時はLaravel5.3だったのが今（2019年2月時点）や5.7、本当時が過ぎるのは早い・・・
とりあえず、[ここ](https://readouble.com/laravel/5.7/ja/migrations.html)を参考に相違点に気をつけつつ記事をアップしてみようと思います。

当時在籍していた会社の勉強会で、Laravel5.2から5.3になって気をつけることというテーマで発表したのですが、そのときに5.3ではmigrateのrollbackでステップ数が指定できるという話題がありました。
これはどういうことかというと、5.2まではmigrate:rollbackと打つと最後にmigrateを行う前の状態に戻るというものでした。
つまり、最後にA,B,Cの3つをmigrateした後にrollbackするとA,B,Cが元に戻る（正確にはdownメソッドにupと逆の処理を書くことによって、downメソッドが呼ばれて元に戻る）ことになるわけです。
つまり、今まではA,B,CのうちCだけを取り消すということはできなかったわけです（migrationテーブルのbatch絡むを書き換えればできるようにはなりますが）。

それが、5.3以降では

```
php artisan migrate:rollback --step=1
```

とすることでCだけを取り消すことができるようになりました。 これも、より正確に言うと、migrationファイルは作ったときにファイル名の頭にタイムスタンプがついて（php artisan make:migration testと打つと2016_09_30_153344_test.phpというファイルが作られる）、それを昇順に並べて一番最後にくるものが取り消されるわけです。

また、他にも最初にA,B,Cをmigrateした後にD,Eをmigrateした状態でrollbackするとD,Eだけが元に戻るのですが、

```
php artisan migrate:rollback --step=4
```

とやるとB,C,D,Eを元に戻すということもできたりします。
![201708161135_migration.png](https://qiita-image-store.s3.amazonaws.com/0/66360/d485aead-bbf6-39cc-a973-b06f0b309b11.png)

つまり、migrationテーブルはこんな感じになっていて、

```
php artisan migrate:rollback
```
だけだとbatchカラムの値が一番大きいもの全てをロールバックするのですが、

```
php artisan migrate:rollback --step=*
```
だと、migrationカラムについて降順に*個をロールバックするわけですね。

とはいえ、rollback機能は便利な時もありますが、イレギュラーな処理であるのも確かなので、あまり行わずに済むよう正確に作業をするのが一番いいですね。

後、rollbackから離れて上の画像の2016_0601*_createoauth*_tableというものが5つあります。これらはLaravel Passport （OAuth2という認証周りのサービス）をインストールした後でmigrateしたときにできるのですが、これらのmigrationファイルは、database/migrationsの中にはありません。 vendor/laravel/passport/database/migrationsにあったりします。実際このファイルをいじることは滅多にないと思いますが（というより、よほどの理由がない場合vendor配下のファイルをいじるのは禁じ手のはず）。
ちなみに、Laravel Passportを使う場合は

```
composer require laravel/passport
```
でPassportをインストールする必要があります。この辺も使って見たかったけど、今まで使う気配はなかったので、就職活動中のこの機会に勉強してみようかな。

と、ここまでアップしながら[5.3](https://readouble.com/laravel/5.3/ja/migrations.html)と[5.7](https://readouble.com/laravel/5.7/ja/migrations.html)のロールバック周りで変わったところがないかざっと見てみましたが、ロールバック周りでは5.3以降で特に変わったところはなさそうです。

# 2020/12/30追記
ありがたいことにそこそこのいいね(LGTM)をいただいているので、少し記事をアップデートして見ます。
Laravelから離れて2年近くになっていますが、その間にLaravelのバージョンが[8.x](https://readouble.com/laravel/8.x/ja/)まで進化しているんですね・・・（驚き）
で、[マイグレーション周り](https://readouble.com/laravel/8.x/ja/migrations.html)はどうなったか調べてみると、

```
php artisan schema:dump
```
でマイグレーションを単一のSQLファイルに圧縮することとかができるようになったんですね。これはなかなか便利かも。

あとは、

```
php artisan migrate:fresh
```
で全てのテーブルを削除した後にマイグレーションを行うことができるようになっていますね。環境を1から作り直すときなんかでもしかしたら使う機会はあるかも。

現在の自分の主戦場はLaravelでなくSpringBootなので、Flywayでのマイグレーションについてもいつか記事にしてみようかと。
後は、来年の目標として個人で簡単なWebサービスを作ってみようと思っているので、それをSpringBootでやるかLaravelでやるか迷っていて、LaravelでやるとしたらLaravel関連の記事をアップする機会が増えるかも。
私も画像が投稿できるWebアプリを作りたい。その4（最後）

#1.ページに画像を投稿できるボタンを作るぞ。

要約 : newとeditのhtml.erbに↓を書く

app/views/posts/new.html.erbと
app/views/posts/edit.html.erbの
「form」の中に
↓を書く。

```HTML:

 <%= form.label :写真をアップするぞ %>
　　　　　　　　　　①
 <%= form.file_field :image %>
　　　　　　　　　　　　　②
```

①「何をするのか名前を書いてあげる」と親切
②ページを見ると、写真をアップする画面になってます。

showは詳細画面

```HTML:app/views/posts/show.html.erb
<%= image_tag, @post.image.url %>
```
JQueryで指定したDOM要素の取得・書き換え

## この記事について

この記事ではセレクタで指定したDOM要素を以下のメソッドを使って操作する。

## 利用するメソッド
以下を利用する

```
text()
→指定したDOM要素のコンテンツを書き換える
html()
→指定したDOM要素のHTMLを変更する
val()
→VALUE属性を取得する
remove()
→指定したDOM要素を消す
empty()
→指定したDOM要素のコンテンツを消す
```

## サンプルコード

上記のメソッドを使ってDOM要素を操作する

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
  <a href="hogehoge.com" data-sitename="googleのサイト">googleリンク</a>
  <script>
    $(function(){
      $('a').text('hello!');
    });
  </script>
</body>
</html>
//googleリンクからhello!にテキストが変更される
```

```html:sample.html
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
  <a href="hogehoge.com" data-sitename="googleのサイト">googleリンク</a>
  <script>
    $(function(){
      $('a').html('<h1>h1要素に変更<h1>');
    });
  </script>
</body>
</html>
//h１要素に変更される
```

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
  <form method="post">
    <input type="text" value="hogehoge">
  </form>
  <script>
    $(function(){
      console.log($('input').val());
    });
  </script>
</body>
</html>
//input要素のvalueを取得して、コンソールで表示
```

```html:sample.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
  <form method="post">
    <input type="text" value="hogehoge">
  </form>
  <script>
    $(function(){
      $('input').remove();
    })
  </script>
</body>
</html>
//input要素を消すので何も表示されない
```
```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
    <p>hogehoge</p>
  <script>
    $(function(){
      $('p').empty();
    })
  </script>
</body>
</html>

//p要素は消えていないが、hogehogeというテキストが消えている状態
```
Udemyでwebpackを1日で習得！を受講

# Udemyでwebpackを学ぶ
Udemyを利用してwebpackを学びました。


![認定証](https://udemy-certificate.s3.amazonaws.com/image/UC-9T9KHUT6.jpg?l=null "認定証")

受講しようとした動機は、wordpressのオリジナルテーマを作ろと思いbootstrapを使おうとしたらどうやらsassを使った方がよさそう。
でも使うにしてもgulpとかのタスクランナーを学ぶのも考えましたが、Reactなども今後使うとなるとwebpackの方がよさそうということでこれを学習しました。

# 学んだこと

このコースで学ぶ内容としては、下記のwebpackconfig.jsファイルを見れば俯瞰することが出来ます。

```
const path = require('path');
const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

const outputPath = path.resolve(__dirname, 'dist');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: outputPath,
  },
  module: {
    rules: [
      {
        enfore: 'pre',
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
      },
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      },
      {
        test: /\.(sc|c)ss$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          'sass-loader',
        ],
      },
      {
        test: /\.(jpe?g|png|gif|svg|ico)$/i,
        loader: 'url-loader',
        options: {
          limit: 2048,
          name: './images/[name].[ext]',
        },
      },
      {
        test: /\.html$/,
        loader: 'html-loader',
      },
    ],
  },
  devServer: {
    contentBase: outputPath,
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: './src/index.html',
      filename: './index.html',
    }),
    new MiniCssExtractPlugin({
      filename: '[name].[hash].css',
    }),
  ],
  optimization: {
    minimizer: [new UglifyJsPlugin({
      uglifyOptions: {
        compress: {
          drop_console: true,
        },
      },
    }),
    new OptimizeCSSAssetsPlugin({}),
    ],
  },
  devtool: 'eval-source-map',
};
```

学びたかったsassの使い方も学ぶことが出来ました。
最後の方ではreactの環境こうくも学ぶことが出来たので今度、時間ができたらreactにも挑戦しようと思います。
Roadmap というサービスを写経する

# はじめに

最近、フロントの勉強していますか？ してねえ！！
ということで、勉強半分でいい感じのサービスの UI とシステムを真似て作るということを始める。

# ルール

写経すると言っても、サービスを写経したらもはや独立して売り出せば良いので、落とし所をつける。
そもそも完コピなど不可能！ 

ちなみに写経と言ってもソースコードは公開されていないので、 devtool 見ながら中身を予想しながら作り直す。一種のリバースエンジニアリング。
なので写経とは違うのかもしれないなぁ。。。

以下自分ルール

```
- なるべく UI 部分 (CSS) は真似る
- 使いずらいと思ったところは一工夫する
- コアな部分以外は雑に作る
- リファクタなどはしない。とりあえず作る。
```

# 今回お世話になる素晴らしいサービス

ということで、今回は [Roadmap](https://onroadmap.com/) というタスク管理ツールを理解する。

## どこが凄いのか

以下羅列

```
- シンプルなのにわかりやすい UI
- タスクと時系列、そしてマイルストーンの管理全てを行える最高の UI/UX
- これを元に、より特殊なソリューションを行おうとした時のポテンシャルの高さ
- 直感的なタスクの生成方法
- etc
```

みたいなのが主です。もっと書けばあります。
言えることは、素晴らしいサービスだなと思いました。

特に素晴らしいのが、 task の生成部分、これだよ、これが欲しかったんや。みたいな
なのでそこを作る
社内システムに転用したいので、タスクに時間を入力する項目を入れる(あんまし意味はないが雰囲気)。

## 作った

サイト: https://roadmap-stydy-lotdgirefy.now.sh/
本当に雑レポジトリ: https://github.com/monpy/roadmap-study

## 主に作った部分

- タスク生成、編集、移動
- グループのUI
- カレンダーっぽい UI

## 本家と違うところ

- 左側に日付などを伸ばせるところ
- グリッドな操作感を与えた、話した結果どっちになるかどうかわからないのは個人的に好きではなかった。
- scrollSync の部分をライブラリ利用した

## 作った感想

- 見た目はシンプルなのに、考えることが多かった。
- シンプルが一番大変ってことだよな〜
- そもそもの DOM の構造を理解するのに時間がかかった。このほうがいいじゃん、と思って作ると実はダメで本家があのような構造にしている理由がなんとなく理解できる。
- React hooks を今回初めて使った。使いやすい印象を受けたけど、雑に使うとすぐにやばい感じにな-る。逆にやばい感じに気付きやすい構造になるので個人的にはありがたい。
- 早くこういうのを利用したサービスを作りたい。個人で作るのか？
- こういうのをやろうとした時に データ構造を考える力が足りない。ここはバックエンドの人にペアプロとか頼みたいな。
- materialUI の Modal コンポーネント便利〜。

## 最後に

お仕事募集中〜
Scala PlayFrameworkにおいてのbuild.sbtの備忘録

##備忘録
build.sbtの設定にかなりの時間を費やしたため残しておきます。
DBドライバとしてh2を使用しています。また、データベースアクセッサライブラリとしてScalikeJdbcを使用しています。また、マイグレーションツールとしてEvolutionを使用しています。同じ環境の方は是非参照してみてください。
また、下記のURLでScala-PlayFrameworkでJSON APIを書いています。まだまだ、更新中ですが是非。
https://github.com/fujisawaryohei/play_practice


```scala

name := "scala_practice"

version := "1.0-SNAPSHOT"

lazy val practice = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.12.6"

lazy val defaultDependencies = {
  val scalikeJdbcDependencies = {
    val scalikeJdbcVersion = "3.2.3"
    List(
      "org.scalikejdbc" %% "scalikejdbc"        % scalikeJdbcVersion,
      "org.scalikejdbc" %% "scalikejdbc-config" % scalikeJdbcVersion,
      "org.scalikejdbc" %% "scalikejdbc-play-initializer" % "2.6.0-scalikejdbc-3.2"
    )
  }

  List(
    evolutions, jdbc, guice,
    "com.h2database"  %  "h2"                 % "1.4.197",
    "ch.qos.logback"  %  "logback-classic"    % "1.2.+",
    "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test
  ) ++ scalikeJdbcDependencies
}

libraryDependencies ++= defaultDependencies

// sbt scalafmtでコードフォーマット
scalafmtConfig := Some(file(".scalafmt.conf"))
scalafmtOnCompile := true // compile時に自動でコードフォーマット

```
はじめてのC++


#はじめに
ロベールのC++を始めるのでこのサイトを使ってまとめを書こうと思う。
## 目標
3月3日までに読み終えたい。

序章はとばすかも

##C++を学ぶ理由
ゲームが作りたいから。
UE4と同時並行で学習していく。
gradsのrank colorを設定する。最小ランクを白(背景色)に。

#sample code :: plot.ge ;; exec plot.ge(return)
set clevs 0.7 0.80 0.82 0.84 0.86 0.88 0.9 0.92 0.94 0.96 0.98
set ccols 0 9 14 4 5 13 3 12 7 8 2 6
*plot date-time
draw string 2.2 7.9 2015040800

![thetae.png](https://qiita-image-store.s3.amazonaws.com/0/366114/556221f9-758e-f485-e3ed-90228f106507.png)
リーダブルコードを読んでの備忘録

プログラミング経験としてはほぼ未経験レベルだが、仕事がらコードレビューを行わなければならなくなった。
どういうところを気にしてレビューした方がいいのかわからなかったため、ググって参考になる本はないか探したところ「リーダブルコード」という本を見つけた。
そこで、学んだことを備忘録として書きます。

#名前に情報を詰め込む
・名前を見て情報が読み取れるようにする。

・時間やバイト数を計測するものであれば、変数名に単位を入れる。

```sample:sample
　#現在時刻をミリ秒で計測する
　❌var start    = (new Date()).getTime();
　⭕️var start_ms = (new Date()).getTime(); //ミリ秒とわかるように_msを入れる
```

・「コンストラクタ」(newを使われる関数)は大文字ではじめ、通常の関数は、小文字ではじめる。

```sample:sample
var x = new DatePicker(); //コンストラクタ
var y = new pageHeight(); //通常の関数
```
#誤解されない名前
・限界値を含める時はmin、maxを使用する。

```sample:sample
MIN_ITEMS_IN_CART = 10
MAX_ITEMS_IN_CART = 10
```
・範囲を指定する時はfirst、lastを使用する。

・包含・排他的範囲にはbegin、endを使用する。

・ブール値だとわかるようにis、has、can、shouldを使い、
　否定形(例えば、disable_ssl)などは避ける。
#美しさ
・コードの「列」を整列すれば、概要を把握しやすくなる

```sample:sample
detail   = request.Post.get('details');
location = request.Post.get('location');
url      = request.Post.get('location');
```
・意味のある順番を選び、常にその順番を守る。

・空行を使って大きなブロックを論理的な「段落」に分ける。

#コメントすべきことを知る
###コメントすべきでは「ない」こと
・コードからすぐに抽出できること

・ひどいコードを補うコメントを書くのではなく、コードを修正する。

###コメントすべきこと
・なぜコードが他のやり方ではなくこうなっているのか。

・定数をこの値にした背景。

・コードの欠陥にはコメントをつける。
例えば下図のような感じ

| 記法 | 典型的な意味 |
|:-----------|:---------|
| TODO:|あとで手をつける |
| FIXMI:|既知の不具合があるコード|
| HACK:|あまり綺麗じゃないけど解決策|
| XXX:|危険！大きな問題あり| 
・コードを読んだ人が「えっ？」って思うところを予想してコメントをつける。

・ファイルやクラスには「全体像」のコメントを書く。
S3へファイルをアップロードするためのナニカ


なんか使いそうだったので、検証として
S3へアップロードする際にセットアップも含めなるべく工数を掛けないで作業できそうなものを作ってみた。


＜準備＞
何はなくともboto3は必要。

    pip install boto3

<コード>
・credentialsを作らない動かす

```py
import boto3
from boto3.session import Session

session = Session(aws_access_key_id='<ACCESS KEY>',
                  aws_secret_access_key='<SECRET KEY>')

s3 = session.resource('s3')
for bucket in s3.buckets.all():
    print(bucket.name)

# バケット名
AWS_S3_BUCKET_NAME = '<BUCKET_NAME>'
bucket = s3.Bucket(AWS_S3_BUCKET_NAME)
print("bucket.name : {}".format(bucket.name))

PUT_OBJECT_KEY_NAME = '<OBJECT NAME>'
obj = bucket.Object(PUT_OBJECT_KEY_NAME)

upload_file_path = r"<UPLOAD FILE PATH>"

print("upload_file_path : {}".format(upload_file_path))
print("OBJECT_NAME : {}".format(PUT_OBJECT_KEY_NAME))
print("upload_file Start")
bucket.upload_file(upload_file_path, PUT_OBJECT_KEY_NAME)
    print("upload_file Completed")
```

わりと簡単にアップロードできた。
本当はcredentialsのファイルなどを作ったほうが管理は楽なんだろうけども、
運用端末などでセッティングが運用者にわからない場合を考えると、見えるところにあるConfigファイルなどに記載させておく方が楽だったりするケースがあるという考慮。あと、**「インストール」**はしたくないというわけのわからないことを言い出す人もいるし。。

## 検証のみおわる
検証としてやってみたのはよかったが、
最終的には使わなかったのでここにメモとして残しておくことにした。
なので、これを実運用で使ったらどうなるかは未検証。
[python]リスト内の辞書に対して特定の項目でソートする


# 辞書をリスト内に格納し、その辞書内の特定の項目でソートしたい

タイトルだけだとわかりにくいかもしれない。  
以下のようなデータがあるとする

```
list_DicInfo = [{value_A:15.13, id:1, value_B:10, value_C:29},
                {value_A:10.61, id:2, value_B:20, value_C:30},
                {value_A:20.31, id:3, value_C:30, value_C:40}]
```
このリストをvalue_Aの値でソートしたいということ。

調べてみると**lambda**と**sorted**を使用するとワンラインでシンプルに実現っぽい

こんな感じ

```
sorted_info = sorted(list_DicInfo, key=lambda x:x['value_A'])
```
lambdaでvalue_Aのリストをぶっこぬいてきて、それをつかってソートしているということになる。

で、結果として以下のようなオブジェクトが生成される

```
[{value_A:10.61, id:2, value_B:20, value_C:30},
 {value_A:15.13, id:1, value_B:10, value_C:29},
 {value_A:20.31, id:3, value_C:30, value_C:40}]
```

もともとのオブジェクトを維持する必要がないのであれば、sortedではなくsortを使用してもOK

## 参考
[ソート HOW TO](https://docs.python.jp/3/howto/sorting.html)
[Pythonで辞書のリストを特定のキーの値に従ってソート](https://note.nkmk.me/python-dict-list-sort/)

## WIL
先日Qiita内の[この記事](https://qiita.com/sitmk/items/239335b4ed0c3c797add)で知ったTILという概念。
Today単位でアウトプットするのは時間的に厳しいので勝手に**WIL**ということで書いていってみる
Serverless framework + API Gateway + Lambda で `--stage` の値を判別してステージング環境に基本認証

Serverless framework を使うと `sls deploy --stage production` とか `sls deploy --stage staging` みたいな感じで、本番とステージングを切り替えてデプロイするが、この `--stage` の値を判別してステージングへのデプロイだけ基本認証をかけるやり方。

## serverless.yml

```yaml:serverless.yml
functions:
  app:
    handler: handler.app
    events: ${self:custom.events.${opt:stage,'staging'}}
  authorizer:
    handler: lib/authorizer.handler


resources:
  Resources:
    GatewayResponse:
      Type: 'AWS::ApiGateway::GatewayResponse'
      Properties:
        ResponseParameters:
          gatewayresponse.header.WWW-Authenticate: "'Basic'"
        ResponseType: UNAUTHORIZED
        RestApiId:
          Ref: 'ApiGatewayRestApi'
        StatusCode: '401'

custom:
  events:
    production:
      - http:
          path: /
          method: get
      - http:
          path: /{any+}
          method: get
    staging:
      - http:
          path: /
          method: get
          authorizer:
            name: authorizer
            resultTtlInSeconds: 0
            identitySource: method.request.header.Authorization
            type: request
      - http:
          path: /{any+}
          method: get
          authorizer:
            name: authorizer
            resultTtlInSeconds: 0
            identitySource: method.request.header.Authorization
            type: request

```

* `functions.app.events` の値 `${self:custom.events.${opt:stage,'staging'}}` は、下にある `custom.events.*` の値を読み込むための記述。
* `functions.authorizer` には認証用のハンドラを指定する。ハンドラの処理は後述。
* `resources.Resources.GatewayResponse` 以下の記述は基本認証を行うためのレスポンスヘッダーを返すための設定。
* `custom` 以下の記述は URL の設定及び基本認証を行うためのカスタムオーソライザーの設定。

## 認証用ハンドラ

```javascript
'use strict';

exports.handler = (event, context, callback) => {
  const authorizationHeader = event.headers.Authorization

  if (!authorizationHeader) return callback('Unauthorized')

  const encodedCreds = authorizationHeader.split(' ')[1]
  const plainCreds = (new Buffer(encodedCreds, 'base64')).toString().split(':')
  const username = plainCreds[0]
  const password = plainCreds[1]

  if (!(username === 'admin' && password === 'secret')) return callback('Unauthorized')

  const authResponse = buildAllowAllPolicy(event, username);
  callback(null, authResponse)
}

const buildAllowAllPolicy = (event, principalId) => {
  const tmp = event.methodArn.split(':')
  const apiGatewayArnTmp = tmp[5].split('/')
  const awsAccountId = tmp[4]
  const awsRegion = tmp[3]
  const restApiId = apiGatewayArnTmp[0]
  const stage = apiGatewayArnTmp[1]
  const apiArn = `arn:aws:execute-api:${awsRegion}:${awsAccountId}:${restApiId}/${stage}/*/*`
  const policy = {
    principalId: principalId,
    policyDocument: {
      Version: '2012-10-17',
      Statement: [
        {
          Action: 'execute-api:Invoke',
          Effect: 'Allow',
          Resource: [apiArn]
        }
      ]
    }
  }
  return policy
}
```

ソースコードは以下の記事を参考にしました。

https://medium.com/@Da_vidgf/http-basic-auth-with-api-gateway-and-serverless-5ae14ad0a270

ユーザー名は `admin`、パスワードは `secret` で、ソースコード内に決め打ちで入ってますので注意。
pandasとitertoolsのgroupby速度の比較

# 始めに
pandasのgroupbyは非常に遅い。特にデータが大きくなると1分かかる等ざらである。
そんな負をpythonのデフォルトライブラリであるitertoolsを使う事で速度改善を図れないかを検証する。

##流れ
筆者は基本的にpandasとitertoolsと比較したときにpandasが全ての条件で劣るとは考えていない。
そのため、groupbyを行ううえで関係しそうなパラメータをいくつか考える。

1.データの行数
2.groupbyキーのユニークな数
　（例えばgroupbyで指定したキーに1, 10, 1, 11しか存在しないとき、3となる）
3.groupbyキーの数

上記を適宜変更していき、pandasとitertoolsの速度比較を行う。

## 比較コード

```pandas.py
from time import time
import pandas as pd

def pandas_groupby(data, groupby_key):
    start=time()
    temp=[row for i,row in data.groupby(by=groupby_key)]
    return time()-start, temp

```

```itertools.py
from time import time
from operator import itemgetter
import itertools as it


def iter_groupby(data, args):
    start=time()
    cols=data.columns
    array=data.values
    key_func=itemgetter(*args)
    array = sorted(array, key=key_func)
    temp = [list(g) for k, g in it.groupby(array, key=key_func)]
    return time()-start, temp
```

## 実験

```experiment.py

dfs={}
for key_num in range(1,4):
    pa_time=[]
    li_time=[]
    kumiawase=[]
    groupby_num=[]
    for i in range(1,6):
        row_num=10**i
        for j in range(1,6):
            generate_range=10**j
            data = pd.DataFrame(np.random.randint( 1, generate_range, (row_num, key_num)))
            times, ret=pandas_groupby(data,[ii for ii in range(key_num)])
            pa_time.append(times)

            times, ret2=iter_groupby(data, [ii for ii in range(key_num)])
            li_time.append(times)
            groupby_num.append(len(ret))
            kumiawase.append((row_num, generate_range))
    df=pd.DataFrame([pa_time,li_time,kumiawase, groupby_num]).T
    df=df.rename(columns={0:"pandas", 1:"iter", 2:"kumi",3:"groupby_num"})
    dfs[key_num]=df
```

上記コードで
1.データの行数(10~10^5まで10倍ずつ)
2.groupbyキーのユニークな数(10~10^5まで10倍ずつ　のgroupbyキーの数乗)
3.groupbyキーの数(1~3まで1ずつ)
の範囲で比較を行った。

## 結果
![qiita1 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/178995/7b99fd94-5f7b-e233-66a7-a93573b27874.png)

速度差を比較したグラフである
縦軸がかかった時間、
横軸がデータの行数のlog(底は10)
<font color="Red">赤がpandas</font>
<font color="Blue">青がitertools</font>
を示している。
縦軸が全てのグラフで違うので注意してほしい（合わせると酷いことになるので許してほしい）

## 結論
itertoolsはpandasよりも大体早い。
特にデータ数が多くなるほどitertoolsとpandasの差は大きくなることが見て取れた。
グラフ化した全ての場合においてデータ数が10^5になると速度差は5倍を超えていた。
また、差はgroupbyキーのユニークな数が増えるとともにより顕著になっていくようだ。

今回はitertoolsで作ったものはpandasデータフレームのリストではなく、リストのリストである。
純粋にgroupbyだけitertoolsで行ってからpandasにするようなことをするとpandasの方が早くなってしまう。
そのため、ここで紹介した方法を使うときは後続の処理でpandasを使わなくてもよい場合、各groupbyを部分的に抽出して最後に一つのpandasデータフレームにするときなどに使うのが良いだろう。

## 最後に
こんな地味な速度改善なんて本当はしたくない。。。早くarrowsが出て全て速くしてほしい
色んな地味な高速化tipsが貯まってきたのでこれを機にちょくちょくメモ程度にgitにあげていこうと思う。
良ければ皆さんのtipsも載せていってもらえると嬉しい。

https://github.com/akikan/Fast_Pandas_Wrapper
元号：改元対応まとめ作成中

改元対応を分類する


# 元号対応が入出力に限定している場合

##内部計算はすべて西暦４桁で行っている場合


###和暦を数字１桁で対応している場合

入力数字部分は事前に作業ができる。出力の文字列は、元号が発表してから処理する。
条件分岐処理は

| 出力 | 入力文字 | 入力数字 |
|:--|:--|--:|
| 明治 | M | 1 |
| 大正 | T | 2 |
| 昭和 | S | 3 |
| 平成 | H | 4 |
| 新元号 |  | 5 |

###和暦をアルファベット１文字で対応している場合
新元号が決まるまで、入力値と出力文字が決定できない。


##内部計算はすべて西暦で行なっているが２桁の部品が残っている場合

2000年問題に対応する際に、年を数字４桁に変更せず、数字２桁のままで暫定対応した場合

##内部計算はすべて西暦で行なっているが、すべて２桁で行なっている場合

#元号対応が入出力に限定していない場合


##内部計算は西暦で行なっているが、各種条件分岐の判定に、和暦の条件が存在する場合

法令に基づく条件判断で、入出力まで外だしせずに、内部処理の中で和暦を用いている場合

##内部計算はすべて西暦４桁で行っている場合

#Unicode 337E,337D, 337C, 337B(CJK Compatibility)を使っている場合
CJK Compatibility
http://www.unicode.org/charts/PDF/U3300.pdf

337E:明治
337D:大正
337C:昭和
337B:平成

次の元号は

#参考資料
元号改正に伴う西暦-和暦変換の動作をPowerShellで試す
https://qiita.com/kazinoue/items/f42f231e42d85af6004a

IBM i 新元号/改元対応
https://qiita.com/6onoda/items/66f8f0fdf3be467987a4

Javaバージョン別の改元(新元号)対応まとめ
https://qiita.com/yamadamn/items/56e7370bae2ceaec55d5

Javaで新元号に対応する
https://qiita.com/nishim/items/7d55324b3da315257be5

元号対応に関するまとめ
https://qiita.com/tfukumori/items/1dc60eb473eff5efb994

【元号改正】和暦日付から日付オブジェクトへの変換仕様変更
https://qiita.com/chor_kai_chan/items/0d45b989803db89f2b19

マイクロソフトさん、お願いですから.NET Frameworkの動作を何の説明もなく変更するのはやめてください。- 改元対応で思うこと
https://qiita.com/gushwell/items/88411bb2c833e7d7ff6b

新元号（平成の次の元号）対応におけるMicrosoftのセミナー「新元号とマイクロソフト製品における対応」を受けてきました
https://qiita.com/You_name_is_YU/items/3f6f9825c2d1c97c5ea6


【新元号】改元のシステム改修で慌てるシステム屋は「無能」とのこと
https://qiita.com/KMKZ/items/7a530a127a438a13f333

改元というエンジニア泣かせのシステム変更に立ち向かう俺の備忘録
https://qiita.com/gitcho/items/b7f29abd2258727b69e4

改元はエンジニア泣かせではない。改元に対応せずに元号対応と言っているシステム屋がエセなだけ。

新元号に対応するために ICU を用いて和暦の動作確認をする
https://qiita.com/midheartty/items/590b0911c000a24abe34

MS-ACCESS の新元号「元年表記」対応
https://qiita.com/earthdiver1/items/4b3674ed496c500d6894

#文書履歴(document history)
ver. 0.01 初稿
ver. 0.02 337E,337D, 337C, 337B 追記 20190313
RoR｜RSpecでスタブを仕込んでみる

# はじめに

RSpecでスタブをはさんで必要な検証に集中する事があると思います。
現場で「例えばこうなんやで」とドヤ顔したいだけのメモ書きです。

# 前準備

本モデルに価格（`price`）があるとします。
カラムに価格（`price`）を持たせたいところですが、大人の事情でいろんなテーブルと結合して複雑な計算をします。利益率とかあるやん、しらんけど。

# モデル

税込価格を計算して返すメソッド`Book#price_in_tax`を考えてみましょう。

```ruby
class Book < ApplicationRecord
  def price_in_tax
    (price * 1.08).round
  end

  private

  def price
    # すごく時間のかかるややこしい処理
    # 他のテーブルとかと結合して、テスト用データを用意するだけで嫌になるやつ
  end
end
```

# テスト

価格は100円として、税込価格108円が得られるテストを書いてみましょう。
価格を取得するだけで相当めんどうなので、こういうときにスタブを利用すると便利です。

`Book#price_in_tax`は税込価格が得られることを検証したいことなのでスタブをはさんでシンプルにしても問題ないでしょう。

```ruby
require 'rails_helper'

RSpec.describe Book, type: :model do
  describe '#price_in_tax' do
    before do
      @book = Book.new
      allow(@book).to receive(:price).and_return(100)
    end

    it { expect(@book.price_in_tax).to eq(108) }
  end
end
```

# 気をつけていること

- 検証対象をスタブにしない

`Book#price_in_tax`をスタブにすると、都合のいい値しか返せないので税込価格が計算できてるとは限らない。

```ruby
require 'rails_helper'

RSpec.describe Book, type: :model do
  describe '#price_in_tax' do
    before do
      @book = Book.new
      allow(@book).to receive(:price_in_tax).and_return(108)
    end

    it { expect(@book.price_in_tax).to eq(108) }
  end
end
```

- 期待値の計算にスタブは利用しない

スタブのメソッドはあくまで検証に必要なもので、期待したものを得るための一部だから期待値の計算に利用するのは少し抵抗があります。

```ruby
require 'rails_helper'

RSpec.describe Book, type: :model do
  describe '#price_in_tax' do
    before do
      @book = Book.new
      allow(@book).to receive(:price).and_return(100)
    end

    it do
      price_in_tax = @book.send(:price) * 1.08
      # こちらのほうがいくぶんかまし
      # price_in_tax = 100 * 1.08
      expect(@book.price_in_tax).to eq(price_in_tax)
    end
  end
end
```
React NativeのOS別 height/widthの挙動解説

最近React Nativeに触り始め、OSごとに異なる画面やコンポーネントのheight/widthの挙動にやや苦しんだので、調べたことをまとめました。

## バージョン
React Native v0.58

## 前提
これから解説で使用する単語の定義は以下の通りです。

### Window height / Window width
React Native標準の`Dimensions`を使用し、以下のようなコードで取得できる値を指します。

```javascript
import {Dimensions} from 'react-native';
Dimensions.get('window').width; // Window width
Dimensions.get('window').height; // Window height
```

### Screen height / Screen width
React Native標準の`Dimensions`を使用し、以下のようなコードで取得できる値を指します。

```javascript
import {Dimensions} from 'react-native';
Dimensions.get('screen').width; // Screen width
Dimensions.get('screen').height; // Screen height
```

また、キーボード周りの挙動は、Androidの場合、AndroidManifest.xmlの設定値によって変化します。今回は設定を変更していないことを前提としています。詳しくは私のブログにあるので、興味があればご覧ください。

[【ReactNative】AndroidとiOSではキーボードが開いた時の挙動が違う - ゆるふわ技術日誌](https://yurufuwa-tech.hatenablog.com/entry/2019/02/23/004614)

## iOS
iOSの仕様は割と単純です。

<img width="375" alt="iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/20371/fafd6b02-218d-691d-9e91-447e9ee0b03b.png">

width/height共に、ScreenとWindowは同じ値を指します。

また、`StatusBar.currentHeight`を使用しても、**StatusBarの高さを取得することはできません。**

x = 0, y = 0の位置も画像上のOriginと書かれている位置になるので、適宜StatusBarを避ける処理をしてあげる必要があります。

そして、図のピンクで塗ってある領域は、`style`porpsに`{flex: 1}`を渡した場合のコンポーネントの領域を表しています。こちらもキーボードが展開しても変わらないため、キーボードに隠れないように、コンポーネントを配置したい場合には、そのようなライブラリを使うなり、自分でイベントハンドラを設定してやって、うまいことやってあげる必要があります。

## Android
曲者なのがAndroidです。

<img width="375" alt="Android.png" src="https://qiita-image-store.s3.amazonaws.com/0/20371/c4835b1f-80d3-7780-de22-d3a78f0ab509.png">

(SketchにAndroid用のパーツがなかったので図がお粗末ですが、なんとなく察してください。下の黒い領域はホームボタンや戻るボタンが出ている、あの領域です。察してください:bow:)

こちらはiOSとは異なり、WindowとScreenのheightが別の値を指します。

端的にまとめると、

- Screen heightは、物理的な画面の高さ
- Window heightは、ホームボタンのある領域を除いた画面の高さ

を返します。

そして、Androidでは、`StatusBar.currentHeight`が値を返します。また、この値は、**StatusBarを非表示にしている場合でも返ります。**

また、StatusBarが表示されている場合、x = 0, y = 0の位置は、画像上のOriginの位置になります。(非表示の場合は、物理的な画面の一番左上になります)
そのため、特にStatusBarを避けるような処理を自分で書く必要はありません。

最後に、`{flex: 1}`を指定した際の領域(画像上ピンクの塗りつぶし)ですが、Androidはキーボードを避けるように領域が縮みます。
そのため、キーボードを避ける処理を書く必要はありませんが、領域の大きさが変わっても表示が崩れないようなstyleを書いてあげる必要があると言えます。
(繰り返しになりますが、この挙動はAndroidManifest.xmlの設定によって変えることができます。詳しくは、前提セクションにあるブログ記事をご覧ください。)
Shinjuku.LT 2019-02-24

ここを発表内容のメモとする！

# 発表タイムテーブル作成自動化の話 [to4iki](https://twitter.com/to4iki)

slack botへタイトルと所要時間の目安を投げるとランダムで順番を決めてくれる。アイコンが可愛い。

- みんなで時間とタイトルを投げる
- 開始時間投げる
- 各人の開始時間と全体の終了時間まで決めてくれる！

# PDFアップロードを支える技術 [HonMarkHunt](https://twitter.com/HonMarkHunt)

* 3年間のスライドの蓄積もコミュニティの資産
* だが案外みんなアップロードしていなかったりする
* 合宿で色々作った中でPDF共有用のシステムを作った
* ログイン限定で見せられるようにスライドを保存できる！

* masterにforce pushしてはいけない

# ログイン作りました [kyusuke](https://twitter.com/8140i2865_3)

* これまた合宿で実装。Auth0との連携により実現されている。
* 使い方はkibelaにある。
* 「見られる人を軽く制限したいなー」ぐらいの制限なのでガチコンプラなスライドは置かないが吉

# 趣味アプリのデプロイについて [bakunyo](https://twitter.com/bakunyo)

* 趣味開発している[サービス](https://xn--0st94o12a.jp/)のデプロイに使っていたAWSとgithubへのpushの連携がディスコンしてしまった
* [GitHub Actions](https://github.com/features/actions)。現在限定オープンβ中
* githubへの操作をフックに他サービスとの連携ワークフローが作れる
* GUIで作れて定義はterraform形式。凄い。

# Shinjuku.LT管理画面を作ってきた [ftsan](https://twitter.com/futesi_nebusoku)

* 合宿の成果物
* https://mlab.com/ 無料分利用
* kyusuke氏好みっぽいNES風CSS
* パスワードとIDをgithubに上げない（きっちり変更済み）

# Shinjuku.LT サイトリプレース shimo

* 合宿成果物
* vue.js + vuetify
* UXの圧倒的向上 💪(˘ω˘💪)
* デザインが既にあったのでvuetifyが邪魔になっていた => 敢えて外すことで格段に実装効率が上がった

#エンジニア年収億越えPJ 

* タイトルの壮大さが凄い
* サッカー選手のような「移籍」市場があると技術者育成にメリットが生まれる
* 契約期間と年俸・移籍金・違約金（実際は移籍先が払う）の組み合わせ
* 契約の付帯事項等が複雑になりそうではある

# timetable-bot [to4iki](https://twitter.com/to4iki)

* 新宿LTは2016年開始。年月の経過はエモい。
* LTのCRUDとタイムテーブルの作成
* botkit + docker. ソース公開済み。
* 名言引用風の感想
* クリティカルパスの見通し大事
puppeteerを利用したWebページに対する同時アクセス

# はじめに
puppeteerを利用しパフォーマンステストを実施した際に、Node.jsはシングルスレッドなので同時アクセスを再現するためにマルチスレッド化する必要がありました。
今回は、node.jsの[Clusterモジュール](https://nodejs.org/api/cluster.html)を利用した同時アクセスの再現方法を記載したいと思います。

## 前提
- nodejsおよびpuppeteerはインストール済み

## マルチスレッド化

今回は動作確認用のexample.jsをマルチスレッド化してみたいと思います。
マルチスレッド化する前はこんな感じです。

   ```javascript:example.js
   const puppeteer = require('puppeteer');

   (async () => {
      const browser = await puppeteer.launch();
      const page = await browser.newPage();
      await page.goto('https://example.com');
      await page.screenshot({path: 'example.png'});

     await browser.close();
   })();
   ```

   マルチスレッド化したexample.jsはこんな感じになります。

   ```javascript:example_multi.js
   const cluster = require('cluster');
   const puppeteer = require('puppeteer');

   //コマンドライン引数で設定されたセッション数を取得
   var sessionNum = process.argv[2];

   if (cluster.isMaster){
     console.log(`Master ${process.pid} is running`);

     //セッション数に応じてワーカープロセスを起動
     for(let i = 0; i < sessionNum; i++){
       cluster.fork();
     }

     //exitイベントが発生したらワーカープロセスが終了したことを出力
     cluster.on('exit',(worker, code, signal) => {
       console.log(`worker ${worker.process.pid} dead`);
     });

   } else {

     (async () => {
       const browser = await puppeteer.launch();
       const page = await browser.newPage();
       await page.goto('https://example.com');
       await page.screenshot({path: 'example' + cluster.worker.id.toString() + '.png'});

       await browser.close();
       await process.exit(0);
     })();
   }  
   ```

## 確認

画像が5枚、連番で出力されればOK

```shell-session
node example_multi.js 5
```

処理時間が短いので、数秒しか表示されませんが指定したセッション数分プロセスが立ち上がっているか確認

```shell-session
sudo watch -n5 "ps aux | grep node"
```
「プロになるためのweb技術入門」を読んだ学びまとめ

##はじめに
Rubyやrailsなどの知識以前に前提のWebに関わる知識を身に付ける必要性を感じるようになってきました。
ということで、おすすめされていた「プロになるためのweb技術入門」という本を読みました。
わかりやすく書かれていたので、内容のアウトプットの意味を込めてここに共有します。

##プロになるためのweb技術入門で学んだこと
###Lesson1:Webアプリケーションとは何か
・デスクトップアプリケーション
=>代表例はWord,Excel等。主な処理は手元のPCで行われる。画面はOSの機能を使用して表示される。アプリケーションをPCへインストールする必要性がある。
・WEBアプリケーション
=>主な処理はサーバ上で行われる。画面はWebブラウザ上に表示される。アプリケーションをPCにインストールする必要性はない。

###Lesson2:Webはどのように発展したのか
・インターネットとは、世界中のコンピュータをつなぐネットワーク網
・1969年にその原型は出来上がっていたけど、コンピュータが高かったことと使われる用途が少なかったため大学や研究機関の一部の人たちが電子メールの交換やファイルの共有などで使用していた。
・WWW(worldwideweb)とNCSA(Webブラウザの原型)の登場で状況が一変。
・もともと研究の結果を共有しやすくするために、学者がWWWを開発した。研究成果をHTMLで表現でできるようにした。
・その中のハイパーテキストをいう仕組みのおかげで、文章間の参照がハイパーリンクで瞬時に参照先の文章を閲覧できるようになった。これによって今まで手作業だった参考文献や関連論文を簡単に閲覧できるようになった。
・WWW登場当時のWebブラウザは文字のみで表現して、画像などは別のウインドウで表示されるのが一般的だった。それを文字と画像が混合で表示できるようになったブラウザがNCSAMosaicというブラウザ。無料で誰でも利用できるようになったおかげでWWWの利用が拡大して一般の人の興味を引くようになった。
・Apache（アパッチ）とは世界中で使用されているWebサーバーソフトウェア(HTTPサーバー)
・IISはMicrosoftが提供しているWindowsのWebサーバーソフト
・nginxは、Webサーバのソフトの一つ。Apacheのライバルでリバースプロキシの機能があり負荷分散できる。
・インターネット上のコンテンツを指定するための仕組みが「URL」。
・URLはスキームとホスト名、パス名の３つに別れる。
例：https://www.example.com/docs/html/example-uri.html
スキーム:https
ホスト名:www.example.com
パス名:docs/html/example-uri.html
・スキームはリソースを取得するための方法。Webアプリケーションにおいてはほとんどがhttps。
・ホスト名はリソースが存在するホスト(コンピュータ名)。ホスト名はローカル名(WWW)と親ドメイン名(example.com)に別れる。親ドメイン名は勝手に決められない。
・ホストで指定されたコンピュータ上のリソースの位置。
・通信プロトコルとは、通信をするときにお互い（自分と通信相手）が守る約束のこと。FTPはファイル転送のためのプロトコル。SMTPはメール転送のためのプロトコル。HTTPはwebサーバと　webクライアントが通信するためのプロトコル。
・CGIとは、Webサーバー上でプログラムを使って処理した結果を表示させる機能のこと。これによって動的コンテンツをクライアントに返せるようになった。さらには、webブラウザからの入力を受け取りそれに応じた処理を行うというアプリケーションが作成できるようになった。検索サイトや掲示板、ショッピングサイトなど。

###Lesson3:HTTPを知る
・ホスト名は人間にわかりやすいように表現されており、実際はインターネットに接続された全てのコンピュータは「IPアドレス」という数値によって識別されている。例:192.168.0.1
・IPアドレスがわかると宛先のホストが特定できるので任意の情報を届けることができる。その役割を担うのが「TCP/IP」と呼ばれるプロトコル。
・情報はパケットと呼ばれる単位に分割されて送受信されている。
・パケットの送受信はTCP/IPが責任を持って行われる。
・IPアドレスは世界中で唯一の値だから勝手に決められない。
・IPアドレスはインターネット利用に関われずネットワーク機器で情報をやり取りするためには必要。
・ドメイン名からIPアドレスに変換する仕組みが「DNS」。DNSはドメイン名とIPアドレスの対応表を持ったコンピュータ(DNSサーバ)をインターネット上に配置し、DNSサーバに問い合わせればドメイン名に対応するIPアドレスを教えてくれるというもの。ドメイン名の代わりにIPアドレスを指定することもできる。
・URLの?につづく部分をクエリ文字列と呼び、フォームに入力された文字列などをWebサーバに渡すために使われる。
・クエリ文字列の中はさらに&(アンパサンド)で区切られていて、それぞれの部分は「パラメータ名=値」の形式で表示されている。

###Lesson4:CGIからWebアプリケーションへ
・最初に要求したURLから違うURLへ誘導することをリダイレクトと呼ぶ。
・FTPなど状態を保つプロトコルをステートフルプロトコル、httpのように状態を持たないプロトコルをステートレスプロトコルと言う。
・本来の処理を行うために余計に必要になってしまう処理をオーバーヘッドという。
・Webブラウザに状態を持たせる技術をcookieという。名前=値の組み合わせで表される。
・cookieを利用した情報のやり取りはhttpのリクエストヘッダーやレスポンスヘッダーで行われるので比較的簡単に覗けるのでセキュリティ上大きな問題がある。
・より安全に多くの情報を保持するために考えられたのがセッションという仕組み。

###Lesson5:Webアプリケーションの構成要素」
・できる限り重複した情報を排除することを正規化という。
・業務上まとめて実行するべき一連の処理をトランザクションという。
・webシステムを構成するソフトウェアを大きく３つの役割(webサーバ、アプリケーションサーバ、データベースサーバ)に分けて連携させる構成を三層構成と呼ぶ。

###Lesson6:Webアプリケーションを効率的に開発するための仕組み
・フォワードは、転送のこと。
・リクエストスコープは、フォワード元とフォワード先の間で情報（オブジェクトなども)を共有するための仕組み
・アプリケーション開発においてはコンピュータに行わせる処理をロジックという。
アプリケーション特有の処理をビジネスロジックという。
・入力(input)、処理(process)、出力(output)というコンピュータ処理に置ける基本の流れをIPOと呼ぶ。

###Lesson7:セキュリティを確保するための仕組み
・webアプリケーションを含む情報システムにおいて守るべき情報セキュリティは、機密性、完全性、可溶性の３つ。
・機密性=>第三者への情報の流出を防ぐこと。
・完全性=>第三者による情報の改ざん
・可溶性=>適切な権限を持った人間が適切な情報を利用できること。
なぜかSVG画像だけがiPhoneのSafariで明朝体になる時にやったこと

CSSで&lt;body&gt;タグに対してサンセリフ体（sans-serif）をかけているのに、
SVGアイコンの「メニュー」の文字だけ明朝体になって困った。

<img width="300" alt="Screen-Shot-mincho.png" src="https://qiita-image-store.s3.amazonaws.com/0/40940/5ce8405a-7593-bcc5-575a-3f108b76c9a8.png">



SVG画像に対して、

```css
img {
    font-family: sans-serif;
}
```

をかけてもダメだった。

## 結局どうしたか

SVGをエディターで開いてSVGのソースコードをみたら、以下の`font-family="YuGo-Bold, YuGothic"`の記述があったので、

```
    <text id="メニュー" transform="translate(334 60)" font-size="8" font-family="YuGo-Bold, YuGothic" font-weight="700"><tspan x="-16" y="0">メニュー</tspan></text>
```

以下のようにfont-family指定`font-family="sans-serif"`を編集したら、ちゃんとサンセリフ体になった！


```
    <text id="メニュー" transform="translate(334 60)" font-size="8" font-family="sans-serif" font-weight="700"><tspan x="-16" y="0">メニュー</tspan></text>
```


<img width="300" alt="Screen-Shot-san-serif.png" src="https://qiita-image-store.s3.amazonaws.com/0/40940/3858a02b-0cf9-e36e-3243-8447ae740f01.png">
忙しい人のためのIntel SGXでHello World

前回の記事でIntel SGXの導入について述べたので，ここではどうやってHelloWorldするかを述べます．

# 下準備
Sample Enclaveアプリケーションは次の２種類にわけることができます．基本的にはAppがEnclaveの関数を叩く形になります．
- App: メインのアプリケーション 
- Enclave: Enclave用のプログラム

edlはヘッダーだと思ってもらえると都合がいいと思います．

# Let's helloworld
ここでは，自作の特に何もしないhelloworld()という関数を定義してみましょう．

まずTrusted Library/配下にMycode.cppとMycode.edlを生成します．ファイルを生成したら，Visual Studioにドラッグ＆ドロップします．

そしたら`Enclave.edl`に次の1行を記述してください．これによって，メインのアプリケーションである`App.cpp`から今回追記するプログラムが呼べるようになります．

```
enclave {
  /* add */
  from "TrustedLibrary/Mycode.edl" import *;
}
```

続いて， `Mycode.edl`を編集します．

```
enclave {
  trusted {
    public void helloworld(void);
  }
}
```

続いて， `Mycode.cpp`を編集します．

```
#include "Enclave.h"
#include "Enclave_t.h"
void helloworld() {
}
```

最後に`App.cpp`から呼び出します

```
ecall_thread_functions();
helloworld(global_eid); // <- insert here
sgx_destroy_enclave(global_eid);
```

# まとめ
新しい関数の生成方法は次の通りです．
1. `Mycode.cpp`と`Mycode.edl`をTrusted Library/に作成する．
2. `Enclave.edl`に`from "Mycode.edl" import *`宣言を書く．
3. `Mycode.edl`に`public void helloworld(void);`のプロトタイプ宣言を行う．
4. `Mycode.cpp`に本体の宣言を行う．
5. `App.cpp`から`helloworld()`をコールする．
社内Proxyに阻まれてもUbuntu 18.04でMono最新版をインストールする

# はじめに
仕事用検証環境でMono（mono-complete）が必要でしたが、[公式](https://www.mono-project.com/download/stable/)のやり方だとapt-keyがProxyに阻まれインストールできず。
18.04からはaptでインストールできるようになったと聞き、入れてみましたが4系の最新版が入ってくるので検証したいアプリ動かず、という状況でした。

```
sudo apt install mono-complete
```

なんとか5系の最新版をインストールしたかったので探ったところ、[GithubのIssues](https://github.com/mono/mono/issues/7285)で「aptのリポジトリに追加したらええで！（超意訳）」って書いてあったのでやってみました。

# 事前準備
たぶん大丈夫だと思いますが、ネットワーク設定（主にProxy）を行ってブラウザでググれる（証明書エラーとか出ない）状況を前提とします。
また、aptも個別でProxy設定する必要があるので、通常の`apt update`がエラー無く行えることを確認してください。

# 最新版をインストールする
1. 下記コマンドを実行して、鍵を取得する
`--keyserver`の後ろに`--keyserver-option http-proxy=http://proxyaddress:port`を付けてあげると、Proxyに阻まれずkeyserverに接続できるようになります。

    ```
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-option http-proxy=http://proxyaddress:port --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
    ```

1. 下記コマンドを実行して、リポジトリを追加する

    ```
echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
    ```

1. `apt update`を実行する（ここでエラーになった場合は、下記「[エラーになる場合](#エラーになる場合)」を参照）

    ```
sudo apt update
    ```

1. `apt install mono-complete`を実行してインストールする

    ```
sudo apt install mono-complete
    ```

1. Monoのバージョンを確認する

    ```
mono --version
    ```

[ここのページ](https://www.mono-project.com/download/stable/#download-lin)のバージョンと同じであることを確認してください。


# 最新版にアップデートする
すでにmono4系をインストールしている場合はこちら

1. 下記コマンドを実行して、鍵を取得する（すでに取得済みであれば不要）

    ```
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-option http-proxy=http://proxyaddress:port --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
    ```

1. 下記コマンドを実行して、リポジトリを追加する

    ```
echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
    ```

1. `apt update`を行う（ここでエラーになった場合は、下記「[エラーになる場合](#エラーになる場合)」を参照）

    ```
sudo apt update
    ```

1. `apt upgrade`を行う

    ```
sudo apt upgrade
    ```

1. Monoのバージョンを確認する

    ```
mono --version
    ```

# エラーになる場合
お使いの環境（主にProxy）により、`https://～`だとエラーになる可能性があります。
その場合は`/etc/apt/sources.list.d/mono-official-stable.list`を開いて`dev http://～`に修正してください。

#Monoのリポジトリ
下記のURLにMonoのバージョンが各種ありますので、必要に応じてインストールしたいリポジトリを変更すると最新版以外の任意のバージョンがインストールできると思われます。

https://download.mono-project.com/repo/ubuntu/dists/


#参考
https://github.com/mono/mono/issues/7285


#【2019/4/4大幅修正】
投稿後、しばらくして自分でやってみたらできなかったので修正しました。
すまねぇ・・・すまねぇ・・・。
Elmでマス目を描画する

・・・いや、変な意味じゃなくて。

Elm guideをなんとなく見て、うっすらソースが読めるようになってきて、環境もできたので、いざなんか書いてみようかと。

Web上で動くドット絵エディタを作りたいな〜と。
そしてそれで絵描いてLINEの絵文字を作りたいな〜と。そんな野望を持っています。

とりあえず、Elmの恩恵にもあずかれないような、ただの表を書くところからスタート。

# 進め方
### ガイド ###
https://guide.elm-lang.jp/architecture/buttons.html
の中からHTMLタグっぽいものを探してみる。なるほど、タグ名を書いて、最初の[]の中はタグの属性、次の[]でタグの入れ子を表しているんだろう。（ひとまず雰囲気で読むことにした）

### リファレンス ###
https://package.elm-lang.org/packages/elm/html/1.0.0/Html
を見てもなんとなくそんな感じがする。
とりあえずTABLEタグを表示すべく、パクってきたサンプルにtableと書いてみた。

<details><summary>ソースと実行結果</summary><div>

```elm:
view model =
    div []
        [ input [ placeholder "Text to reverse", value model.content, onInput Change ] []
        , div [] [ text (String.reverse model.content) ]
        , table []   ←これを書いてみた
        ]
```

```:実行結果
$ elm make src/textfld.elm 
Detected errors in 1 module.                                         
-- NAMING ERROR ------------------------------------------------ src/textfld.elm

I cannot find a `table` variable:

55|         , table []
              ^^^^^
These names seem close though:

    title
    abs
    alt
    name

Hint: Read <https://elm-lang.org/0.19.0/imports> to see how `import`
declarations work in Elm.
```

</div></details>

最後の行にありがたいヒントが出ている。
こいつを頼りにimportにtableを追加してみる。


<details><summary>ソースと実行結果</summary><div>

```elm:
module Main exposing (Model, Msg(..), init, main, update, view)

import Browser
import Html exposing (Attribute, Html, div, input, text, table)
```

```:実行結果
Detected errors in 1 module.                                         
-- TYPE MISMATCH ----------------------------------------------- src/textfld.elm

The 3rd element of this list does not match all the previous elements:

53|         [ input [ placeholder "Text to reverse", value model.content, onInput Change ] []
54|         , div [] [ text (String.reverse model.content) ]
55|>        , table []
56|         ]

This `table` call produces:

    List (Html msg) -> Html msg

But all the previous elements in the list are:

    Html Msg

Hint: Everything in the list needs to be the same type of value. This way you
never run into unexpected values partway through. To mix different types in a
single list, create a "union type" as described in:
<http://guide.elm-lang.org/types/union_types.html>
```

</div></details>

一歩前進したみたい。エラーメッセージが変わった。
TYPE MISMATCH（アンタわたしのタイプじゃないの）
そうか…そりゃしょうがねえな…

```elm:こうしたらコンパイル通った！
        , table [] []
```

```elm:同じ要領でtrとtdも追加して表にした
        , table [] [ tr [] [ td [] [ text "aa" ] ] ]
```

なんかこのへんから要領を得て、もくもくと試してはエラーを吐いてを繰り返す。

# そしてようやく…

![スクリーンショット 2019-02-24 15.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/118890/a65d6382-ac2c-5357-9cd0-10f8a7d31e27.png)

#### できたー！気持ちイィ〜！


そのうち中身変わるかもだけど動作するものとソースコード
https://youthful-colden-364718.netlify.com
https://github.com/negiboudu/textfld

# 次回に向けての課題
- 表を作るにあたって、List.repeatなどを試したがうまくいかず、何回も同じことを書いている。悲惨だ。
- テキストボックスか何かから数字を入力してもらって、マスの数を変えたり、マスのサイズを変えたりしたい。

(2019/3/14追記)
[課題をちょっとクリアしました](https://qiita.com/negiboudu/items/f9f82fe750966764d715)
私も画像が投稿できるWebアプリを作りたい。その3

#1.写真アップ用のファイルをつくる
```
$ rails g uploder Image
```

結論：
[Lv.1]
とりあえず「post」に
実装していく。
↓
[Lv.2]
できたら自分のやりたいようにカスタマイズ！！

app/models/post.rb

```ruby:
mount_uploader :image, ImageUploder
①               ②　　　③
```

①「私は画像を投稿したい"マウント"」宣言
②(post.rbの)imageカラムに
③「写真をアップ（保存）していきます」

つづく
5分で理解するkube2iamの仕組み

Kubernetes（EKS）で各PodごとにIAMロールを管理するには、[jtblin/kube2iam](https://github.com/jtblin/kube2iam)を使うのが一般的である。今回はそのkube2iamがどのような仕組みで動いているかを解説する。

## TL;DR
- EC2のメタデータ取得（`169.254.169.254`）をkube2iamのPodに流れるようにする（iptablesの編集）
- kube2iamがリクエスト元Podに基づいてIAMロールを決定し、クレデンシャルを返す
- 後発のkiamよりも手軽に導入できる（ただし高負荷時に異なるロールが割り当てられる不具合も）

## kube2iamの全体像

![IAM%20Access%20-%20kube2iam.png](https://www.bluematador.com/hubfs/blog/new/IAM%20Access%20in%20Kubernetes%20kube2iam%20vs%20kiam/IAM%20Access%20-%20kube2iam.png)

1. EC2メタデータのリクエストを横取り
2. EC2のIAMロールから別のIAMロールのクレデンシャルを生成
3. 生成したクレデンシャルを返す

### kube2iamのデプロイ
- kube2iamはDaemonset（各EC2インスタンス上で1つ以上動くPod）としてデプロイしている
- kube2iamがiptablesを触れるよう、SecurityContextを`privilege`にしてroot権限を渡す
- [公式Githubにyamlの例](https://github.com/jtblin/kube2iam/blob/0.10.6/examples/eks-example.yml)が置かれている
- [HelmもStableとして公開](https://github.com/helm/charts/tree/master/stable/kube2iam)されている

### EC2メタデータ
[インスタンスメタデータのAWSドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-categories)でも分かる通り、`/iam/security-credentials/role-name`へリクエストすればEC2インスタンスに割り当てられているIAMロールのクレデンシャルが取得できる。
AWS系のほとんどのライブラリは、認証情報が指定されていない限り、このようにメタデータAPIからクレデンシャルを取得している。

## kiamとの違い
kube2iamの他に[uswitch/kiam](https://github.com/uswitch/kiam)も存在する。kube2iamが2016年に登場し、その後発として2017年にkiamが登場した。

kiamの特徴は「Node自体がIAMロールを持たない」「Daemonsetとして起動しているAgentからMasterへリクエストする」というものがある。よりセキュリティを意識した設計だが、セットアップの手軽さではkube2iamが優勢とされており、GitHubのスター数もkube2iamが多い。（kube2iam 998 : kiam 415）

![IAM%20Access%20-%20kiam.png](https://cdn2.hubspot.net/hubfs/3917309/blog/new/IAM%20Access%20in%20Kubernetes%20kube2iam%20vs%20kiam/IAM%20Access%20-%20kiam.png)

kube2iamには[高負荷時に異なったロールが割り当てられるというIssue](https://github.com/jtblin/kube2iam/issues/46)もあり、そのような問題を考慮するとkiamも選択肢に入る。（kiamのコンセプトとしてkube2iamよりもより速く、そしてこの不具合の解決をするためというの2つがある。）

より詳しくは海外の記事「[IAM Access in Kubernetes: kube2iam vs kiam](https://www.bluematador.com/blog/iam-access-in-kubernetes-kube2iam-vs-kiam)」でも解説されている。（本記事の参考）
AI人材育成についてのまとめ

東大松尾研の中山氏が、[AI人材育成の関する海外の活動や彼らの取り組みについてまとめられていた](http://knakayama.com/wp-content/uploads/2019/02/CommunityAI-2.pdf)ので、皆さんにも紹介します。

#要点
・中山氏は、AI関連の最新研究に追従できる若手研究者、職員が大学や研究コミュニティでの業務でも時間を取られ、負荷が増大していることを危惧している。
・最新のAI分野の教育では実際にプログラミングすることが重要だが、教員の不足に加え教材の作成やGPU環境構築など多くの障壁がある。
・海外では産官学を挙げて一体的にAI材育成に力を注いでいるケースがいくつかある。
・カナダのベクター研究所は、年間1,000人のAI修士号を持つ学生を排出することを目標に、国・州・民間企業が合計17,000万カナダドルの支援を行って設立した教育・研究機関である。
・イギリスのアラン・チューリング研究所は2014年に英政府が5年間で計4,200万ポンド（約72億円）を計上し、今ではイギリスの8大学に拠点を設けているデータサイエンスとAI技術の研究機関である。企業にとってはリスクの大きい先端的な分野での挑戦的な研究を引き受けている他、先端的なデータサイエンス・AIに関する人材育成も行っている。
・パリとシリコンバレーにある「42」やシリコンバレーのホルバートンスクールのように、教師を明確に配置しない、いわゆる「教師のいない学校」というものも広がっている。明確な教師や講義が無い点、プロジェクト学習を重視している点で共通しており、コミュニティの中で次々に作成・拡張されていくコンテンツを利用して学習していく。
・これらから、AI分野においては明示的に産と学の間をつなげる・その間の壁を取り除く役割を担う機関や場が重要な役割を果たしていくだろうと言える。
・東京大学でも、演習・競技形式の宿題・プロジェクト・相互補助などコミュニティ全体としての学習方法を取り入れた「コミュニティ型のAI人材育成」を実践している。
・MOOCの問題点として修了率が低いことが挙げられるが、中山氏の考えでは、受講者を絞ることが重要である。
・今後このような活動をより広げるには、若手教員に講義を担当してもらうための工夫、柔軟な授業運営(博士学生を重用など)が必要である。
・更に、教育から研究、そして社会実装までをつなげる仕組みが日本においても社会全体として必要とされてくるだろう。
SwiftからC言語の関数をコール

SwiftからC言語の関数をコールしてみました。

SwiftからC言語の関数をコールした場合の引数の渡し方について調べてみました。
XCode 10.1で確認しました。

とりあえず、分かったことはSwiftで&はアドレス演算子ではないです。
うまいこと型類推してくれる場合もあったりしますが、自作の構造体の場合はきちんと型変換しないとダメです。

# 1 引数なし、戻り値なし

```c:c
void func1(void)
{
    return;
}
```

```swift:swift
func1()
```

簡単ですね。


# 2 引数 int、戻り値なし

```c:c
void func2(int a, int b)
{
    return;
}
```

```swift:swift
func2(1,2)
```

これも、簡単ですね。

# 3 引数 int、戻り値 int

```c:c
int func3(int a, int b)
{
    return a+b;
}
```

```swift:swift
// printで出力
print("func3()", func3(1,2))
// 変数に代入
let c = func3(7,8)
print("func3()", c)
```
これも、簡単ですね。

# 4 引数 charの配列のポインタ

```c:c
void func4(const char *in, char *out)
{
    unsigned long len = strlen(in) + 1;
    out[0] = 'A';
    memcpy(&out[1], in, len);
    return;
}
```

```swift:swift
var outstr : [CChar] = [0, 0, 0, 0, 0, 0]
func4("1234", &outstr)
print("func4()", outstr)
print("func4()", String(cString : outstr))
```

引数が```const char *```の場合はStringなリテラルを渡すとCの文字列に変換してくれます。
引数が```char *```の場合は変数のポインタを渡さないとダメです。

```:実行例
func4() [65, 49, 50, 51, 52, 0]
func4() A1234
```

# 5 引数 構造体

```c:c
struct location {
    int x;
    int y;
};

int func5(struct location loc);
```

```c:c
int func5(struct location loc)
{
    loc.x += 1;
    loc.y += 1;
    return loc.x + loc.y;
}
```

```swift:swift
var l = location.init(x:1,y:2)
print("fnc5()", func5(l))
```
構造体の初期化にinit()が使えます。


# 6 引数 構造体のポインタ

```c:h
struct location {
    int x;
    int y;
};

int func6(struct location *loc);
```

```c:c
int func5(struct location loc)
{
    loc.x += 1;
    loc.y += 1;
    return loc.x + loc.y;
}
```

```swift:swift
var l = location.init(x:1,y:2)
withUnsafeMutablePointer(to: &l){
    let p = $0
    print("func6() before", p.pointee)
    func6(p)
    print("func6() after", p.pointee)
}
```

構造体のポインタを取得するにはwithUnsafeMutablePointer()を使います。pの型はUnsafeMutablePointer<location>になります。
構造体のポインタを参照する場合はp.pointeeを使います。
構造体のポインタはwithUnsafeMutablePointer()のbody中のみ有効です。

# 7 Data型をポインタとして渡して、出力されたポインタをData型にする。

Cで書かれたエンコーダ関数があるとします。

```c
uint32_t hogeEnc(void *inp, void *outp);
```

こんな感じで、無駄なコピーが発生していますが、動きました。

```swift
    func encode(data:Data) -> Data {
        let input = UnsafeMutablePointer<UInt8>.allocate(capacity: 1920)
        let output = UnsafeMutablePointer<UInt8>.allocate(capacity: 1920)
        data.copyBytes(to: input, count: data.count)

        let enclen = hogeEnc(input, output)
        let encdata = Data(buffer: UnsafeMutableBufferPointer(start: output, count: Int(enclen)))
        
        input.deinitialize(count: 1920)
        output.deinitialize(count: 1920)

        return encdata
    }
```

まず、入力用と出力用のポインタを生成し領域を確保します。
引数のData型のバイト列をinputポインタが指す領域にコピーします。
Cのエンコード関数を呼びます。
エンコード関数でエンコードした結果をData型に変換します。その際にUnsafeMutablePointer<UInt8>型をUnsafeMutableBufferPointer型に変換してます。
最後にポインタを解放します。(必要なのかは不明ですが念の為です。)
C言語で確保した領域外へアクセスしないように注意しましょう。

とりあえず以上です。
WordPress 初動リスト

# WordPress最初のやることリスト
新WordPress立ち上げ後にやることリスト。※多分追記する
・WordPressを最新版にする
・テーマを適用し、不要なテーマは消す
・日本語化
・アンチスパム設定
・adminアカウントの入れ替え
…ここまでやれば一度寝ても良いこととする。

##最新版にする
これは考えなくても出来る。

##テーマを適用、不要なテーマを消す
使うテーマを適用する。勇者の名前のように本気で悩まない。
デフォルトで、たぶん自分が使わないテーマが入っているので消す。

WordPress のテーマを削除する方法 - バズ部
https://bazubu.com/how-to-delete-wp-theme-23120.html

##日本語化対応
ＧＣＰで立ち上げた時は必須対応だが、エックスサーバーとかなら不要。

##アンチスパム設定
とりあえずAkismet Anti-Spamする。

##adminアカウントを入れ替え
そのままにしておくと初期ユーザー名がadminの設定したＩＤのままになっていて、最初の記事投稿者として表示された状態になる。このままだとＩＤ丸見えで嫌なので、新しい管理者ＩＤを作ってユーザー名＝ログインＩＤの状態を解消しておく。

WordPressのユーザー名を変更する方法。重要な注意点があります！しっかり確認しましょう。‐ kantandays
http://kantandays.com/wp-user-henkou/