OmniAICreator/Qiita-1.07M huggingface dataset:
cordovaのiosでphoto libraryの動画を劣化なしで取得する方法

## やりたいこと

- photo libraryの動画picker
- ただし、動画データを再エンコードなしで取得したい

## 現状

既存のcordova用pickerライブラリだと、再エンコードされる。

### camera.getPicture

再エンコードされます

### https://github.com/DmcSDK/cordova-plugin-mediaPicker

再エンコードされます。

## 解決策

### 基本アイデア

試していないですが、iosネイティブならこの方法でできそうです。

https://qiita.com/yuch_i/items/812272e53289f5e1fade

と思ったが、できない可能性もある
https://stackoverflow.com/questions/27843349/ios-alasset-defaultrepresentation-returns-a-low-quality-photo

defaultrepresentationが具体的に何を返すのかについて情報が無いので、実験してみる。

### https://github.com/DmcSDK/cordova-plugin-mediaPicker のfork

https://github.com/DmcSDK/cordova-plugin-mediaPicker
を改造してみます。

メモ

jsインターフェース 
-> MediaPicker.getMedias
-> DmcPickerViewController
-> MediaPicker.resultPicker
-> MediaPicker.videoToSandboxCompress
-> PHImageManager.requestExportSessionForVideo

MediaPicker.resultPickerを書き換えて、オプションで無劣化コピーができるようにする

使われていないけど生えている
MediaPicker.videoToSandbox
を使ってみたらクラッシュした。
これを改良すれば良さそう。

実装ヒント
https://stackoverflow.com/questions/32626425/nsinputstream-from-phasset-url-ios-photos-framework

無劣化コピー対応版
https://github.com/contribu/cordova-plugin-mediaPicker/tree/feature/disable_video_compression

差分
https://github.com/contribu/cordova-plugin-mediaPicker/compare/master...feature/disable_video_compression?w=1

## 雑感

cordovaのライブラリが少ないと感じた。
ウェブアプリとコード共有したいからcordovaにしているが、
もっとメジャーな代替案があるなら乗り換えたい。
firebase authで詰まった

```javascript:auth.js
$('#signUp').on("click",function(){
      // メールアドレス・パスワードを取得
    var email = $("#email").val();
    var password = $("#password").val();
    var userName = $("#displayName").val();

    // 新規ユーザーを登録
    firebase.auth().createUserWithEmailAndPassword(email, password).then((user)=>{
     
        user.updateProfile({
        displayName:userName
        })
    });
  });
```

これがダメで

```javascript:auth.js
$('#signUp').on("click",function(){
      // メールアドレス・パスワードを取得
    var email = $("#email").val();
    var password = $("#password").val();
    var userName = $("#displayName").val();

    // 新規ユーザーを登録
    firebase.auth().createUserWithEmailAndPassword(email, password).then((user)=>{
        var user = firebase.auth().currentUser;
        user.updateProfile({
        displayName:userName
        })
    });
  });
```
ちゃんとuserを定義し直さないとダメだった

↑は忘れてください、コメントで指摘してくださった通り

```javascript:auth.js
$('#signUp').on("click",function(){
      // メールアドレス・パスワードを取得
    var email = $("#email").val();
    var password = $("#password").val();
    var userName = $("#displayName").val();

    // 新規ユーザーを登録
    firebase.auth().createUserWithEmailAndPassword(email, password).then((result)=>{
        result.user.updateProfile({
        displayName:userName
        })
    });
  });
```

ですね
東京リモートワークの夢を見る大阪求職者 by 業務経験約4年 Ruby on Rails エンジニア #転職 #ノベル 2019-03-30



# エンジニアで完全成果基準で働くとなると、爆速のアウトプットを求められるというイメージがあったが、必ずしもそうではないかもしれない。

たとえば1週間単位の成果測定であれば、そこにたどり着くまでのペース配分も自由だ。短距離走で一瞬でたどりつくもよし、中距離走と休息を繰り返すも良し。

# エネルギーというものを簡単に考えるな。

一秒一刻が勝負だ。スピードを堕しすぎて疲弊するときも、のんびりと悩みすぎて機を逸する時もある。切実に、切実に大事だ。自分自身の、過去の肉体的実感を信用する。これは疲弊するパターンだと思ったら、早めに止めないと、必ずそうなる。

# もちろん長距離走で淡々とマイペースに走り続けるのでも良い。

特に東京ではかなり、エンジニアの業務形態は自由になっているらしく、大阪とは断然の違いがあるような印象を受けた。リモートワークなど夢の夢であると思っていた自分には非常にありがたい。時代は進んでいるみたいだ。

# 「彼氏の人生に私の人生のマージリクエスト投げたいな？」


あらゆるエンジニア用語ネタの中でも秀逸である。ここから派生してコードレビューやら、Conflictやら、Revertやら、Approveやら、ステージング環境へのdeployそしてついには感動のReleaseまで、物語は進むであろう。



# 前職は職業エンジニアであるが、高卒の僕も多少の学歴コンプレックスがある。

早稲田大学とかの「わ」の文字だけでもピクピクとアイデンティティが反応したりすることも。とかく学歴社会もマウンティングにあふれているし。しかし今では架空のゲームを遊んでいる彼らという認識に近づきつつある。空。

# ずっと思っていた。

スキルという言葉を突き詰めると意味不明にななると。技術力という日本語はより漠然としている。スキルセットというと具体性が増す。あとは人間的知性や気質の違い、ハード・ソフトスキルの区別もある。常に豊穣な言葉で語らなければ人材の価値というものは語れぬアートの世界か。

# 土日だということは昼にもエンジニア勉強会やらモクモク会があるかもしれないじゃないか。

スターバックスを離れるのは寂しいが、参加してみても良いかもしれない。俄然やる気が出てきたぞ。#e

# 何か問題解決の種がないか探している。

なにか些細な問題でも見つけると、これぞとばかりに喜んで、それを喰らう。

# GoogleCloudPlatformを触っているとシェルスクリプトを書くような渋い味わいとはまた別の、独特のSuperSonicGeneration的な肌触りの良さを感じる。

未来のロックンロールがいま君の手の中に。

# 自分がMacBookのキーボードをターンと叩いてしまったほんの少しの一瞬でさえ、認知して反省しているんだよね。

耳栓をつけてなお、分かるので、振動を低減する。

# 休日の昼に家に戻り、午睡を貪るよりも、プログラミングの方がしたいと思うなど、久しぶりのことである。

再就職活動をしている今の状況もあるだろうが、おそらくは、最近とにかく、睡眠負債を返上し続けていたおかげもあると思う。そして相変わらず睡眠信者ではある。

# プログラムの複雑化を解きほぐす時。

よっしゃあ解きほぐすぞって嬉々としてほぐほぐとする気持ちが湧いてきた。

# console の黒い画面で Google Translate API を叩いているのがなかなかに美しく感じられるぞ。

日本語、英語、中国語、ヒンディ語。ゆにばーさるてきふんいきである。 ![image](https://files.slack.com/files-pri/T18TT376E-FHH0XEEGP/image.png?pub_secret=107cf95db1)

# 年収が高い人にとっては前職の年収が武器になるし、年収が低い人にとっては企業が買い叩く武器になるだろうし、なにかと商売というかポーカーのカードを切る世界ではあるよな。

モラルやマナーや正しさとは全く別軸で動いている需要と供給のフィールドだ。

# 今日はWordPressの勉強会に参加しているが、Twitterのハッシュタグはセッション中盤以降にチェックしたほうが良いかもしれない。

演者が喋りはじめたばかりの時は、待ってました、始まりましたとかいうツイートが多くて、さすがに時間が惜しい。またひとつ勉強会ハックが練り上がる。 

# 勉強会はとにかく会場にたどり着くまでが激しく辛い。

あとはやはり、もともとの苦手分野なので、面白さや、辛さの波もわりと上下しやすい。自分ひとりでひたすらにプログラミングする方が良いかもしれないとは思うが、それもさすがにアクセントがなさすぎる。やはり苦手克服チャレンジか。

# フリーランスやそれを目指す人向けのテーマで講じられている。

なんというか演者がしゃべるほどに、収入が低くて悩んでいる人の話がせつせつと訴えられたりして、お金がないことがどれほど辛いのかという感覚情報がダウンロードされていくような感覚がする。人間のトークは刷り込み効果がある。#e

# 会場の余裕時間で参加者同士の名刺交換が始まる。

そういえば僕は名刺を作っていなかったことに気づく。稲浦悠馬(35歳)(推定無職)などと書いたらさすがに冗談が過ぎるだろうか。誰も笑えずに遠い目をすることだろう。ところで名刺交換というものに実質の意味はなく単にアイスブレイクのツールである。#e

# そして Slack チャンネルのメッセージを翻訳して、リアルタイムで Github issue を作成、本文追記させたりしている。

いま Zapier でやっているようなことを、自分のサーバーでやりたかったのだよね。なかなか道のりも長かったけれど、APIをガリガリと叩くのも面白い。時代へのマッチ感を醸し出せ。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1001








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニア勉強会への参加が死ぬほど苦手な人のためのエンジニア勉強会の参加方法とは。 #エンジニア #学習 #勉強会


# 時間的拘束が辛い

- 勉強会に参加中も平然と自分のPCを広げて自分の作業をする。LTや講演をまともに聞いたりしない。まさかと思われるかもしれないが、ほとんどスライドさえ見ない。視覚情報がエネルギーを奪っていくからだ。ラジオみたいに耳で聞き流すだけにしておくが、それでもだいたいの内容は分かる。もし自分の耳がぴくっとなって興味が引かれたら、はじめて一瞬だけそちらの方向を向く。
- Twitterのハッシュタグをチェックして内容を追う。リアルタイムでチェックし続けるのも効率が悪いので、内容がまとまりはじめた、話の中盤以降にチェックするのが良いかもしれないと、最近はじめて思った。
- 勉強会のモラルには反すると思われるかもしれないが、興味があるのにまったく参加しないこととの折衷案である。もし主催者の人に嫌われたら嫌われたでその時だと考える。ゼロワンでは効率の悪いものしか得られないし、自分が興味のない発表まで懇切丁寧に聞く必要はない。

# 身体的拘束が辛い

- 2時間も3時間も同じ場所にいられない。椅子ばかりで机のない会場だったりするとさらに辛い。僕の場合はどうしてもテーブルが必要だとスタッフの人にお願いして、会場のほんの片隅にスペースを用意してもらったこともある。そもそも会場に行ってみなければ分からないし、個人的に机がないと地獄を感じるレベルで辛いので、しんどいことの解消のためには、普通にお願いする。
- ストレス緩和できる食べ物を持っていく。僕の場合は必ずガムを持っていき、それを噛んでいると多少のストレス緩和効果がある。炭酸水なども良いかもしれない。

# コミュニティが辛い

- 勉強会も回数を重ねるほどに内輪の人間関係というものが出来上がってきて、初心者は辛い。たとえ古残のメンバーが、気にせずフランクに参加してくださいと言葉では言ったとしても、何の意味もない。人同士の雰囲気からそれがにじみ出ているのだから、言葉の問題ではない。
- 内輪でしか分からないネタが繰り広げられたりすると、とてもつらい。初参加の人はそういうところを本当に機敏に感じ取るが、ここのサポートが出来ている勉強会はほとんどないような気もする。これは他の人にも聞いた話。
- 個人的対策としては、いきなり輪に入ろうという努力を絶対にしないようにする。はじめての勉強会参加は、顔を出すぐらいの小さな勢いで行ってみる。名刺交換も積極的にはしないし、無理に話しかけて疲労困憊したりしない。自分が内向型だと思うならば、リアルでのコミュニケーションは避けて極力、オンライン、Twitterのハッシュタグで人に話しかけたり、勉強会の内容をまとめたりすることに集中する。

# お金が辛い

- 勉強会は無料のものが多いだろうが、飲み会では多くのお金を使ってもらう。週に何回も参加していたら
- 飲み会で幹事の人に、一杯だけ飲んで帰れないかと聞いてみるのも良いかもしれない。コース料理の予約などであれば難しいかもしれないが、地元の居酒屋などでワリカン形式であれば、まさかアルコール一杯で3000円を取ったりはしないだろう。無理であれば諦める。
- 本当に一杯だけ飲み、突き出しだけを食べて、さっと帰る。もし話が乗ってきて興味が湧いたら、お金を払って追加のものを頼むなり、もしくは話すだけ話してじっと粘っても良いかもしれないが、僕の場合はそもそも、そこまで夜がふけるまで話し込んだことはない。

# そこまでして勉強会に参加する意味とは？

- 逆に時間的拘束、身体的拘束があることにより、ひとつのテーマに注意を向けざるをえないし、やはりあとから思い出して、テーマに関心を持つことが多い。物理空間すごい。
- 音楽のライブなどと同じでやはり「その場にいたこと」というのが大事な予感はしている。


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1002








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
個人開発の #git で毎回コミットメッセージを考えるのが面倒臭すぎるので対策する

# ~/.gitconfig

全部 add して 名前決め打ちで commit するエイリアスを作っておく。

```
[alias]
  append = !git add . && git commit -m 'no named commit'
  ap = !git append
```

# 結果

なんとも快適。

# ひとつ前に戻る

このエイリアスを多用している。

```
[alias]
  break = reset HEAD^
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1006








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#python で ハッシュの配列から、特定の値を持ったものだけを絞り込む例


```py
>>> [h for h in [{"key":"value1"},{"key":"value2"}] if h['key']=='value1' ]
[{'key': 'value1'}]
```

ruby でいうところの select

```rb
[6] pry(main)> [{"key" => "value1"}, {"key" => "value2"}].select { |hash| hash['key'] == 'value2' }
=> [{"key"=>"value2"}]
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1010








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Mac の MissionControl って Command + Tab でアプリケーションを切り替えても 何も起こらないことがあって使いにくいよね？

ほぼ唯一の不満だった。

だが設定がオフになっていただけだった。

画像では上から二番目の項目を有効にすること。

![image](https://user-images.githubusercontent.com/13635059/55282639-8ea13580-538b-11e9-8e8a-e4361c4873d7.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1004








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#vim を開いて一瞬で終了する何の意味もない例の提示

```
vim -c ':q'
```

`-c` で vim のコマンド実行が出来るので、色々と遊んでみると楽しそうです。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1005








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#python で標準入力を全行読む例

```py
#!/usr/bin/env python3

import sys

print(sys.stdin.read())
```

```
$ echo "a\nb" | ./stdin.py
a
b
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1007








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Dockerで最低限のrails開発環境をコツコツ構築してみる〜第2章〜

## はじめに
前回の続きです。

[Dockerで最低限のrails開発環境をコツコツ構築してみる〜第1章〜]
(https://qiita.com/ii_km/items/0c27d590fc333e6b13d5)

## ゴール

```bash
docker run -d --name minimum -it -v $PWD:/app -p 3000:3000 --expose 3000 minimum
```

```bash
root@41febcaa682c:/app# rails server -d -b 0.0.0.0
```

前回のこの辺のコマンドは長いし毎回実行するのは面倒なのでdocker-composeで解決する。

## 準備
前回の続きなので、実際に動かしながら読んでいただく場合は、gitからcloneしていただけると...

```bash
$ git clone git@github.com:IkumiIdei/rails_minimum.git
```

## docker-compose.yml作成
docker-compose.ymlをDockerfileと同じ階層に作成します。

```bash
$ touch docker-compose.yml
```

```yml:docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
    command: bash -c "rm -f /app/tmp/pids/server.pid && rails server -b 0.0.0.0"
```

||説明|
|---|---|
|build: [Dockerfile配置ディレクトリ]|ビルド対象のDockerfile指定|
|ports: [ホスト側ポート]:[コンテナ側ポート]|ポート割り当て設定|
|volumes: [ホスト側相対パス]:[コンテナ側相対パス]|ボリュームの指定|
|command: [実行コマンド]|コンテナ起動時の実行コマンド|

## イメージをビルド
upコマンドでイメージのビルドからコンテナの起動まで一気に行います。

```bash
$ docker-compose up -d
```

コンテナの状況を確認してみます。

```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
a3eb28149350        minimum_app2_web    "bash -c 'rm -f /app…"   About a minute ago   Up 59 seconds       0.0.0.0:3000->3000/tcp   minimum_app2_web_1
```

起動していそうです。

ブラウザからlocalhost:3000にアクセスしてみると...無事動きました！
![rails.png](https://qiita-image-store.s3.amazonaws.com/0/383351/3ad6dadc-6bd3-61da-ee81-2f4f3fa4f5bc.png)
5ステップでフォームの端をそろえる方法

初心者に優しい記事が見つからずなかなか苦労したので自分用忘備録に。
フォームの基本を学んでも、イチから整ったフォームをつくろうとすると手が動かないものですね。。。

![スクリーンショット 2019-04-01 1.33.02.png](https://qiita-image-store.s3.amazonaws.com/0/377963/41d5241f-604e-9253-155f-23d5e69f59bc.png)


結論としては、このように定義リスト（dl,dt,dd）使って*float:left;*して*clear:both*することで、項目と入力欄の左端をきれいに揃えることができます。

※定義リストは`<dl>~</dl>`の中に`<dt>（用語）</dt>`と`<dd>（用語の説明）<dd>` を書く形で使います。
※フォームで定義リストを使う場合は、項目名をdt要素、入力欄をdd要素でマークアップします。

考えかたとしては、
①　HTMLを定義リストでマークアップする
②　dt（項目）の幅を決める（paddingで上下の余白も設定）
③　dtをfloat:left;してdd（入力欄）を回り込ませる　
④　clear:bothして、項目ごとに回り込みを解除する
⑤　ddのpaddingをdtと合わせる

この5ステップで上記のような端のそろったフォームにすることが出来ます。

以下、HTML/CSSコードです。

▼HTML

```html
<p>contact</p>
    <form class="contact" action="index.html" method="post">
      <dl>
        <dt>お名前</dt>
        <dd><input type="text" name="name" class="name"></dd>
        <dt>メールアドレス</dt>
        <dd><input type="email" name="email" class="email"></dd>
        <dt>お電話番号</dt>
        <dd><input type="tel" name="tel" class="tel"></dd>
        <dt>お問い合わせ種別</dt>
        <dd>
          <select class="type" name="type">
            <option value="撮影のご依頼">撮影のご依頼</option>
            <option value="講演・メディア出演のご依頼">講演・メディア出演のご依頼</option>
            <option value="その他お問い合わせ">その他お問い合わせ</option>
          </select>
        </dd>
        <dt>ご希望のご連絡方法</dt>
        <dd>
          <input type="radio" name="contact" value="Eメール" class="radio">Eメール
          <input type="radio" name="contact" value="お電話" class="radio">お電話
        </dd>
        <dt>メッセージ</dt>
        <dd><textarea name="message" class="message"></textarea></dd>
      </dl>
      <button type="submit" class="btn">送信</button>
    </form>
```

▼CSS

```css

form{
  background-color: #eaeaea;
  padding:30px 50px;
}

form dl dt{
  width: 165px;
  padding:10px 0;
  float:left;
  clear:both;
}

form dl dd{
  padding:10px 0;
}
```

▼表示
![スクリーンショット 2019-04-01 4.04.31.png](https://qiita-image-store.s3.amazonaws.com/0/377963/0fd8e9fd-d9fa-0ea9-492c-42654a447041.png)
はじめてのC++ 【31日目】

#はじめに
機能のスマートポインタについて、さらに良い機能がありました。
`std::make_shared` という機能です。
この機能を使うと `new`も `delete` も使う必要がなくなります。
##Stock List
皆様のおかげで基本的なポインタを理解できたと思います。ありがとうございます。
今日は、スマートポインタの使い方を学ぼうとおもいます。
ロベールのC++で、クラスの動的確保の単元をやっていますが、 `new` `delete`が使われているので、スマートポインタを使って `delete` を使わないようにしようと思います。
###未解決
・メモリ  [メモリの話](https://qiita.com/yumetodo/items/067b2db266ae0779f030)　←今日はここやる
・静的メンバ [参照](https://qiita.com/yumetodo/items/b0ff58617f2733d4ffa1#%E9%9D%9Estatic%E3%81%A7%E9%9D%9Evirtual%E3%81%AA%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A6%E3%82%8B)
・`std::string`
・`i++`と`++i`の違い
・`nullptr`
・`std::vector`
・`std::array`
・`enum class`

・`std::quick_exit` [あとで読む](https://qiita.com/yumetodo/items/ba5bef7f64636ed2f439)
・初期化子
・みえる・みえない
・this
###解決
・`int const * const * const ** const * p`
・スマートポインタの使い方　`std::unique_ptr` や` std::shared_ptr`、`std::make_shared_ptr`
##メモリの話
一日では理解できそうになかったので明日もやる。
##ロベールのC++
###stringクラス
・Stringクラスを使うと文字列を便利に使うことができる。
・`c_str` 関数を使うと`const char`配列のアドレスがえられる。

とりあえずコードを書いてみる。

```String.cpp
#include <iostream>
#include <string>

int main(){
  std::string hello = "Hello!";

  std::cout << hello << std::endl;

  hello = "Hello";
  hello += ", world!";

  std::cout << "「" << hello << "」を文字コードに変えると" << std::endl;

  for(int i = 0, size  = hello.size(); i < size; ++i) {
    std::cout << (int)(unsigned char)hello[i] << ", ";
  }
  std::cout << std::endl
            << "になります" << std::endl;
}
```
<img width="468" alt="スクリーンショット 2019-04-01 2.32.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/940c6e58-1608-a410-489e-0dd24f1db9cb.png">

文字を足し算のように足すことができるとは、`stringクラス`　はかなり使えそうだと感じる。演算子オーバーロードを使っていると書いている。
もし、文字列の長さを伸ばしていって、メモリが足りなくなると自動的に広いメモリを確保してくれる。`std::vector` みたいだなぁ。
あと、 `for文`　の第一引数？みたいなところで、宣言を２つできるとは知らなかった。3つも試してみたが、コンパイル通ったのでいくつでもできるみたい。

`stringクラス` は便利だが、`const char*`　を引数にとる文字列動作関数があったとしても使えない。そこで、 `c_str`　というメンバ関数が用意されている。この関数を呼ぶと文字列のアドレスを返してくれる。
 
```こんぱいるエラー.cpp
void Foo(const char* str);

string str = "hoge";
Foo(str); //こんパイルエラー
```

```これでOK.cpp
void Foo(const char* str);

string str = "hoge";
Foo(str.c_str());
```
#終わりに
メモリの記事を呼んでみたがいまいち理解できない。いろいろな記事を読み漁ってみようと思う。
おやすみなさい。
Thunderbird の .eml ファイルや Outlook の .msg ファイルのファイル名に送信日時を付ける

# 概要
指定したフォルダツリー内にある全ての .eml や .msg ファイルに対して、ファイル名の先頭部分にメッセージの送信時刻を付加する処理を一括して行なうための簡単なツールを作りました。

# 背景
Outlook や Thunderbird のメールメッセージを、エクスプローラーのフォルダへのドラッグ＆ドロップでファイルとして保存した場合、ファイル名は （メッセージの件名）＋（拡張子 .msg / .eml）となり、またファイルの更新日時はその操作を行なったタイミングになるため、保存された複数のファイルを送信時刻でソートすることができません。

# 使い方
下記のコードをバッチファイルとして拡張子 .bat のファイルに保存し、.eml ファイルや .msg ファイルを含む対象フォルダをその上にドラッグ＆ドロップします。

# コード
中身はほぼ PowerShellスクリプトですが、Windows バッチファイルとして実行できます（先頭行をコメントアウトまたは削除して拡張子を .ps1 に変更すると PowerShell スクリプトになります）。

eml ファイル用

```powershell:RenameEml.bat
@Powershell -NoP -C "&([ScriptBlock]::Create((gc '%~f0'|?{$_.ReadCount -gt 1}|Out-String)))" '%1' & pause & exit/b
# by earthdiver1
param([parameter(Position=0)][String]$Dir)
if (-not $Dir) { 
    Write-Host "対象フォルダが指定されていません。処理を終了します。" -Fore Red
    exit
} 
if (-not (Test-Path -LiteralPath $Dir -PathType Container)) { 
    Write-Host "対象フォルダがありません。処理を終了します。" -Fore Red
    exit
}
$outlook = New-Object -ComObject Outlook.Application
$stream = New-Object -ComObject ADODB.Stream
$msg = New-Object -ComObject CDO.Message
Write-Host "処理を開始します。"
Get-ChildItem -LiteralPath $Dir -Filter "*.eml" -Recurse | % {
    $stream.Open()
    $stream.LoadFromFile($_.FullName)
    $msg.DataSource.OpenObject($stream,"_Stream")
    $stream.Close()
    Rename-Item -LiteralPath $_.FullName "$($msg.Senton.ToString('yyyyMMddHHmm'))_$($_.BaseName)$($_.Extension)"
}
Write-Host "処理が終了しました。"
```

msg ファイル用

``` powershell:RenameMsg.bat
@Powershell -NoP -C "&([ScriptBlock]::Create((gc '%~f0'|?{$_.ReadCount -gt 1}|Out-String)))" '%1' & pause & exit/b
# by earthdiver1
param([parameter(Position=0)][String]$Dir)
if (-not $Dir) { 
    Write-Host "対象フォルダが指定されていません。処理を終了します。" -Fore Red
    exit
} 
if (-not (Test-Path -LiteralPath $Dir -PathType Container)) { 
    Write-Host "対象フォルダがありません。処理を終了します。" -Fore Red
    exit
}
$outlook = New-Object -ComObject Outlook.Application
Write-Host "処理を開始します。"
Get-ChildItem -LiteralPath $Dir -Filter "*.msg" -Recurse | % {
    $msg = $outlook.CreateItemFromTemplate($_.FullName)
    Rename-Item -LiteralPath $_.FullName "$($msg.Senton.ToString('yyyyMMddHHmm'))_$($_.BaseName)$($_.Extension)"
}
Write-Host "処理が終了しました。"
```

　
クリエイティブ・コモンズ 表示 - 継承 4.0 国際
VSCode Extension(拡張)のエラー確認方法 - prettierの自動フォーマットが効かない時

[@koshi_life](https://twitter.com/koshi_life) です。

[prettier-ruby VSCode Formatter設定](https://qiita.com/koshilife/items/c112c57673721e3d0015) の記事で紹介した [prettier-ruby](https://github.com/prettier/plugin-ruby) をチーム内に導入することになった。

ただ、一部メンバの環境でコードを保存してもフォーマッターが効かず、`settings.json` の設定をチーム間で睨めっこしたりと小1時間時以上間溶けてしまった。

結果的にVSCodeのWindowのログを見て、ファイル保存をトリガーに走るprettier の処理がタイムアウトでキャンセルされていることがわかった。
ログの見方とタイムアウト設定変更例を備忘する。

## VSCodeのエラーの見方

- cmd+shift+p で「Show Logs」を選択。
  - <img width="650" alt="show-log1.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/4656ede8-6c5d-8d6f-85e8-b1e81473d6cf.png">
- 今回は「Window」に関するエラーだったので「Window」を選択。
  - <img width="650" alt="window.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/c4618493-fc7c-b016-a319-1c5254d72e9e.png">
- 「OUTPUT」ウィンドウでログが確認可能に
  - <img width="650" alt="show-log-after.png.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/c6dd8438-4a7b-f3b9-040d-e9f36812f132.png">  

>[2019-04-01 01:30:34.592] [renderer3] [warning] Aborted format on save after 2ms [^1] 

[^1]: 実際のログのキャプチャを取るため一時2msで設定。デフォルト値は750msらしい。参考 [Visual Studio Codeの設定「虎の巻」：IDE編 (3/3)](https://www.atmarkit.co.jp/ait/articles/1708/23/news026_3.html)より "サイズの大きなファイルの保存時に書式の自動設定が完了しないと、書式設定がキャンセルされる。このタイムアウト値はデフォルトで750ミリ秒となっているが、editor.formatOnSaveTimeout項目でこの設定を上書きできる。"

とログが出力されており、フォーマッターが効かない原因に辿り着くことができた。
その後 `settings.json` に `editor.formatOnSaveTimeout` の設定でタイムアウト値を緩和。(10秒は割と適当)

```settings.json
    "[ruby]": {
        "editor.formatOnSave": true,
        "editor.formatOnSaveTimeout": 10000,
    },
```
FlickrのAPIを使ってみよう


まず下記のLINKがをアクセスします。
![p1.JPG](https://qiita-image-store.s3.amazonaws.com/0/154661/c0ba9024-1722-f68c-0c75-baca4337842b.jpeg)
そのあとにLOGIN要求されますので、ACCOUNTを作成LOGINGしたらこの画面が出てきます。
今回はとりあえず”GET your API Key"を押します。
![p3.JPG](https://qiita-image-store.s3.amazonaws.com/0/154661/cf6ae782-a441-d4f0-795e-e87a926876a0.jpeg)
とりあえず商業用ではないので、”APPLY FOR A NON-COMMERICAL KEY"にします。
![p4.JPG](https://qiita-image-store.s3.amazonaws.com/0/154661/0ae165d5-367d-e2c8-6a28-8dda4200f6c2.jpeg)
ここで適当な内容を入れればOK!
![p5_delete the user name !.JPG](https://qiita-image-store.s3.amazonaws.com/0/154661/1f8849b7-a263-9551-20c4-711f95d89c11.jpeg)
そしてあなた専用のKEYが出てきました！
![p6_delete_the key.JPG](https://qiita-image-store.s3.amazonaws.com/0/154661/dad4e467-cf34-7ff2-1009-24cf9fd24b66.jpeg)
次は先のLINKに戻って、Pythonの　Beej’s…を選びます。
![p7.JPG](https://qiita-image-store.s3.amazonaws.com/0/154661/64349e24-0404-e8d1-996e-a58dc66787ad.jpeg)
クリックしたらこのようなPageが見えると思います。
ちょっと下にいけばAPIのInstallのコマンドが見えます。
![p8.JPG](https://qiita-image-store.s3.amazonaws.com/0/154661/b514a0b4-e678-d664-02a5-3b0b5a9fbe01.jpeg)
こちらこのコマンドです。
```
pip install flickrapi
```
次はDownload.pyを作ります。

```
from flickrapi import FlickrAPI
from urllib.request import urlretrieve
from pprint import pprint
import os,time,sys

#API
key='Your Key'
secret='Your secret key'
wait_time=1

#save path
animalname=sys.argv[1]#
savedir='./'+animalname

flickr=FlickrAPI(key,secret,format='parsed-json')
result=flickr.photos.search(
		text=animalname,
		per_page=400,
		media='photos',
		sort='relevance',
		safe_search=1,
		extras='url_q,licence'
	)

photos=result['photos']

print('photos is donwloading..')
for i,photo in enumerate(photos['photo']):
	url_q=photo['url_q']
	file_path=savedir+'/'+photo['id']+'.jpg'
	if os.path.exists(file_path):continue
	urlretrieve(url_q,file_path)
	time.sleep(wait_time)
	
print('Finished:)!')
```

以下のコマンド叩くと、400枚Monkeyの写真ダンロードできます。

```
python3 donwload.py monkey
```
文系大学生1年の僕が3年近く眠っていたPCをlinux化して蘇らせた話。

#文系大学生1年の僕が3年近く眠っていたPCをlinux化して蘇らせた話。
##おかんが突然転職するためにPCを使いたいと言い出した。
うちの家族共用PCはcore3搭載のくせしてめちゃくちゃモッサリマシンで、もはやブラウジングどころか立ち上げる段階でうんざりするレベルだったのでPCにうとい家内はもうかれこれ2年近く放置状態にしてた。
自分のマシンのスペックには満足してたので家族用PCには一切手をつけていなかったのだが、この度母親が50歳近くにして転職を考えているとのことで、なにやらPCでリサーチしたいらしいのでモッサリマシンを何とか軽くするための解決策としてLinux化を採用した。（ssd換装とかも考えたけどお金かけたくなかったし、何となくLinux使ってみたかったので。）
ubuntsでも良かったのですが、調べたら最近のubuntsは重いとのことなのでLinux mintをディストリビューションに採用しました。
##やったこととその手順
基本的には調べれば最初に出てくるようなことをそのままやった感じです。なので手順に関してはそんなに詳しく語りません。ただ１つ言っておくと、BIOS画面（linux化する際に開く設定画面）に入るときのF2連打が一番ハマったポイントです。
###linuxのインストール
公式サイトからisoファイルをダウンロードしてください。後々linuxを起動させるためにCDRかUSBに書き出しがひつようなのですが、USBだと一旦書き込み用のアプリをダウンロード刷る必要があります。そんなに難しくはないですがPCが苦手な人はCDRにしておけばwin10からそのまま書き出しができます。ちなみに自分はマシンにディスクドライブが無かったのでUSBに書き出しました。
###BIOS画面（UEFI）からlinuxを起動する
USBにisoファイルを書き出せたところで、次はUEFI画面からlinuxを起動したいのですが、デフォルトの設定ではUSBからOSを起動することができないので、読み込みの優先順位を変えます。UEFI画面の開き方はPCの電源を再起動して、ロゴが出たタイミングでF2かDelキーを連打するというもの。まさかのここが一番ハマった。（設定からも行けることは後で知った。）
###linuxをPC本体にインストールする
この段階ではまだUSBからlinuxを起動しただけなので、ここから実際に本体にインストールしていきます。言語設定で日本語が選択できるので出てくる画面のそのとおりに進めていけば完了します。すべて完了したらlinux化は成功です。
##その後のおかんの反応
立ち上げることすらままならなっかたPCが突然蘇ったので何が起こったのかはあまり理解していません。widowsからlinuxに変えたよと答えても「ふーん」って感じですがブラウジングに関しては問題なく、満足しているようです。linux mintの情報はいっぱい出てくるのでPCに疎い人もそのとおり進めることさえできれば、家にあるモッサリマシンを蘇らせることができるかもしれないので、一度試してみてはいかがでしょうか。
株式会社scoutyを退職しました

## 株式会社scoutyってどんな会社？
[株式会社scouty](https://scouty.co.jp)は、「日本初のAIヘッドハンティングサービス」です。
結構な数の企業様に導入されています。

2019年3月いっぱいで退職しました。

私が退職を決めたのは、株式会社scoutyに不満があるからではありません。
大学でコンピューターサイエンスをしっかりと学びたい気持ちが強くなった為です。

## 入社前の私の状態
私は株式会社マーケットプレイスでエンジニアとして働いていました。
いくつかのブラウザゲームと自社プラットフォームを提供している会社です。
ブラウザゲームのタイトル数は40以上あり、一つのタイトルの月間トラフィックは億を超えており、エンジニアは3人でした。

そこでやった主な事は、IEとレスポンシブ対応が必要な新規タイトルのメインゲーム部分の開発です。[Phaser](https://phaser.io)というCanvas要素上で動作するゲームエンジンと[Vue.js](https://jp.vuejs.org/index.html)のハイブリッドで開発し、無事リリースしました。

また、副業や、誘われて他の飲食系のスタートアップの立ち上げのお手伝いもしていました。
その飲食系のスタートアップの立ち上げでは報酬がきちんと支払われる事は私の友人含め、一切ありませんでした。
早いうちにスタートアップあるあるを経験できたのはとても良かったと思います。

## 会社との出会い
会社との出会いは、私が[TechCrunch Tokyo 2017](https://jp.techcrunch.com/event-info/techcrunch-tokyo-2017/)を観戦しに行った時の事でした。
株式会社scoutyの代表がスピーチをしており、そのスピーチは私をとてもワクワクさせるものでした。
これは是非とも代表方と一度お会いしてみたいと思い、連絡しました。

## 実際会ってみた感想
実際にお会いしてみた所、今までに出会ったことがない程のロジカルで、凄く優秀な方々でした。

## 入社経緯
ライブコーティングでテストされました。
当時にしては許容範囲のコードを書けたと思います。

その後、メンバーの方々とランチし、そのランチ後に代表から突然内定書を頂きました。
履歴書・職務経歴書、現職の給与等を一切聞かずに私のスキルと人となりを見てのお誘いでしたのでとても嬉しかったです。
そして、入社したのは2018年の2月です。

## チームへの参加
株式会社scoutyでは、主にpythonの3系を使って開発しています。
対して私はPHPerでした。
チームへの合流をスムーズにしたかったので、トレーニングの一環として、入社するまでの間にpythonで仮想通貨の自動取引システムを作りました。自動取引システムは速度と精度が凄く重要な為、コルーチンとメモ化を駆使し、各種モニタリングサービスの連携もさせました。
pythonでのプログラミングには少し詳しくなれました。

## 実際の開発
しかし、Djangoのプラクティスやドメインロジックゴリゴリのソース、未経験の新しいアーキテクチャ(戦術的DDD)、複雑で強大なDBと戦う知識は当時の私にはありませんでした。
これらを素早く習得しなければ行けません。
これを乗り越えるのに約3ヶ月ぐらいかかりました。

## 株式会社scoutyでやった事
### 研修
なによりも最初に行った入社研修では自社サービスをユーザーとして体験する事でした。
私はLaravel使いで腕の良さそうな方をターゲットにスカウトをしました。始めてのスカウトでいきなり返事が来て喜んでるのもつかの間、トントン拍子でその方を採用できました。
これは驚きました。

### 開発
株式会社scoutyではスクラム開発をしているため、基本的にサービス全般触れていますが、私が主にした事は、Vue.jsを導入し、SPAでサービスの正式版の開発を一緒にしたことです。

### チームでの私の立ち位置
メンバーは全員が凄く優秀な方々でしたが、当時はモダンなフロントエンドに凄く詳しいというメンバーはいませんでした。
なので、私は主にフロントエンドと設計を学びました。

### 感想
株式会社scoutyの方々は凄く優秀です。
そんな方々と一緒に開発できた事は、本当に学ぶことが多く、とても刺激的で楽しかったです。
彼らには本当に感謝の気持ちしかありません。

## やりたい事
私は学生時代から1人でサービス開発をできるようにする事を重要視し、その目標に向かって学習してきました。
各分野のスペシャリストの方々と比べると成熟度は違えど、1人でサービスを開発する為に必要なスキルは大体身についていると思います。
この状態での次のステップとしては、フロント・サーバー・インフラ、もしくはその他の関連技術からいくつか選び、集中的に磨き、活動する事だと思います。選ぶ技術は希少性が高く、且つトレンドの奴だとなお良いでしょう。それがエンジニア市場で自信の価値を上げるシンプルな方法の1つです。
また、ただ収入を増やしたい場合は、大手外資並の条件でのお誘いもいくつかありましたが、どれも私には魅力的に写りませんでした。

なぜならそれらを選択した未来はどれも私をワクワクさせるようなものではありません。
私は贅沢な生活をする為にエンジニアを選んだわけではありませんし、今でもその気持に変わりはありません。

今の私は、私が想像できないような、より選択肢が多い、ワクワクする未来に投資したいです。

私はハードウェアは全然詳しくありませんが凄く興味があります。IoTやロボット開発にも興味があります。ゲーム開発も凄く好きですし、ソフトウェア開発者の為の開発も好きです。私が知らない、まだ携わった事のないような、人々により良い体験や生活を与えられる技術やプロダクトとの出会いには常にワクワクします。

力不足のせいで、やりたいことを我慢するのは恐怖です。
その為、今すぐ業務に結びつかなくとも、もしかしたら生活が他の道よりも貧しくなったとしても、このコンピューターサイエンスを学問として学ぶ事に投資をし、そして未来の選択肢を広げる事に、私は一番ワクワクします。

### 今後のキャリア
まずは2020年度から始まる日本の4年制大学のコンピューターサイエンス関連の学部に入学し、しっかりと基礎を学ぼうと思います。
その為に5教科7科目の学習とセンター試験、大学受験対策をしながら、社会人入試・AO入試も駆使して全力でその道を掴み取ります。
Qiita 初心者向け書き方まとめ

#はじめに

**「Qiitaを書いてみたい！！！」**
**「Qiitaってどうやって書くの？」**
**「書いたことはあるけど、書き方を覚えてなくて毎回ネットで書き方を調べてしまう。。。」**

などと思ったことはありませんか？

Qiitaを始める方に向けて、どうやって書いたらよいかをまとめていきます。
「あれ？どうやって書くんだっけ」と備忘録として使っていただけたら嬉しいです。

#見出し
文章の最初に「#」をつけることで見出しになります。
また、#の数に応じて、見出しの大きさを変えることができます。
htmlでいうところのh〇が#の数になります。

>#見出し1
```
#見出し1
```

>##見出し2
```
##見出し2
```

>###見出し3
```
###見出し3
```

#引用
文章の最初に「>」をつけることで見出しになります。
また、>の数に応じて、引用の段階を変えることができます。

>引用1
>>引用2
>>>引用3

```
>引用1
>>引用2
>>>引用3
```

#箇条書きリスト
文章の最初に「-」「+」「*」のいずれかをつけることで箇条書きリストになります。
また、記号と文の間に半角スペースを入れる必要があります。

- リスト1
  - リスト1_1
     - リスト1_1_1
     - リスト1_1_2
  - リスト1_2
- リスト2
- リスト3

```
- リスト1
  - リスト1_1
     - リスト1_1_1
     - リスト1_1_2
  - リスト1_2
- リスト2
- リスト3
```

#番号付きリスト
文章の最初に「番号.」をつけることで番号付きリストになります。

1. リスト1
2. リスト2
3. リスト3

```
1. リスト1
2. リスト2
3. リスト3
```

#コード
上下に空白行を入れ、```(バッククオート3つ)でコードを囲むことで、コードになります。

<pre>
```HelloWorld.java
public class HelloWorld{
   public static void main(String[] args){
     System.out.println("Hello World!!");
   }
}
```
</pre>

```HelloWorld.java
public class HelloWorld{
   public static void main(String[] args){
     System.out.println("Hello World!!");
   }
}
```

#リンク
[リンクテキスト]（リンク先アドレス）と書きます。

[Qiita](http://qiita.com)

```
[Qiita](http://qiita.com)
```

#テーブル

|左揃え|中央揃え|右揃え|
|:--|:-:|--:|
|test|test|test|
|A|B|C|

```
|左揃え|中央揃え|右揃え|
|:--|:-:|--:|
|test|test|test|
|A|B|C|
```

#水平線
「*」か「-」を3つ以上一行に書くことで水平線になります。
***

```
***
```

#画像の挿入
画像をドラッグ&ドロップすると挿入できます。

#強調

「**」または「__」を強調したい内容の前後に記載すると、強調されます。

**強調されます1**
__強調されます2__

```
**強調されます1**
__強調されます2__
```
headless-chromeでスクリーンショットをする

- headlessクロームで画面のスクリーンショットを取りたかったのでメモ
- スクレイピングがコケたときなどに画面を確認したい

## 環境
- ruby

```bash

ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18]
```
- selenum
    - docker-selenium
        - https://github.com/SeleniumHQ/docker-selenium
    - 3.141.59-mercury release
 
## 実行
```ruby

# 保存する場所の指定
path = EVN['HOME'] + "/test.png"

# スクリーンショット
driver.get(url)
w = driver.execute_script('return document.body.scrollWidth')
h = driver.execute_script('return document.body.scrollHeight')
driver.set_window_size(w, h)
driver.save_screenshot(path)

```
JavascriptでSQL整形マクロを作る

# はじめに
「ログに出力されたSQLを整形したいけど整形ツールが手元にない」、「社用PCだからダウンロードも勝手にできない」、ってことがよくあったので簡易的な整形ツールを作りました。
ただキーワードの前後で改行するだけのツールです。
インデント調整とか高度なことはできないです。

# 作った関数

```javascript:formatSql.js
function formatSql(text){
  // 改行するキーワード
  var array=["AND","FROM","FULL","GROUP","INNER","LEFT","ON","ORDER","RIGHT","SET","WHERE","VALUES"];

  // キーワード共通処理
  for(i=0; i<array.length; i++){
    var keyword = array[i];
    var after = " " + keyword + " ";

    // キーワード前後の半角スペースを1つだけにする
    text = text.replace(new RegExp(" +" + keyword + " +", "g"), after);

    // この時点でキーワード"   AND  "は" AND "になる

    // 改行する
    var afterRn = "\r\n" + after;
    text = text.replace(new RegExp(after, "g"), afterRn);
  }

  // SELECT：後ろ改行
  text = text.replace(/SELECT/g, "SELECT\r\n");

  // カンマ：前後のスペース削除
  text = text.replace(/( +,|, +| +, +)/g, ",");
  // カンマ：改行（前カンマ）
  text = text.replace(/,/g, "\r\n , ");

  // かっこ：改行
  text = text.replace(/\(/g, "(\r\n");
  text = text.replace(/\)/g, "\r\n)\r\n");

  return text;
}
```

# 使い方
- サクラエディタの場合
- ブラウザの場合


## サクラエディタの場合
1.  以下のスクリプトを共通設定のマクロに設定する。
2. 整形したい文字列を選択する。
3. ツールの登録済みマクロから設定したマクロを選択する。

```js:formatSql.js
function formatSql(text){
// 省略
}

var text = Editor.GetSelectedString(0);
if ( text !== "" ) Editor.InsText(formatSql(text));
```

ショートカットキーに登録するのもいいですね。


## ブラウザの場合
1. scriptタグに追加する。
2. ブラウザで開いてリロードする。

```html:formatSql.html
<script type="text/javascript">
function formatSql(text){
// 省略
}

var text="SELECT id , name FROM table1 WHERE key = ?";
text = formatSq(text);
document.write(text);
</script>
```

入力用テキストボックスを設けるのもいいですね。

# あとがき
以下の記事の一部だったものです。
コードが汚かったので改良しました。
⇒[新しい現場に入ったときメモ](https://qiita.com/atmospheri/items/c7cdf2e2721d44e6fe8c)
Pythonで空のリストを作るときの注意点

Pythonで空リストを作ったときに不思議なことに出会った。

いま、空のリストをN個もつようなリストをつくるとする。

このとき、以下の２つの方法がある。

```python:test.py
l1 = [[]] * N
l2 = [[] for _ in range(N)]
```

どちらも出力すると同じリストを作成しているように見える。

```python
>>> N = 10
>>> l1 = [[]] * N
>>> l2 = [[] for _ in range(N)]
>>> print(l1)
[[], [], [], [], [], [], [], [], [], []]
>>> print(l2)
[[], [], [], [], [], [], [], [], [], []]
```

しかし、要素をappendした際に違う挙動を示す。
それぞれのindex = 0 の要素に[1,2]をappendしてみよう。

```python
>>> l1[0].append([1,2])
>>> l2[0].append([1,2])
>>> print(l1)
[[[1, 2]], [[1, 2]], [[1, 2]], [[1, 2]], [[1, 2]], [[1, 2]], [[1, 2]], [[1, 2]], [[1, 2]], [[1, 2]]]
>>> print(l2)
[[[1, 2]], [], [], [], [], [], [], [], [], []]
```

l1 ではすべての要素に対してappendが効いている。
どうやら、append等の操作ではコピー元の要素に対しても更新が及んでしまうらしい。

こうしたややこしいことがあるので、空の配列を作るときは

```python
l = [[] for _ in range(N)]
```

とするのが無難ですね。
Any型の配列のデータ削除方法


フリーランスの永田です。

今年は御茶ノ水で、iOSのアプリ開発をしています。

2月は忙しく、会社の隣にマンションを借りて、週７勤務をしました。
午後にお呼びがかかり、今週も週7でした。 自宅でも日夜技術レベルの向上に努めているのでアウトプットもしています。

最近のアウトプット、最新ソースでは動画トリミングの機能を追加しています。
https://github.com/daisukenagata/SliderView
挙動はこちら
https://twitter.com/dbank0208/status/1112172462777655296?s=20

Any型の配列のデータ削除方法が世の中に一つも情報としてなかったので共有します。
自分で考えました。

#Structの配列

データを持ち回す時は構造体にする場合があると思います。
配列で要素名を指定出来たらいいなと思い、今回の実装を紹介します。


### 構造体のデータのあり、なしで、配列をクリアーする場合に
この方法ですと処理は要素１しか知らないので、要素の中身が違う場合に困りますね。

```
sampleAny?.remove(at: 1)
```



String型などでしたら、この方法で要素を指定して、消せます。

```
strArray.remove(at: strArray.index(of: "A")
```


Arrayの場合はSwift4まではEquatableで拡張クラスの対応でいけたと思います。


## 対応方法   

Anyからcastメソッドで、指定の構造体にキャストします。 

構造体のデータが空だったらクリアーするという処理。 
構造体abc1を指定してabc1のデータチェックができます。
sampleAny?.removeFirst()の部分は
sampleAny.remove(at: i)などして、該当するabc1()をクリアーできますが、
配列に2つ以上ある場合はFilter関数,contains関数などの対応が必要です。

```
struct abc1 { 
 var abc = Int()
}

var sampleAny: [Any]? = []
sampleAny = [abc1(), abc3(), abc3(), abc1(), abc2(), abc3()]

let abc = abc1()

// ケースで応用
for (_, b) in sampleAny!.enumerated() {
   if abc.abc.description.isEmpty {
      if cast(value: b, type: abc1.self) != nil { sampleAny?.removeFirst() }
   }
}

func cast<A>(value: Any?, type: A.Type) -> A? { return value as? A }
```

以上、記録に残しました。
USB3.0とは？

参考サイト:
https://www.fe-siken.com/kakomon/30_aki/q12.html

#USB3.0とは？
現在最も普及している周辺機器接続のためのシリアルインターフェイスのバージョン3に当たる規格。

#USB2.0との違い
最も特徴的なのが最大転送速度。
2.0では<font color="Red">480Mbps</font>が最大。
3.0では<font color="Red">5Gbps</font>が最大。

#見た目について
コネクタ内部が<font color="blue">青色</font>になっているものが、USB3.0。
PCに2.0と3.0、2種類のコネクタ搭載されてある場合も多いよね。
色違うけど何が違うんだ？……と気になってた方はご参考までに
AWS EC2でPHP7.2 インストール

# 概要
- AWSの無料枠の範囲内でサーバを立ててみる
- 元インフラの卵兼駆け出しエンジニアが作ってみます
- swap までは、[こちら](https://qiita.com/PKunito/items/31445d4475d4e18fe4d7)を参考にしました
- PHP7.2のインストールは[こちら](https://qiita.com/thimi0412/items/9df65e626e8df2029df5)を参考にしました
 
# やったこと
- EC2のサーバがたったら、yum update でアップデートを実行する
- 時刻をJSTに変更する
- swap を設定
- remi の追加
- PHP7.2 のインストール

# アップデート
```
$ sudo yum update
```
EC2 のサーバに入っている色々なものがアップデートされます

# 時刻をJSTに変換する
```
$ date
2019年  3月 31日 日曜日 23:55:57 UTC
```
最初は [UTC] なので [JST]へ変更する

```
$ timedatectl set-timezone Asia/Tokyo
```

このコマンドを実行し、確認

```
$ date
2019年  4月  1日 月曜日 00:01:23 JST
```

JSTにになっていればOK

# swap の設定
- EC2には、swap が設定されておらず Laravel インストール時に t2-minerだとメモリ不足になり、エラーになるらしい！
- swap の状況確認

```
$ grep Mem /proc/meminfo
$ grep Swap /proc/meminfo
$ free
```

- 512MBのswap の作成

```
$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
```

- 確認

```
$ ll /swapfile1
-rw-r--r-- 1 root root 536870912  3月 31 22:40 /swapfile1
```

- swapファイルの権限を変更し、フォーマット

```
$ sudo chmod 600 /swapfile1
$ sudo mkswap /swapfile1
```

-swapファイルを有効化

```
$ sudo swapon /swapfile1
$ $ sudo swapon -s
```

- 再起動でswapファイルが反映するように設定

```
$ sudo cp -p /etc/fstab /etc/fstab.org
$ sudo sh -c "echo '/swapfile1 swap swap defaults 0 0' >> /etc/fstab"
$ cat /etc/fstab
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
/swapfile1  swap        swap    defaults        0   0
```

- swap が設定できたか確認

```
$ grep Mem /proc/meminfo
MemTotal:        1007252 kB
MemFree:          410276 kB
MemAvailable:     777436 kB
$ grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:        524284 kB
SwapFree:         524284 kB
$ free
              total        used        free      shared  buff/cache   available
Mem:        1007252       53744      410268         396      543240      777444
Swap:        524284           0      524284
```


# remi 追加
```
$ sudo wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo rpm -ivh epel-release-latest-7.noarch.rpm
$ sudo yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum-config-manager --enable remi-php72
```
※ ```sudo yum install php``` とするとphp5 が入ってしまう!!

# php7.2 インストール
```
$ sudo yum install -y php72 php72-php php72-php-fpm
$ sudo ln -s /usr/bin/php72 /usr/bin/php
```
- ```sudo ln -s /usr/bin/php72 /usr/bin/php```を実行することで、```php -v```でバージョン確認が出来る
※ これを実行しない場合は、```php72 -v```で確認できます

```
$ php -v
PHP 7.2.16 (cli) (built: Mar  5 2019 13:10:50) ( NTS )
Copyright (c) 1997-2018 The PHP Group
```

php-fpm 有効化


- ```ln``` コマンドって？
これは、[php72]ではなく［php］で動作させるため、リンクさせるためのコマンドです。
[こちら](https://qiita.com/0084ken/items/6f39498c86fb592b2baf)に使い方がありました。

# おわり
次回は、[WEBサーバのインストール](https://qiita.com/snowdog/items/d0d6875f91bfc8792fc0)です。

linuxコマンド、知らないものがたくさんあるので、少しずつ覚えていきたいです。
コマンド不慣れなので、linuxコマンド調べつつです。
pybind11入門(4) NumPy連携その2

その1 https://qiita.com/lucidfrontier45/items/872c38b5eec08e3800d7
その2 https://qiita.com/lucidfrontier45/items/c7cc409a3af962d100a3
その3 https://qiita.com/lucidfrontier45/items/183526df954c1d6580ba

pybind11を使ってNumPyと連携する方法を試した。今回はEigenを利用してみる。

# 環境準備

pybind11とEigenをそれぞれgithubなりから取得し、プロジェクトのトップディレクトリに置く。その後、以下のようにCMakeLists.txtを用意する。

```cmake
cmake_minimum_required(VERSION 3.2)
project(pybind_test VERSION 0.1.0)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
add_subdirectory(pybind11)
include_directories(eigen)

pybind11_add_module(mymodule module.cpp)
```

# コード

## おまじない部分

```c++
#include <iostream>
#include <pybind11/eigen.h>
#include <Eigen/Dense>

template <typename T>
using RMatrix = Eigen::Matrix<T, -1, -1, Eigen::RowMajor>;
```

pybind11にはEigenを自動でNumpyのndarrayに変換する機能がある。これを使用するためには`pybind11/eigen.h`をincludeする必要がある。また、ndarrayはメモリ配置がデフォルトではC言語で主に用いられるRowMajorなのに対し、EigenではデフォルトはfortranのColumnMajorである。ただ、両者とも指定することができるのでここではndarrayのRowMajorに揃える。毎回RowMajorを宣言するのも面倒なので`RMatrix`というテンプレートクラスを作っておく。


## ndarrayをEigenの行列に変換

最も簡単な方法は値渡し利用する方法である。この方法を用いるとndarrayの内容がEigenのmatrixにコピーされる。

```c++
template <typename T>
void print_array(RMatrix<T> m)
{
    std::cout << m << std::endl;
}
```

## ndarrayを生成する

Eigenのmatrixなどを戻り値に持つ関数を作れば自動的にndarrayに変換される。しかも新しくコピーを作るのではなく、Eigenのmatrixのメモリをそのまま利用する。賢いぞpybind11!

```c++
template <typename T>
RMatrix<T> modify_array(RMatrix<T> m, T a)
{
    return m * a;
}
```

## ndarrayを書き換える。

`Eigen::Ref`を使用することで参照渡しができる。この方法を用いるとコピーが作成されず、`Eigen::Map`を利用してndarrayのメモリ領域を直接Eigenからいじることができる。なお、この方法を使用する場合は型やメモリ配置(RowMajor, ColumnMajor)が完全に一致していることが必須条件になる。

```c++
template <typename T>
void modify_array_inplace(Eigen::Ref<RMatrix<T>> m, T a)
{
    m = m * a;
}
```

なお、`Eigen::Ref<const RMatrix<T>>`のように渡すことで読み取り専用の参照渡しになる。大きな行列を渡す場合などはコピーも大きなオーバーヘッドになるので特別な理由がない場合は常にこの方法で渡すのがいいだろう。

## 登録

いつも通り

```c++
PYBIND11_MODULE(mymodule, m)
{
    m.doc() = "my test module";
    m.def("print_array", &print_array<double>, "");
    m.def("modify_array", &modify_array<double>, "");
    m.def("modify_array_inplace", &modify_array_inplace<double>, "");
}
```

# 実際に試す

```py
import numpy as np
import mymodule


x = np.arange(12).reshape(3, 4).astype(np.float64)
print("created with numpy")
print(x)
print()

print("using pybind11 to print")
mymodule.print_array(x)
print()

x2 = mymodule.modify_array(x, 2.0)
print("x2 newly created with pybind11")
print(x2)
print()

mymodule.modify_array_inplace(x, 3.0)
print("x modified inplace")
print(x)

>>>
created with numpy
[[ 0.  1.  2.  3.]
 [ 4.  5.  6.  7.]
 [ 8.  9. 10. 11.]]

using pybind11 to print
 0  1  2  3
 4  5  6  7
 8  9 10 11

x2 newly created with pybind11
[[ 0.  2.  4.  6.]
 [ 8. 10. 12. 14.]
 [16. 18. 20. 22.]]

x modified inplace
[[ 0.  3.  6.  9.]
 [12. 15. 18. 21.]
 [24. 27. 30. 33.]]
```
PHPのFWの一つ、Laravelを勉強してみた

当記事は絶対に挫折させないアプリ開発　はじめてのLaravel（https://booth.pm/ja/items/1054217）
のメモ書きですのでオリジナリティはありませんのでご了承ください。

### はじめに
こちらは2019年に書いた記事で、何故か限定公開になってましたので公開いたしました
Laravelを使い始めてはや3年になります
時間の流れは早いですねぇ

# Laravelとは何か

### フレームワークとは
```
フレームワークは簡単にいうと、アプリケーションの土台となるライブラリです。
フレームワークを使った開発ではアプリケーションの基本的な流れが最初から出来上がっており、
その流れの中に必要に合わせて処理を組み込んでいきます。
フレームワークが用意されていれば、アプリケーションを作成するときに無駄な処理を記述せず
本当に必要な処理を注力できる。 パーフェクトPHP p.198
```

##### アプリ実装の労力の軽減
データベースやログインなど、どのアプリケーションでも共通利用する処理や機能
をあらかじめ土台として用意しておくことで、開発者の労力を軽減し、本来力を入れて
取り組むべき実装に集中することができます。

##### 保守性、可読性の向上
フレームワークによってある程度の土台があらかじめ決められているため、
変更の加えやすさや再利用性が高まり、保守性と可読性の向上につながります。

##### 実装の均質化
フレームワークによって定められたコーディング規則に従うことで、複数人が関わる開発現場
でもある程度実装が均質化し、開発効率の向上が期待できます。
PHPはコーディングや設計の自由度が高いため、チーム開発で各々が俺流で実装を始めると
一貫性のないシステムが出来上がってしまいます。

### フレームワークとオブジェクト指向
```
フレームワークを使うにあたって、もはやオブジェクト指向は欠かせません。
オブジェクト指向とは簡単にいうと、様々な機能などをオブジェクトと呼ばれるまとまりとして扱う手法を指します。
公開されているPHPフレームワークのほとんどはオブジェクト指向で記述されています。
オブジェクトの差し替えや継承を行うことでフレームワークの拡張も可能になります、
作りたいアプリケーションに必要なロジック（これをビジネスロジックと呼びます）を記述する際も、
基本的な機能をまとめたオブジェクトを継承することで開発がぐっと楽になります。　パーフェクトPHP p.199
```

### MVCモデルとは
```
アプリケーションを、モデル（Model）/ビュー（View）/コントローラ（Controller）という３つの大きな役割
にわけて実装を行うというアーキテクチャです
```

#### モデル

```
アプリケーションのビジネスロジックを担うのがモデルです。Webアプリケーションでは主に、
データベースへアクセスしてデータの取得や変更を行う機能をモデルに記述します。
```
ビジネスロジックとは、「システム固有の処理」を意味します。
データベースへの接続を前提しないアプリケーションはほぼ存在しないはずであり、
各アプリケーションはそれぞれに固有のデータベース処理があります。
その固有の処理を「ビジネスロジック」と呼んでいます。

#### ビュー
```
出力を担うのがビューです。Webアプリケーションでは主にHTMLを出力しますので、
ビューではHTMLの組み立てや情報の出力を行います。
```

ビュはその名の通り画面表示（HTML部分）を担当します。
コントローラがもで絵うからデータを受け取り、それをビューにさらに渡すことで利用者が見える形で
HTML上に展開されます。

#### コントローラ
```
ユーザーのリクエストを制御し、モデルから情報を取得してビューに橋渡しするのがコントローラです。
```
モデルやビューを制御する役割を果たします。

#### ルーラー
ルーターは入力されたURLに応じてしかるべき場所へ案内し、コントローラへ処理を引き渡します。

### Laravelとは
#### ブームまでの道のり
##### プロジェクトの開始
```
Laravelは開発者のTayloor Otwell氏により、遊びのつもりで開始されたMITライセンスの
オープンソースプロジェクトです。
彼の感じていた、他のPHPフレームワークの使いにくさを解決するために開発されました
```

##### ブームの時
```
Laravelが広く知られるようになったのはバージョン３からですが、2012年始めのリリース直後には
それほど話題になっていません。
Laravelは私をばかにしませんでしたという記事が火種となってブームになりました。
そのあとの数ヶ月間、この記事へリンクする検索結果が増え続け、
関連してフォーラムもどんどん利用者が増えました。
記事がユーザーを呼び込み、Laravelのブームが始まったのです。
```

### まとめ
Laravelは1人の開発者によって作られ、世に広がりました。
基本的なMVCやオブジェクト指向という概念はあるもののディレクトリ構造や記述方法が特殊なので
詳細は今後の記事にて紹介したいと思います。
論文：BEGAN: Boundary Equilibrium Generative Adversarial Networks を読んだときのメモ

# はじめに
BEGAN: Boundary Equilibrium Generative Adversarial Networks を読んだときのメモです。
正確なところは原文をお願いします。<(_ _)>
https://arxiv.org/abs/1703.10717

# 論文の概要
* Discriminatorとしてオートエンコーダを使用するGANの提案
* 下記の特徴を持つ
    * GeneratorとDiscriminatorの学習のバランスを取ることが可能
    * 収束判定が可能
    * シンプルだが堅牢なアーキテクチャにより、素早く安定的に収束させることが可能
    * 生成される画像の多様性と精度の両立が可能

# 背景
* GANの課題
    * 適切なハイパーパラメータ設定が重要
    * 画像の多様性の制御が難しい
    * GeneratorとDiscriminatorの収束のバランスを取るのが難しい
    * 学習の初期に、Discriminatorが簡単に勝ってしまいがち
        * model collapse:Generatorが単一の画像しか生成できなくなる

# 提案手法
## 概要
* Discriminatorに分類機ではなくCAE（Convolutional AutoEncoder）を使っている
* Generator: Discriminatorの再構成誤差が小さくなるように学習
* Discriminator: CAE(Encoder + Decoder) 実際の画像については再構成誤差が小さくなるように学習。Generatorによって生成された画像については、逆に再構成誤差が大きくなるように学習。
 
![BEGAN01.png](https://qiita-image-store.s3.amazonaws.com/0/92368/3c88f915-369e-ca2a-54f4-4b0e49608ac0.png)
（以下、この3つの式を解説）

## 損失関数❶
* Ld: Discriminatorに対する損失関数
* DiscriminatorはLdが小さくなるように学習する。
* ktが小さい場合、L(x)を重視。->BEGANはこのktを数式に従って自動的に調整する。
* 式補足
    * x: 実際の画像
    * L(x): 実際の画像の再構成誤差
    * z: ランダムなベクトル
    * G(z): Generatorの出力
    * L(G(z)): Generatorによって生成された画像の再構成誤差
    * kt: L(x)とL(G(z))のどちらを重視するか

## 損失関数❷
* Lg: Generatorに対する損失関数
* Generatorにより生成された画像をDiscriminatorに入れた際の再構成誤差
* GeneratorはLgが小さくなるように学習する
* 式補足
    * L(G(z)): Generatorによって生成された画像の再構成誤差

## 損失関数❸
* kt: L(x)とL(G(z))のどちらを重視するか->GとDのバランスを取る
* λが小さい場合->λL(x)-L(G(z))が負になる（なりやすくなる）->ktは小さくなる->実際の画像を重視。精度は上がるが多様性はなくなりがち。

## 収束判定
* 実際の画像の再構成誤差が小さいことと、λL(x)-L(G(z))が0に近い（ktが一定になって落ち着く）ことで判定
![BEGAN02.png](https://qiita-image-store.s3.amazonaws.com/0/92368/8c349d76-c6bc-aa7f-2f69-0a84dc6264d4.png)
![BEGAN03.png](https://qiita-image-store.s3.amazonaws.com/0/92368/e69254b0-2bf4-9f4c-80fd-3d396094946d.png)

## モデル定義
* オートエンコーダを利用
* ストライド2の畳み込みでマップサイズを小さく
* 活性化関数はELU
* GeneratorとDiscriminatorのDecoderは同じ構造だが重みは共有しない
![BEGAN04.png](https://qiita-image-store.s3.amazonaws.com/0/92368/477a6463-551e-32be-3099-f78f292ebd09.png)

# おわりに
ソースはネット上に色々落ちているので動かしましたが、だいたい論文と同じくらいのGlobal Stepで（10万くらいで）いい感じになりました。
mongo-express Advancedな検索窓の使い方

[@koshi_life](https://twitter.com/koshi_life) です。

[mongo-express](https://github.com/mongo-express/mongo-express) の Advanced 検索窓 使い方の備忘録です。mongo-expressでは、RDBMSでいうテーブルにあたるコレクションに対してWeb画面でクエリを投げてデータの中身を確認することができます。

## Simple検索窓

<img width="600" alt="simple.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/5c58fa77-5a7c-3cf9-d13a-523b88caa4e6.png">

1fieldに対する値検索や正規表現での検索は、「Simple」という検索窓で直感的にデータを確かめられてとても便利です。

## Advanced 検索窓

<img width="600" alt="advanced.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/2bba8289-4660-65a1-bd52-a1a5807d9984.png">

複数条件での検索したい時は「Simple」検索窓ではできないため、右側のタブの「Advanced」の検索機能を利用します。ただ、このテキストエリアの `Query`(クエリ), `Projection`(射影) にどんな形式で指定すればよいかわかりませんでした。[^1]
以下 [README.md](https://github.com/mongo-express/mongo-express/blob/master/README.md#search) より引用。

>Advanced search passes the find and projection fields/objects straight into MongoDB db.collection.find(query, projection). The find object is where your query happens, while the projection object determines which columns are returned.
>
>See [MongoDB db.collection.find()](https://docs.mongodb.com/manual/reference/method/db.collection.find/) documentation for examples and exact usage.

要は、 `db.collection.find(query, projection)` の形式で書けるぜってことなので２例ほど書いてみる。

[^1]: この [Issue](https://github.com/mongo-express/mongo-express/issues/200) でREADME.md に Advanced search の使い方が記載されたとのこと。確かに見ればわかるがPlaceholderに記載あると嬉しいな。

## 例

|No|Query|Projection|こんな内容|
|:--|:--|:--|:--|
|1|```{"status": 1, "access_token": {$ne: ""}}```|```{_id: 0, "email":1}```|クエリ：`status`=="1" AND `access_token` NOT 空 、表示列は `email` だけ。|
|2|```{"created_at": { $gte: "2019/03/01 0:00:00", $lt: "2019/04/01 0:00:00" } }```|```(空)```|3月中に作成されたレコード一覧。列は全て。|



### 参考

- [3分で導入できる MongoDB データ可視化ツール mongo-express](https://qiita.com/koshilife/items/dcc2b17e4c880d65ba78)
- [mongo-express で複数DBを見る方法](https://qiita.com/koshilife/items/2073629778d853544f08)
C++を使いながらHaskell学習

備忘録も兼ねて ٩(ˊᗜˋ*)و.
##配列の中の数を足す
``````C++:hairetsuplus.cpp
#include<iostream>
#include<vector>
using namespace std;

int main(){
	vector<int> xs{1,2,3};
	vector<int> ys;
	for(auto x:xs){
		ys.emplace_back(x+10);
	}
	
	for(auto y:ys){
		cout<<y<<endl;
	}
}
```
11
12
13

``````Haskell:hairetsuplus.hs
main = print $ map(+10)[1,2,3]
```
[11,12,13]
##配列の合計値を算出
``````C++:wa.cpp
#include<iostream>
#include<vector>
using namespace std;

int main(){
	vector<int> xs{1,2,3};
	int total = 0;
	for(auto x:xs){
		total += x;
	}
	cout<<total<<endl;
}
```
6

``````Haskell:wa.hs
main = print $ foldr (+) 0 [1,2,3]
```
6

##配列のある数字以上の数を取り出す
``````C++:bignumberinsert.cpp
#include<iostream>
#include<vector>
using namespace std;

int main(){
    vector<int> xs{1,2,3,4,5,6};
    vector<int> ys;
    for(auto x:xs){
        if(x>3){
            ys.emplace_back(x);
        }
    }   

    for(auto y:ys){
        cout<<y<<endl;
    }
}
```
4
5
6

``````Haskell:bignumberinsert.hs
main = print $ filter(>3)[1,2,3,4,5,6]
```
[4,5,6]

##関数をかけあわせる
``````C++:kansuu.cpp
#include<iostream>
#include<vector>
using namespace std;

int f(int x){return x+10;}

int g(int x){return x*x;}

int main(){
	vector<int>xs{1,2,3};
	vector<int>ys;
	for(auto x:xs){
		ys.emplace_back(g(f(x)));
	}
	
	for(auto y:ys){
		cout<<y<<endl;
	}
}
```
121
144
169

``````Haskell:kansuu.hs
f x = x+10

g x = x * x

main = print $ map(g.f)[1,2,3]
```
[121,144,169]
割り込み処理とは？

参考サイト:
https://www.fe-siken.com/kakomon/30_aki/q10.html

#割込み処理とは？
すぐに対処しなくてはならない問題などがシステムに生じたときに、実行中のプログラムの処理をいったん停止し、優先的に事象の解決を図ることを可能にする仕組みのこと。

#割込み処理の手順
##1. ユーザモードから特権モードへの移行
割込みが発生すると自動的に特権モード(スーパバイザモード)に切り替わる。
##2. プログラムレジスタ(プログラムカウンタ)などの退避
割込み処理終了後にもとの命令位置に戻れるように<font color="Red">現在のプログラムカウンタの値をスタックに退避させる</font>。
##3. 割込み処理ルーチンの開始番地の決定
所定の割込み処理の開始アドレスを取得して、プログラムカウンタにセットする。
##4. 割込み処理ルーチンの実行
所定の割込み処理

#まとめ
割込み処理って言葉自体の意味は書いてそのまんまだし、SFチックなアニメとかで使われてたりするから、別に覚えるのは難しくないけど、手順についてもしっかり覚えるようにしましょう。
特に<font color="Red">赤文字</font>部分に関しては、基本情報技術者試験で問われたりもするので……